1

我有一个将 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 我们 mul BX? 而不是BL?但是BL中不是num3吗?

对不起,没有一个具体的问题。如果我的逻辑不正确或接近,你能解释一下发生了什么,为什么?

谢谢

4

1 回答 1

3

当您执行 8 位乘法mul bl时,它需要al,将其乘以指定的输入,然后将结果放入ax.

当您像 一样进行 16 位乘法运算mul bx时,它需要ax,将其乘以指定的输入,然后将结果放入dx:ax(即,结果的 16 个最高有效位放入dx,结果的 16 个最低有效位放入ax)。

(只是为了完整性):如果你做一个 32 位乘法mul ebx,它会乘以eaxebx并将结果放入edx:eax(我不确定,但我猜 64 位乘法的工作方式大致相同) .

BLvs.BX而言(或AL/ AH/AX等),你所拥有的并不是真正独立AL的寄存器——实际上是AX. AH是 AX 的 8 个最高有效位。BL 是 BX 的 8 个最低有效位,BH 是 BX 的 8 个最高有效位(对于 CL/CH/DL/DH,依此类推)。

例如,如果您执行如下代码:

xor bx, bx
mov bl, 1

然后 BH 将等于 0(由 mov 设置为零xor bx, bx),BL 将等于 1(由 mov 设置)并且 bx 也将等于 1(因为它现在包含位模式 00000000 00000001)。

于 2012-07-15T00:25:06.730 回答