繁体   English   中英

大会伊姆尔签署

[英]Assembly imul signed

寻求帮助我的问题是关于从下面的代码接收到的斧头值?

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 imul cl ,从而从8位带符号输入生成完整的16位带符号乘积。

您为什么期望高位字节为零? 对于签名或未签名,这没有任何意义。

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

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


它已经未签名

不,它是积极的。 有符号与无符号是关于如何解释位的问题。 在带符号的解释中,数字可以为正,负或零。 但是,符号位= 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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM