部门溢出装配

时间:2016-04-20 15:50:54

标签: assembly overflow x86-16

我正在为大学做这个练习,我的汇编程序在分区时返回溢出,我一步一步地调试检查寄存器,但我无法解决问题,因为我无法找到它。 我发布了代码,所以你可以尝试帮助我。 该计划的目标是将相应值的硬币数量相乘,例如我有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

希望我的代码清楚。 感谢大家,抱歉我的英语不好。

2 个答案:

答案 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: