如何手动计算imul指令的-1*3?x86-64汇编技术问询
手动计算x86
imul 指令结果的方法 核心原理:有符号数补码的符号扩展与乘法
imul 是x86的有符号整数乘法指令,对于8位操作数的场景(如你用的imul bl),它会先将两个8位有符号数符号扩展为16位,再执行乘法,最终结果以16位有符号数的形式存储在AX寄存器中(高8位在AH,低8位在AL)。
针对你的例子:-1 * 3 的手动计算步骤
你的代码中:
mov al, -1 ; AL = 0xFF (8位补码表示-1) mov bl, 3 ; BL = 0x03 (8位补码表示3) imul bl ; 结果存在AX中
步骤1:对操作数进行符号扩展
符号扩展的规则是:
若原数是正数(最高位为0),扩展后的高位全部填0
若原数是负数(最高位为1),扩展后的高位全部填1
AL中的
-1(二进制11111111)是负数,符号扩展为16位后:11111111 11111111(对应十进制-1)BL中的
3(二进制00000011)是正数,符号扩展为16位后:00000000 00000011(对应十进制3)
步骤2:执行16位有符号乘法
两个16位有符号数相乘:-1 * 3 = -3
步骤3:将结果转换为16位补码
十进制-3的16位补码计算:
- 先取3的16位二进制:
00000000 00000011 - 按位取反:
11111111 11111100 - 加1:
11111111 11111101
这个16位补码拆分后:
- 高8位
11111111存在AH中 - 低8位
11111101存在AL中
正好和你程序输出的结果一致。
和mul指令的对比(无符号乘法)
mul是无符号乘法,不会做符号扩展,直接按无符号数计算:
- 255(
11111111)*3(00000011)=765 - 765的16位二进制是
00000010 11111101,所以AH=00000010,AL=11111101,这和你手动计算的结果匹配。
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

