谢谢帮助我的问题是关于从下面的代码中收到的 ax 值?
mov al,22h
mov cl,0fdh
imul cl
- 实际机器结果:
ff9a
- 我所期望的:(
00:9a
通过二进制相乘)
第一个数字是 22h 所以它的 34 十进制它已经无符号第二个数字是二进制的 fd 它像 11111101 所以它有符号意味着它像 -3
所以 22* -3 它的 66;和 -66 签署 9a
那为什么开头有ff
谢谢帮助我的问题是关于从下面的代码中收到的 ax 值?
mov al,22h
mov cl,0fdh
imul cl
ff9a
00:9a
通过二进制相乘)第一个数字是 22h 所以它的 34 十进制它已经无符号第二个数字是二进制的 fd 它像 11111101 所以它有符号意味着它像 -3
所以 22* -3 它的 66;和 -66 签署 9a
那为什么开头有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 的补码符号扩展。
它已经未签名
不,它的签名是肯定的。有符号与无符号是关于如何解释这些位的问题。在有符号解释中,数字可以是正数、负数或零。但是,符号位 = 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
我猜你只是忽略了高字节,因为你正确地转换了低字节。记住结果和输出寄存器是一个设定的大小,你不能在算术中忽略它的任何部分。