Assembly – instruction js versus ja

Le but est donc d’écrire le code C correspondant à cet assemblage:

0: 85 f6 test %esi,%esi 2: 78 13 js 17  4: 83 fe 07 cmp $0x7,%esi 7: 77 14 ja 1d  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 

Je suis un peu confus parce que la première boucle testant le registre% esi se termine avant la fin de la seconde boucle.

La deuxième instruction if compare-t-elle% esi à 7 dans la première boucle? ou est-ce un si, sinon si la situation ??

    Laissez-moi résumer, ce qui a déjà été dit

     0: 85 f6 test %esi,%esi 2: 78 13 js 17  

    c’est “si (esi <0) goto 17;"

     4: 83 fe 07 cmp $0x7,%esi 7: 77 14 ja 1d  

    c’est “si (esi> 7) goto 1d;”

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

    “cx = 8 * rsi” // pas si évident que c’est “juste” une multiplication)

     10: 48 d3 ff sar %cl,%rdi 

    rdi >> cl; // pas cx, mais cx est sûr d’être <= 7 * 8, donc c'est le même 13: 48 89 f8 mov% rdi,% rax 16: c3 retq

    retour rdi;

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

    17: “retourne 0”

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

    1d: un autre “retour 0”

    le code C est donc:

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

    PS: les 2 “retours 0” (17 et 1d) indiquent clairement que, dans le code C, les deux if s n’étaient PAS combinés en un
    PSS: le code C n’a évidemment pas été compilé avec optimisation: P