Я отредактировал свой вопрос относительно того, как это меня смущает.
имаю, что в сборке x86_64 есть, например, (64-битный) регистр rax, но он также может быть доступен как 32-битный регистр, eax, 16-битный, топор и 8-битный, al. В какой ситуации я не просто использовал бы полные 64 бита, и почему, какое бы это было преимущество?
Как пример, с этой простой программой hello world:
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 и rdx, по крайней мере, нужны только 8 бит, а не 64, верно? Но если я изменю их на dil и dl соответственно (их младшие 8-битные эквиваленты), программа собирает и связывает, но ничего не выводит.
Тем не менее, это все еще работает, если я использую eax, edi и edx, так что я должен использовать их, а не полные 64-битные? Почему или почему нет?