【问题标题】:Assembly imul signed汇编 imul 签名
【发布时间】:2017-12-22 19:11:53
【问题描述】:

感谢帮助我的问题是关于从下面的代码中收到的 ax 值?

mov al,22h
mov cl,0fdh
imul cl
  • 实际机器结果:ff9a
  • 我的预期:00:9a(通过二进制相乘)

第一个数字是 22h,所以它的 34 位十进制数已经无符号 第二个数字是二进制的 fd,它类似于 11111101 所以它的签名意味着它像-3

所以 22* -3 是 66; 和 -66 签署 9a

那为什么开头有ff

【问题讨论】:

    标签: assembly x86 twos-complement signed-integer


    【解决方案1】:

    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


    它已经没有签名了

    不,它的签名是肯定的。有符号与无符号是关于如何解释这些位的问题。在有符号解释中,数字可以是正数、负数或零。但是,符号位 = 0 的数字是非负数。

    【讨论】:

      【解决方案2】:

      这只是二进制补码中的预期行为。从 102 的完整表示(两个操作数 34 和 -3 的十进制结果的绝对值)开始,我们有 16 位:

      0000 0000 0110 0110
      1111 1111 1001 1001 #Flip bits
      1111 1111 1001 1010 #Add 1
        f    f    9    a
      

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

      【讨论】:

        猜你喜欢
        • 2011-04-18
        • 1970-01-01
        • 2014-11-11
        • 1970-01-01
        • 1970-01-01
        • 2011-04-21
        • 2016-10-21
        • 2011-12-06
        • 1970-01-01
        相关资源
        最近更新 更多