我在x86_64汇编中了解到,例如(64位)rax寄存器,但它也可以作为32位寄存器,eax,16位,ax和8位,al。在什么情况下我不会使用完整的64位,为什么会有什么优势?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位?为什么或者为什么不?
实际上,在Linux(也许还有其他一些?)系统调用的参数是32位宽,所以你应该使用EDI和EDX。 http://www.win.tue.nl/~aeb/linux/lk/lk-4.html#ss4.3 –
rax又如何改变为eax呢?我试图改变这三个方法,但它的工作原理,但我想知道的是为什么我应该这样做,以及什么是优势。 – mk12
在这个程序的情况下,唯一明显的区别是字面值(4,1,0等)是64位时的两倍,所以你的程序将会增大几个字节,在理论上,可能需要更长的时间从磁盘/内存加载到CPU中。 –