2010-11-20 31 views
2

我最近開始學習masm程序集,我一直在拆解我的許多程序,只是爲了看看。我注意到,當你使用__int16(word)時,它的值首先被複制到eax中,然後到達變量本身,但是使用int(dword/32)它被直接複製到變量中:繼承了爲什麼__int16和int(32)用C++生成不同的asm?

的拆開代碼
int y = 5; 
0040101E mov   dword ptr [y],5 

    y += 7; 
00401025 mov   eax,dword ptr [y] 
00401028 add   eax,7 
0040102B mov   dword ptr [y],eax 

    __int16 x = 3; 
0040102E mov   eax,3 
00401033 mov   word ptr [x],ax 

    x += 6; 
00401037 movsx  eax,word ptr [x] 
0040103B add   eax,6 
0040103E mov   word ptr [x],ax 

我注意到__int16的大小是16 ...這是eax大小的一半,這就是爲什麼它被放入eax中然後只有ax到x中?

另外,哪個最快?

有什麼好的masm網站你會推薦?

感謝您的輸入

+0

哪個編譯器?什麼優化級別? – 2010-11-20 17:55:42

回答

1

如果指令是mov ax,3,但確實會給出相同的結果,但編譯器可能選擇mov eax,3,因爲機器代碼較短,在這種特殊情況下效果相同。 mov ax,3會有一個額外的前綴字節,告訴CPU它是一個16位操作。 (兩條指令的編碼是相同的。)

如果您使用Visual C++,則可以在反彙編窗口中切換機器代碼字節的顯示,並查看每條指令的大小。

在某一點上,16位指令(或者更準確地說,使用當前CPU模式下的「其他」字大小的指令)效率較低;這可能會或可能不再是這種情況,我不確定。 (我的猜測是,這種效果通常很難發現,而且你必須設計一些代碼片段,這使得它很明顯。)

1

與您的cpu架構匹配的字號總是最快的。任何其他事情都被迫在每個操作中來回轉換。

TLDR:除非您有一個非常具體的原因,請使用int

0

我在做這件事,因爲我沒有特別的瞭解。

但似乎在現代處理器上,使用eax比使用較小的ax寄存器更有效。

通過先移入eax(在第一個賦值中),CPU將符號擴展到32位寄存器。

編譯器在32位(與寄存器一起工作)中完成所有數學運算,並透明地給你遺體(即ax),這也是很好的選擇。

這就是它對我來說的樣子。

+2

從技術上講,「現代」處理器可以在64位模式下工作,並使用'rax'而不是'eax'。 – Blindy 2010-11-20 17:56:35

相關問題