[英]Assembly imul signed
尋求幫助我的問題是關於從下面的代碼接收到的斧頭值?
mov al,22h
mov cl,0fdh
imul cl
ff9a
00:9a
(通過乘以二進制數) 第一個數字是22h,因此它的34個十進制數已經是無符號的,第二個數字是fd二進制,它像11111101一樣,所以它的帶符號意味着它像-3
所以22 * -3是66 在簽名的9a上為-66
那為什么一開始會有ff
imul cl
執行AX = AL * CL
imul cl
,從而從8位帶符號輸入生成完整的16位帶符號乘積。
您為什么期望高位字節為零? 對於簽名或未簽名,這沒有任何意義。
0x009a
作為帶符號2的補碼16位整數表示+154
。
0xff9a
作為有符號2的補碼16位整數表示0xff9a
- 0x10000
= -102
。 這是-3
* 34
的正確結果。 對於8位有符號,該數字在-128..127范圍內,因此高8位( 0xff
)只是低8位的2的補碼擴展 。
它已經未簽名
不,它是積極的。 有符號與無符號是關於如何解釋位的問題。 在帶符號的解釋中,數字可以為正,負或零。 但是,符號位= 0的數字是非負數。
這只是預期的行為。 從102的完整表示(兩個操作數34和-3的十進制結果的絕對值)開始,我們有16位:
0000 0000 0110 0110
1111 1111 1001 1001 #Flip bits
1111 1111 1001 1010 #Add 1
f f 9 a
我猜您只是忽略了高位字節,因為您正確轉換了低位字節。 記住結果和輸出寄存器是一個設定的大小,在算術運算中您不能忽略它的任何部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.