如何在Assembly中检索乘法产品?

时间:2014-09-15 13:39:02

标签: assembly multiplication masm32 16-bit

例如,代码基本上应该这样做:(1 * 10)+(2 * 10)+(3 * 10)+(4 * 10)=总计

    xor bx, bx
    mov bx, 1

    loopHere:
        mov al, bx
        mov bl, 10
        mul bl
      ; add total, <product of bx and 10>
        inc bx
    cmp bx, 4
    jle loopHere

   ;some code to print the total

我读到该产品进入AX。但是,我不知道如何在AX中检索产品。起初,我尝试输入

add total, ax

因为这是第一个突然出现在我脑海中的东西,但显然我错了。 :P 检测到错误,指出“无效指令操作数”和“无效指令操作数”。在命令提示符下(我使用masm32)。 请帮我理解。我只是一个装配新手。

此外,如果有更有效的方式来执行代码,我很乐意接受您的建议。 :)谢谢。

2 个答案:

答案 0 :(得分:0)

由于您使用albl进行乘法运算,因此您需要使用第三个寄存器来存储累计和。

add cx, ax ; don't forget to make sure cx is zero before you start

基本上,您没有定义total变量,因此您无法在代码中使用它。如果有一个名为total的标签指向内存中的变量,我想你也可以使用它。

add [total], ax

在这种情况下,你可能不需要内存中的变量,因为寄存器就足够了,而且速度更快。

答案 1 :(得分:0)

这是一个有效的32位解决方案:

xor esi, esi        ;// Clear esi (lower DWORD result)
xor edi, edi        ;// Clear edi (higher DWORD result)
mov ecx, 4          ;// Multiplicant
mov ebx, 10         ;// Multiplicator
COUNTER_LOOP:
    mov eax, ebx    ;// eax = Multiplicator
    mul ecx         ;// eax = Multiplicant * eax (Multiplicator)
    add esi, eax    ;// add lower DWORD result ("total") to esi
    adc edi, edx    ;// add higher DWORD result ("total") to edi
loop COUNTER_LOOP   ;// Multiplicant = Multiplicant - 1 => next loop

结果存储在ESI(低DWORD)和EDI(高DWORD)中。但我建议先阅读一本好的汇编书,因为很难理解初学者的细节。