3 votes

Instruction XOR en assembleur

J'essaie de comprendre la version désassemblée de ce programme :

#include <stdio.h>

int main(){
   int i=0;
   printf("HELLO VIK");
   return 0;
}

désassemblage gdb :

(gdb) disass main
Dump of assembler code for function main:
0x0000000100000ef0 <main+0>:    push   rbp
0x0000000100000ef1 <main+1>:    mov    rbp,rsp
0x0000000100000ef4 <main+4>:    sub    rsp,0x10
0x0000000100000ef8 <main+8>:    mov    DWORD PTR [rbp-0xc],0x0
0x0000000100000eff <main+15>:   xor    al,al
0x0000000100000f01 <main+17>:   lea    rcx,[rip+0x50]        # 0x100000f58
0x0000000100000f08 <main+24>:   mov    rdi,rcx
0x0000000100000f0b <main+27>:   call   0x100000f2c <dyld_stub_printf>
0x0000000100000f10 <main+32>:   mov    DWORD PTR [rbp-0x8],0x0
0x0000000100000f17 <main+39>:   mov    eax,DWORD PTR [rbp-0x8]
0x0000000100000f1a <main+42>:   mov    DWORD PTR [rbp-0x4],eax
0x0000000100000f1d <main+45>:   mov    eax,DWORD PTR [rbp-0x4]
0x0000000100000f20 <main+48>:   add    rsp,0x10
0x0000000100000f24 <main+52>:   pop    rbp
0x0000000100000f25 <main+53>:   ret

Si je comprends bien les 3 premières lignes, le pointeur de base est poussé sur la pile comme adresse de retour. Ensuite, le pointeur de base est mis à la place du pointeur de pile actuel. La taille de la pile est fixée à 16 octets (x10). La taille de l'int i est de 12 octets (0xc) et est fixé à 0. Je ne suis pas sûr de ce que fait (xor al, al). Ai-je bien compris ? Que fait la ligne xor al, al ?

5voto

Marc B Points 195501

xor al,al est un moyen rapide de mettre à zéro un registre. C'est un code d'opération d'un octet dans l'assembleur x86, contre 2 octets pour le code d'opération de mov al, 0 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X