我需要在程序集8086中减去两个双字,并在屏幕上以十进制数打印结果。我需要得到这两个双字的每一个,如大小字的变量乘以大小字的变量。
我编写了这段代码,但我不确定我是否正确地使用双字和签名数字进行此操作。
两个内存位置无法减法,因此min_niz1
乘以max_niz1
的结果我放入了minmax1
。乘法的第二个结果需要在AX
和DX
中,我可以在此之后编写减法并在屏幕上打印,就像在我的代码中一样吗?
对于签名的单词,这也是正确的吗?
mov AX,min_niz1
mul max_niz1
push ax
push dx
pop minmax1
mov AX,min_niz2
mul max_niz2
sub DX:AX,minmax1
int 21h
答案 0 :(得分:1)
因此将min_niz1与max_niz1相乘的结果我输入minmax1
mov AX,min_niz1 mul max_niz1 push ax push dx pop minmax1
字大小乘法的结果是放在堆栈中的DX:AX
中的双字。好的,但单pop minmax1
只会将产品的高位字放在变量 minmax1 中!
考虑将代码更改为:
mov ax, min_niz1
mul max_niz1
mov minmax1_low, ax
mov minmax1_high, dx
之后我可以写减法并在屏幕上打印,就像我的代码一样吗?
sub DX:AX,minmax1
此减法不是合法指示。
在8086上,您需要一系列减法指令来计算32位数字的差异:
sub ax, minmax1_low
sbb dx, minmax1_high
对于签名的单词,这也是正确的吗?
处理签名字时,您可以将mul
指令更改为imul
指令。这将生成签名的双字,您可以如上所示减去。