例如,代码基本上应该这样做:(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)。 请帮我理解。我只是一个装配新手。
此外,如果有更有效的方式来执行代码,我很乐意接受您的建议。 :)谢谢。
答案 0 :(得分:0)
由于您使用al
和bl
进行乘法运算,因此您需要使用第三个寄存器来存储累计和。
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)中。但我建议先阅读一本好的汇编书,因为很难理解初学者的细节。