簡體   English   中英

我仍然不了解IMUL在組裝中的工作方式

[英]I still don't get how IMUL works in Assembly

我是匯編的入門者,我剛剛開始學習它,但我不了解IMUL的實際工作原理

例如,我正在Visual Studio上處理這段代碼:


Mat = 0A2A(hexadecimal)

__asm {

    MOV AX, Mat
    AND AL,7Ch
    OR AL,83h
    XOR BL,BL
    SUB BL,2
    IMUL BL
    MOV Ris5,AX
}

Ris5中的結果應為00AA(十六進制),對於第一行我都很好,從第一行到“ SUB BL,2”,結果為AL = AB(AX = 0AAB),但從IMUL開始我被困住了。 我知道IMUL通過寄存器或字節或字來執行AL的有符號乘法..並將結果存儲在AX中(在此),但我找不到相同的結果(00AA)

MOV AX, Mat    AX = 0x0A2A  (...00101010)
AND AL,7Ch     AX = 0x0A28  (...00101000)
OR AL,83h      AX = 0x0AAB  (...10101011)
XOR BL,BL      BL = 0x00
SUB BL,2       BL = 0xFE
IMUL BL        AX = 0xFFAB * 0xFFFE = 0x00AA
MOV Ris5,AX    Ris5 = 0x00AA

當您多記兩個N位數字時,低N位並不關心有符號數與無符號數,但是當您填充數字時,您將進入有符號數與無符號乘法指令,就像在某些指令集中看到的那樣。 為了不丟失精度,您希望得到2 * N位數的結果,對學校數學進行評分:

   00000000aaaaaaaa
*  00000000bbbbbbbb
=====================

   AAAAAAAAAAaaaaaa
*  BBBBBBBBBBbbbbbb
====================

已簽名與未簽名,大寫字母代表符號擴展名

0xAB = 171無符號= -85有符號

0xFE = 254無符號= -2有符號

無符號乘法171 * 254 = 43434 = 0xA9AA

有符號乘法-85 * -2 = 170 = 0x00AA

低位字節與8位操作數相同,並且符號擴展名不起作用:

         bbbbbbbb *a[0]
        bbbbbbbb  *a[1]
       bbbbbbbb   *a[2]
      bbbbbbbb    *a[3]
     bbbbbbbb     *a[4]
    bbbbbbbb      *a[5]
   bbbbbbbb       *a[6]
+ bbbbbbbb        *a[7]
==================
 cyyyyyyyxxxxxxxx       

如果您查找列,則x位不受符號擴展的影響,因此,無符號和有符號的x位相同。 y位會受到影響,ms位c的進位也會受到影響,后者構成結果的第16位。

現在該工具不再抱怨這種語法了:

Mat = 0A2A(hexadecimal)

末尾沒有h或前面沒有0x或$的字符,看起來像八進制,但是如果八進制(或十進制),則A會導致錯誤。 假設您從0x0A2A開始,我認為您的理解是可靠的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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