2011-09-06 17 views
5

好了,所以我處理下面的代碼片段:奇怪的結果與movzwl,斧頭%和負值

​​

因此,這表現爲正值打交道時預期。複製到%edx的值是%eax(或%ax)的後16位。

但是,如果你把一個負數,一切都開始變得古怪,它似乎並沒有被表現如預期。

例如,如果%eax中的值是-67043552,然後複製到%EDX值是65312.

我是相當新的組件,對不起,如果這是在我的部分明顯的誤解。任何幫助將不勝感激。

+0

['movswl'](http://www.felixcloutier.com/x86/MOVSX:MOVSXD.html)可用於簽名擴展2的補碼有符號值而不是零擴展二進制無符號值。 (參見[86標籤維基(http://stackoverflow.com/tags/x86/info)。 –

+0

另外,如果你打印你的號碼爲十六進制,它會少了很多混亂/較爲明顯發生了什麼事。 –

+0

另外,除非你確實需要在'%eax'的全部價值,您應該'movzwl 0x8中(%EBP),%edx',而不是直接的浪費指令單獨做這件事。英特爾的CPU可以處理'movzx' /'movsx'作爲一個負載uop,不需要ALU。 –

回答

16

請記住,movzwl只會將%ax中的位複製到%edx中,並用零填充%edx的高16位。

所以%edx始終以正數小於或等於65535。

詳細地結束:-67043552十六進制是fc00ff20。因此,如果這是在%eax,然後%ax包含ff20。如果移動到%edx零擴展,然後%edx得到0000ff20。這是65312.