Entiendo que en el ensamblaje x86_64 existe, por ejemplo, el registro de rax (64 bit), pero también se puede acceder como un registro de 32 bits, eax, 16 bit, ax y 8 bit, al. ¿En qué situación no usaría solo los 64 bits completos, y por qué, qué ventaja habría?ensamblado de 64 bits, cuándo utilizar registros de tamaño más pequeño
A modo de ejemplo, con este sencillo programa hola mundo:
section .data
msg: db "Hello World!", 0x0a, 0x00
len: equ $-msg
section .text
global start
start:
mov rax, 0x2000004 ; System call write = 4
mov rdi, 1 ; Write to standard out = 1
mov rsi, msg ; The address of hello_world string
mov rdx, len ; The size to write
syscall ; Invoke the kernel
mov rax, 0x2000001 ; System call number for exit = 1
mov rdi, 0 ; Exit success = 0
syscall ; Invoke the kernel
RDI y RDX, al menos, sólo necesita 8 bits y no 64, ¿verdad? Pero si los cambio a dil y dl, respectivamente (sus equivalentes inferiores de 8 bits), el programa se ensambla y se vincula, pero no genera nada.
Sin embargo, todavía funciona si uso eax, edi y edx, entonces ¿debería usar esos en lugar de los 64 bits completos? ¿Por qué o por qué no?
En realidad, en Linux (¿y probablemente todo lo demás?) Los parámetros de un syscall son de 32 bits de ancho, por lo que debe usar EDI y EDX. http://www.win.tue.nl/~aeb/linux/lk/lk-4.html#ss4.3 –
¿qué pasa con rax, debería cambiar eso a eax también?Traté de cambiar esos 3 y funciona, pero lo que quiero saber es por qué debería hacer esto y cuál es la ventaja. – mk12
En el caso de este programa, la única diferencia apreciable es que los valores literales (4, 1, 0, etc.) son dos veces más grandes cuando son de 64 bits, por lo que su programa tendrá unos bytes más grandes y, en teoría, podría tomar más tiempo cargar en la CPU desde el disco/memoria. –