Tôi hiểu trong assembly x86_64, ví dụ như đăng ký rax (64 bit), nhưng nó cũng có thể được truy cập như đăng ký 32 bit, eax, 16 bit, axe, và 8 bit, al. Trong tình huống nào tôi sẽ không chỉ sử dụng 64 bit đầy đủ, và tại sao, lợi thế nào sẽ có?Lắp ráp 64 bit, khi sử dụng thanh ghi kích thước nhỏ hơn
Như một ví dụ, với chương trình này đơn giản 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 và RDX, ít nhất, chỉ cần 8 bit và không 64, phải không? Nhưng nếu tôi thay đổi chúng để pha loãng và dl, tương ứng (thấp hơn tương đương 8-bit của họ), chương trình lắp ráp và liên kết nhưng không sản xuất bất cứ điều gì.
Tuy nhiên, nó vẫn hoạt động nếu tôi sử dụng eax, edi và edx, vì vậy tôi có nên sử dụng chúng thay vì toàn bộ 64 bit không? Tại sao hay tại sao không?
Thực tế trong Linux (và có thể là mọi thứ khác?) Các thông số cho một syscall rộng 32 bit, vì vậy bạn nên sử dụng EDI và EDX. http://www.win.tue.nl/~aeb/linux/lk/lk-4.html#ss4.3 –
điều gì về rax, điều đó có nên thay đổi thành eax không?Tôi đã cố gắng thay đổi những thứ 3 và nó hoạt động, nhưng những gì tôi muốn biết là tại sao tôi nên làm điều này và lợi thế là gì. – mk12
Trong trường hợp của chương trình này, sự khác biệt đáng kể duy nhất là giá trị bằng chữ (4, 1, 0, v.v.) lớn gấp đôi khi chúng là 64 bit, do đó chương trình của bạn sẽ lớn hơn vài byte và theo lý thuyết, có thể mất nhiều thời gian hơn để tải vào CPU từ đĩa/bộ nhớ. –