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