2012-08-06 121 views
5

nasm组装验证码:总是可以使用“mov eax,0x1”而不是“mov rax,0x1”?

BITS 64 
mov eax, 0x1 
mov rax, 0x1 

我得到这样的输出:

b8 01 00 00 00 b8 01 00 00 00 

这是mov eax, 0x1操作码重复两次。

这是否意味着mov rax, 0x1可以总是mov eax, 0x1更换还是只是在这种情况下?

如果这是正确的,那岂不是比使用方法:在组装时同时mov eax, 0x1只有5个字节

xor rax, rax 
inc rax 

为成为6个字节?

+0

相关:http://stackoverflow.com/questions/8502839/loading-small-numbers-into-64-bit-x86-registers – 2012-08-06 05:54:21

+4

其实,因为第一个片段是正确的,第二个片段只需要4个字节(不需要REX前缀)。 – harold 2012-08-06 08:42:09

+0

'xor eax,eax' /'inc eax'是4B,略小于'mov eax,1'。但除非您对代码大小进行了大量优化,否则请不要使用它。花费1个字节来保存指令(和融合域uop)对于现代CPU来说是值得的。 – 2016-05-20 06:33:01

回答

5

总是。大多数(如果不是全部的话)32位MOV和ALU操作清除目标寄存器操作数的第32至63位。详细信息请参见CPU手册。

相关问题