2016-04-02 9 views
0

Das Ziel ist also für mich den C-Code zu schreiben, das zu dieser Baugruppe entspricht:Assembly - js im Vergleich ja Anweisung

0: 85 f6     test %esi,%esi 
2: 78 13     js  17 <part3+0x17> 
4: 83 fe 07    cmp $0x7,%esi 
7: 77 14     ja  1d <part3+0x1d> 
9: 8d 0c f5 00 00 00 00 lea 0x0(,%rsi,8),%ecx 
10: 48 d3 ff    sar %cl,%rdi 
13: 48 89 f8    mov %rdi,%rax 
16: c3      retq 
17: b8 00 00 00 00   mov $0x0,%eax 
1c: c3      retq 
1d: b8 00 00 00 00   mov $0x0,%eax 
22: c3      retq 

Ich bin ein wenig verwirrt, weil die erste Schleife das% esi Registers Prüfung endet vor die zweite Schleife endet.

Ist die zweite if-Anweisung, die% esi mit 7 innerhalb der ersten Schleife vergleicht? oder ist das ein wenn, sonst wenn situation ??

+1

Ich sehe keine Schleife überall. Ja, es ist 'if' /' else if'. Natürlich ist alles, was du zurückbringst, du brauchst das "else" nicht. – Jester

+1

'if (esi < 0 || esi > 7) zurück 0; zurück (int64_t) rdi >> (8 * esi); '? – EOF

+1

Fun Tatsache: da beide Fälle das gleiche tun ('return 0'), und' ja' '' js' enthält, können Sie einfach 'js' ignorieren. – Jester

Antwort

2

Lassen Sie mich zusammenfassen, was bereits gesagt worden

0: 85 f6     test %esi,%esi 
2: 78 13     js  17 <part3+0x17> 

dies "if (esi < 0) gehe zu 17;"

4: 83 fe 07    cmp $0x7,%esi 
7: 77 14     ja  1d <part3+0x1d> 

dieses "if (esi> 7) goto 1d; "

9: 8d 0c f5 00 00 00 00 lea 0x0(,%rsi,8),%ecx 

"cx = 8 * rsi" // nicht so offensichtlich es ist "nur" eine Multiplikation)

10: 48 d3 ff    sar %cl,%rdi 

rdi >> cl; // nicht cx, cx aber sicher < = 7 * 8 sein, so dass der gleiche 13 ist: 48 89% f8 mov RDI,% Rax 16: c3 retq

return RDI;

17: b8 00 00 00 00   mov $0x0,%eax 
1c: c3      retq 

17: "return 0"

1d: b8 00 00 00 00   mov $0x0,%eax 
22: c3      retq 

1d: Noch ein "return 0"

so C-Code ist:

{ 
    if (esi < 0) return 0; 
    if (esi > 7) return 0; 
    return rdi >> (8 * rsi); 
} 

PS: Die 2 " return 0 "(17 und 1d) geben einen klaren Hinweis, dass im C-Code die beiden if s NICHT zu einem
zusammengefasst wurdenPSS: der C-Code war offensichtlich nicht kompiliert mit Optimierung: P

Verwandte Themen