I understand that the assembly x86_64 has, for example, a (64-bit) rax register, but it can also be obtained as a 32-bit register, eax, 16 bits, ax and 8 bits, al. In what situation would I not just use the full 64 bits and why, what would be the advantage?
As an example, with this simple global welcome program:
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 and rdx at least only need 8 bits, not 64, right? But if I change them to dil and dl, respectively (their lower 8-bit equivalents), the program collects and binds, but does not output anything.
However, it still works if I use eax, edi and edx, so should I use them, and not the full 64-bit ones? Why or why not?