我正在为大学做这个练习,我的汇编程序在分区时返回溢出,我一步一步地调试检查寄存器,但我无法解决问题,因为我无法找到它。 我发布了代码,所以你可以尝试帮助我。 该计划的目标是将相应值的硬币数量相乘,例如我有10欧元1欧元的硬币,所以我有10欧元;我必须把我总共有多少钱存入记忆中;硬币和数值分为两个向量,它们分别按位置连接。
代码适用于Intel 8086
.model small
.stack
.data
value dw 1,2,5,10,20,50,100,200
coins db 100,23,17,0,79,48,170,211
euro dw 0
cent dw 0
.code
.startup
mov si,0 ;must arrive on 8
mov di,0
mov bx,100 ;to separate euro and decimals
mon: mov al,coins[si]
cbw
mul value[di]
div bx
add cent,dx
add euro,ax
inc si
inc di
inc di
cmp cent,100
jb cicl
mov ax,cent
mov cent,0
mov dx,0
div bx
add euro,ax
mov cent,dx
cicl: cmp si,8
jnz mon
.exit
end
希望我的代码清楚。 感谢大家,抱歉我的英语不好。
答案 0 :(得分:1)
我相信cbw
给AH寄存器提供了错误的值,所以让我们按mov ah,0
更改它,这是您的代码(我得到的结果634.11,这是正确的吗?):
.model small
.stack
.data
value dw 1,2,5,10,20,50,100,200
coins db 100,23,17,0,79,48,170,211
euro dw 0
cent dw 0
.code
.startup
mov si,0 ;must arrive on 8
mov di,0
mov bx,100 ;to separate euro and decimals
mon: mov al,coins[si]
mov ah,0 ;<========================================= cbw
mul value[di]
div bx
add cent,dx
add euro,ax
inc si
inc di
inc di
cmp cent,100
jb cicl
mov ax,cent
mov cent,0
mov dx,0
div bx
add euro,ax
mov cent,dx
cicl: cmp si,8
jnz mon
.exit
end
答案 1 :(得分:1)
mon: mov al,coins[si] cbw
当您使用cbw
指令扩展值时,您将获得2个币值(170和211)。更好地使用mov ah,0
。作为替代方案,您可以将硬币数组定义为 word ,然后只需编写mov ax,coins[si]
。这当然要求您将SI寄存器加倍inc
并将SI与16进行比较,而不是将8与循环控制进行比较。
cmp cent,100 jb cicl mov ax,cent !? mov cent,0 !? mov dx,0 !? div bx !? add euro,ax !? mov cent,dx !? cicl:
你在这里做的事情太复杂了! div bx
指令(BX = 100)剩余的最大值。 DX寄存器中的99,因此您知道在每次迭代时, cent 变量最多可以提高99.使用此事实并简化代码:
cmp cent,100
jb cicl
sub cent,100
inc euro
cicl: