汇编语言乘法

时间:2011-10-11 05:57:50

标签: assembly hex multiplication

在理解程序集乘法方面有点麻烦。任何人都可以帮助打破这些步骤的过程:

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

我可能会以错误的方式接近这个,所以如果我错了,请纠正我。

2 个答案:

答案 0 :(得分:1)

在二进制补码编码中,0xfffe:7960(自最高位设置为1以来的负数)为-(0x1:0000:0000-0xfffe:7960)-0x1:86a0,相当于十进制的-100,000。< / p>

将16位axdx寄存器一起添加以获取值,您将它们视为单个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:)