在理解程序集乘法方面有点麻烦。任何人都可以帮助打破这些步骤的过程:
mov ax,[p1000]; p1000 = +1000 ax = 03e8
imul [n100]; n100 = -100
_____________
-100,000
dx:ax = fffe 7960 (dx = fffe, ax = 7960) cf = 1
我不确定如何从dx:ax推断出答案是-100,000。我试过像这样计算它:
dx =(15 * 16 ^ 3)+(15 * 16 ^ 2)+(15 * 16)+ 14 = 65,534
ax =(7 * 16 ^ 3)+(9 * 16 ^ 2)+(6 * 16)= 31,072
dx + ax = 96,606
我可能会以错误的方式接近这个,所以如果我错了,请纠正我。
答案 0 :(得分:1)
在二进制补码编码中,0xfffe:7960
(自最高位设置为1以来的负数)为-(0x1:0000:0000-0xfffe:7960)
或-0x1:86a0
,相当于十进制的-100,000
。< / p>
您不将16位ax
和dx
寄存器一起添加以获取值,您将它们视为单个32位值。
答案 1 :(得分:1)
imul [n100];
将乘以并将结果保留在dx:ax
中现在,dx:ax = fffe 7960.这是32位数量,dx中的高16位和ax中的低16位。由于这个总体32位签名数量的MSB是1,它是一个负数,我们需要两个人的赞美才能找到幅度。
FFFE 7960 <-- our number
0001 869F <-- 1's compliment in hex
0001 86A0 <-- 2's compliment in hex
...0001 1000 0110 1010 0000 <-- 2's compliment in binary
像往常一样将其转换为十进制(总和)(1 * 2 ^ {bit_position})...我们得到幅度为..
100,000。
现在回想一下,这是一个带负号的符号,(MSB = 1)所以把符号和幅度放在一起我们得到...... -100,000:)