2012-08-06 124 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手冊。

相關問題