所以我在汇编中有这个“计算器”,我有一个数组num 1db 4dup(0),用于4个数字,假设你输入9875,所以9在num 1的位置0,8的位置1,等等……num1 = [9,8,7,6]
我还有:
bdec dw 1000d、100d、10d、1d ; 10的幂与数位
int count = 0 ;我将对结果求和
我用这段代码在一个基于幂位置的数组中创建一个数字。
我希望代码能做到这一点:num1h = 9x10^3 + 8x10^2 + 7x10^1 + 5x10^0
NUM1P proc
push ax
push bx
push cx
mov di,0
mov cx, 0
mov ax, 0
mov num1h,0
power_base:
mov al, [num1+di]
mov bx, [bdec+di]
mul bx
add num1h,ax
inc cx
inc di
cmp cx,4
je exitn1p
jmp power_base
exitn1p:
pop cx
pop bx
pop ax
ret
endp
当我打印结果时,它返回25852
Result
现在打印功能工作正常,因为它打印BX中的任何内容,所以当我将一个数字直接移动到BX并使用打印功能时,比如说5637,它将工作正常:
call NUM1P
;mov bx, num1h
mov bx, 5637
call IMPRIME_BX
jmp jmp_mouse_no_clic
Correct result
但是当我尝试使用num 1h将一个号码直接传输到bx时,事情变得很奇怪...
有什么想法我可能做错了什么吗?
或者我如何调试一个有这样一个接口的程序?
1条答案
按热度按时间oxosxuxt1#
一些bug
mov al, [num1+di]
时AH=0,但在接下来的迭代中不再是这种情况!你需要在循环中调零。inc di
,您的代码当前仅以1个字节的步长遍历这个数组。因为乘法可以直接使用内存操作数,所以获得正确结果的简单方法是:
部分改进
类似于以下的构造:
最好变成:
mov num1h, 0
替换为短2个字节的mov num1h, di
,因为已知DI寄存器包含0。mov di, 0
替换为短1个字节的xor di, di
,该xor di, di
同样会将DI寄存器置零。新增代码