Я отредактировал свой вопрос относительно того, как это меня смущает.

имаю, что в сборке 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-битные? Почему или почему нет?

Ответы на вопрос(5)

Ваш ответ на вопрос