簡體   English   中英

大會伊姆爾簽署

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM