如何在两个寄存器的值相乘后得到乘积的值



假设寄存器ax=50和cx=1000

完成后

mul cx

十六进制乘积将一分为二,形式为(dx-ax(我怎样才能获得产品的全部价值?(本例为50000(

如果您使用的是irvine32,那么您就能够编写32位代码
在2018年编程16位真的没有意义了。32位代码是1985年引入的,您现在应该继续前进了。

话虽如此。

mov ax,[a]       //part a
mov cx,[b]       //part b
mul cx         //ax:dx = a * b
cmp dx,0       //if dx=0 then ax contains the whole result
jne overflow   //handle overflow
//process ax

如果你加入了理智的人的世界,你就可以做

movzx eax, word ptr [a]
movzx ecx, word ptr [b]
imul eax,ecx              //eax=eax*ecx
//test to see if it fits into a word
cmp eax,0xFFFF
ja,overflow               //result does not fit into a word.
//or, test to see if it fits into a (signed) int
js,overflow

如果你要将结果存储在unsigned int中,那么你不需要测试它

因为您的输入是正16位,所以输出永远不会溢出32位无符号目标。imul的另一个好处是如果使用双操作数版本,它不会阻塞edx寄存器。

参见:IMUL

'我怎样才能得到整个值[…]?(50000[…]'
ax是一个16位寄存器,如果将其用作无符号字,则它可以保存0到65535之间的值。因为计算的目的地是dx:ax,所以符号位进入dx
但是,mul是一个无符号乘法,因此不应为其提供负值
如果要进行有符号乘法,请使用imul
您也可以使用imul进行无符号乘法,只要您能确保两个输入的最高有效位为零。(这就是movzx的作用(。

最新更新