大会imul签署

时间:2017-12-22 19:11:53

标签: assembly x86 twos-complement signed-integer

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

in[1]: test
Out[1]: Foo('Text')


in[2]: str(test)
Out[2]: 'Text'
  • 实际机器结果:mov al,22h mov cl,0fdh imul cl
  • 我的期望:ff9a(乘以二进制)

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

所以22 * -3为66; 签名9a上的-66和<66。

所以为什么开头有ff

2 个答案:

答案 0 :(得分:4)

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的数字是非负数。

答案 1 :(得分: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

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