64-битная сборка, когда для использования регистров меньшего размера

Я понимаю, что в сборке x86_64 есть, например, (64-битный) регистр rax, но он также может быть доступен как 32-битный регистр, eax, 16 бит, ax, и 8 бит, др. В какой ситуации я бы не стал использовать только полные 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-битные? Почему или почему нет?

8
задан mk12 5 July 2011 в 23:00
поделиться