假设寄存器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
的作用(。