我有一个程序可以增加3个数字,我正在努力理解。我有一些问题,我希望有人可以解释一下该计划的进展情况,并告诉我我是否走在正确的轨道上。我知道我有不止一个问题,所以我很抱歉。
.data?
num1 dd ?
num2 dd ?
num3 dd ?
.data
sum dd 0
prod dd 0
.code
start:
main proc
mov EAX, sval(input("Enter a number: "))
mov num1, EAX
mov EAX, sval(input("Enter a number: "))
mov num2, EAX
mov EAX, sval(input("Enter a number: "))
mov num3, EAX
mov EAX, num1
mov EBX, num2
mul BL
mov EBX, num3
mul BX
mov prod, EDX
这让我感到困惑......
mov EBX, num3
mul BX
所以,我们将num3存入BL? 但由于num1和num2的结果是16位并存储在AX中 我们是BX吗?而不是BL? BL中不是num3吗?
对不起,没有一个具体的问题。如果我的逻辑不正确或关闭,你能解释一下一个接一个的原因吗?谢谢
答案 0 :(得分:3)
当您执行mul bl
之类的8位乘法时,需要al
,将其乘以指定的输入,并将结果放入ax
。
当您执行像mul bx
这样的16位乘法时,需要ax
,将其乘以指定的输入,并将结果放入dx:ax
(即最重要的16位) dx
中结果的位,以及ax
中结果的16个最低有效位。
(仅为了完整性):如果你进行像mul ebx
这样的32位乘法,它会将eax
乘以ebx
,并将结果放入edx:eax
(offhand我不记得了,但我猜64位乘法的工作方式大致相同。)
至于BL
与BX
相比(或AL
/ AH
/ AX
等),你所拥有的并不是真的单独的寄存器 - AL
实际上是AX
的8个最低有效位。 AH
是AX的8个最重要的位。 BL是BX的8个最低有效位,BH是BX的8个最高有效位(对于CL / CH / DL / DH,依此类推)。
例如,如果您执行以下代码:
xor bx, bx
mov bl, 1
BH将等于0(由xor bx, bx
设置为零),BL将等于1(由mov设置),bx也将等于1(因为它现在包含位模式00000000 00000001)。 / p>