大会imul签署

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大会imul签署相关的知识,希望对你有一定的参考价值。

thx求助我的问题是关于从下面的代码收到的ax值?

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,从8位带符号输入生成完整的16位带符号产品。

你为什么期望高位字节为零?这对签名或未签名没有意义。

0x009a作为带符号的2的补码16位整数代表+154

0xff9a作为带符号的2的补码16位整数代表0xff9a - 0x10000 = -102。这是-3 * 34的正确结果。对于8位有符号,该数字在-128..127范围内,因此高8位(0xff)只是低8位的2's complement sign extension


它已经未签名了

不,它签了正面。 signed vs unsigned是一个如何解释这些位的问题。在签名解释中,数字可以是正数,负数或零。但是,符号位= 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

我猜你只是忽略了高位字节,因为你正确地转换了低位字节。记住结果和输出寄存器是一个设置大小,你不能忽略它在算术中的任何部分。

以上是关于大会imul签署的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C 代码中获取单操作数 imul

在这个汇编代码中,“xorl”和“imul”是做啥用的?可以转成c代码吗?

禁用优化的 c alloca 函数的奇怪汇编代码 - gcc 使用 DIV 和 IMUL 为常数 16,并转换?

昆仑万维GameArk签署《网络游戏行业防沉迷自律公约》 共促行业自律

聚焦科技创新产业升级 中国联通和腾讯签署新战略合作协议

与 libOmnitureAppMeasurement-iPhoneSimulator.a 链接的 iOS 未定义符号错误