DIFFERENTES TAILLES La plupart des opérations ont des variantes en différentes tailles, par exemple movb, movw, movl, movq. La signification est donnée par le dernier caractère: b byte 1 octet w word 2 octets l long 4 octets q quad 8 octets De la même façon les registres (64bits) peuvent être utilisés pour désigner/stocker de plus petites valeurs. Par exemple, %rax est un registre 64 bits, %eax désigne ses 32 premiers bits, %ax ses 16 premiers bits, %ah le 2e octet et %al le 1er octet. Ci-dessous la table de correspondance complète: q l w b b ---------------------- rax eax ax ah al rbx ebx bx bh bl rcx ecx cx ch cl rdx edx dx dh dl rsi esi si sil rdi edi di dil rbp ebp bp bpl rsp esp sp spl r8 r8d r8w r8b r9 r9d r9w r9b r10 r10d r10w r10b r11 r11d r11w r11b r12 r12d r12w r12b r13 r13d r13w r13b r14 r14d r14w r14b r15 r15d r15w r15b Les opérations 32 bits sont implicitement étendues (par des 0) en opérations 64 bits. Pour les autres, seule la partie concernée du registre est lue/modifiée. CONVENTION D'APPEL SOUS LINUX Stack pointer RSP, must be aligned on 16 bytes. Return address on top of stack. Arguments passed in RDI, RSI, RDX, RCX, R8, R9, then on the stack, with the last argument being pushed first. Return value to be put in RAX. Beginning of current stack frame typically in RBP. RBP, RBX, and R12-R15 are callee-save registers; others must be saved by caller if value should be preserved. Voir FAQ pour les détails concernant la taille des valeurs passées. INSTRUCTIONS Les instructions 32 bits sont disponibles, cf. http://www.lsv.ens-cachan.fr/~goubault/CoursProgrammation/td_prog2.pdf On a aussi leurs équivalents 64 bits, par exemple movq pour faire un move 64 bits, pushq, popq, etc. MISC x86-64 est little-endian: l'octet de poids faible arrive d'abord, i.e. aux plus petites adresse. 0x11223344 est stocké "inversé" en mémoire: 0x44 à la plus petite adresse, puis 0x33, 0x22 et 0x11