5
好了,所以我處理下面的代碼片段:奇怪的結果與movzwl,斧頭%和負值
因此,這表現爲正值打交道時預期。複製到%edx的值是%eax(或%ax)的後16位。
但是,如果你把一個負數,一切都開始變得古怪,它似乎並沒有被表現如預期。
例如,如果%eax中的值是-67043552,然後複製到%EDX值是65312.
我是相當新的組件,對不起,如果這是在我的部分明顯的誤解。任何幫助將不勝感激。
好了,所以我處理下面的代碼片段:奇怪的結果與movzwl,斧頭%和負值
因此,這表現爲正值打交道時預期。複製到%edx的值是%eax(或%ax)的後16位。
但是,如果你把一個負數,一切都開始變得古怪,它似乎並沒有被表現如預期。
例如,如果%eax中的值是-67043552,然後複製到%EDX值是65312.
我是相當新的組件,對不起,如果這是在我的部分明顯的誤解。任何幫助將不勝感激。
請記住,movzwl
只會將%ax
中的位複製到%edx
中,並用零填充%edx
的高16位。
所以%edx
始終以正數小於或等於65535。
詳細地結束:-67043552
十六進制是fc00ff20
。因此,如果這是在%eax
,然後%ax
包含ff20
。如果移動到%edx
零擴展,然後%edx
得到0000ff20
。這是65312.
['movswl'](http://www.felixcloutier.com/x86/MOVSX:MOVSXD.html)可用於簽名擴展2的補碼有符號值而不是零擴展二進制無符號值。 (參見[86標籤維基(http://stackoverflow.com/tags/x86/info)。 –
另外,如果你打印你的號碼爲十六進制,它會少了很多混亂/較爲明顯發生了什麼事。 –
另外,除非你確實需要在'%eax'的全部價值,您應該'movzwl 0x8中(%EBP),%edx',而不是直接的浪費指令單獨做這件事。英特爾的CPU可以處理'movzx' /'movsx'作爲一個負載uop,不需要ALU。 –