Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 组件上的分区溢出_Assembly_Overflow_X86 16 - Fatal编程技术网

Assembly 组件上的分区溢出

Assembly 组件上的分区溢出,assembly,overflow,x86-16,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 1

我为大学做这个练习,我的汇编程序在除法过程中返回一个溢出,我一步一步地调试寄存器,但我无法解决这个问题,因为我找不到它。 我把代码贴出来,这样你就可以试着帮我了。 该计划的目标是将硬币的数量乘以相应的价值,例如,我有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
希望我的代码是清楚的。
谢谢大家,很抱歉我的英语不好

我相信
cbw
给AH寄存器的值是错误的,所以让我们通过
mov-AH,0
来更改它,这是您的代码(我得到的结果是634.11,正确吗?)

。型号小
堆栈
.数据
数值dw 1,2,5,10,20,50100200
硬币db 100,23,17,0,79,48170211
欧元DW0
分dw 0
.代码
.启动
mov-si,0;我必须在8点到达
mov-di,0
mov-bx,100;将欧元和小数分开
mon:mov al,硬币[si]

mov-ah,0 我相信
cbw
给了AH寄存器错误的值,所以让我们通过
mov-AH,0
来更改它,这是您的代码(我得到的结果是634.11,正确吗?)

。型号小
堆栈
.数据
数值dw 1,2,5,10,20,50100200
硬币db 100,23,17,0,79,48170211
欧元DW0
分dw 0
.代码
.启动
mov-si,0;我必须在8点到达
mov-di,0
mov-bx,100;将欧元和小数分开
mon:mov al,硬币[si]
mov-ah,0;
当您使用
cbw
指令扩展该值时,将出现两个硬币值(170和211)故障。最好使用
mov-ah,0
。作为替代方案,您可以将coins数组定义为word,然后只需编写
mov ax,coins[si]
。这当然需要您将SI寄存器加倍,并将SI与16进行比较,而不是将环路控制的SI与8进行比较


你在这里做的事情太复杂了!
div bx
指令(bx=100)在DX寄存器中留下最大99的剩余部分,因此您知道在每次迭代中,cent变量最多可以增加99。使用此事实并简化代码以:

 cmp cent,100
 jb cicl
 sub cent,100
 inc euro
cicl:
当您使用
cbw
指令扩展该值时,将出现两个硬币值(170和211)故障。最好使用
mov-ah,0
。作为替代方案,您可以将coins数组定义为word,然后只需编写
mov ax,coins[si]
。这当然需要您将SI寄存器加倍,并将SI与16进行比较,而不是将环路控制的SI与8进行比较


你在这里做的事情太复杂了!
div bx
指令(bx=100)在DX寄存器中留下最大99的剩余部分,因此您知道在每次迭代中,cent变量最多可以增加99。使用此事实并简化代码以:

 cmp cent,100
 jb cicl
 sub cent,100
 inc euro
cicl:

英特尔64和IA-32体系结构软件开发人员手册第2卷(2A、2B和2C):指令集参考,A-Z
,div
部分:无符号除法DX:AX除以r/m16,结果存储在AX中← 商← 剩余的。您在哪里将
DX
设置为一个正常值?这是假设汇编器将
mul value[di]
视为
mul r/m16
Replace
cbw
by
mov-ah,0
。如果值数组中的数字表示欧元,那么您的计算与除以100有关是错误的。将整欧元乘以另一个整数总是得到整欧元。分部分不可避免地必须为零。
Intel®64和IA-32体系结构软件开发人员手册第2卷(2A、2B和2C):指令集参考,A-Z
div
:无符号除法DX:AX除以r/m16,结果存储在AX中← 商← 剩余的。您在哪里将
DX
设置为一个正常值?这是假设汇编器将
mul value[di]
视为
mul r/m16
Replace
cbw
by
mov-ah,0
。如果值数组中的数字表示欧元,那么您的计算与除以100有关是错误的。将整欧元乘以另一个整数总是得到整欧元。分的部分不可避免地必须为零。
 cmp cent,100
 jb cicl
 mov ax,cent      !?
 mov cent,0       !?
 mov dx,0         !?
 div bx           !?
 add euro,ax      !?
 mov cent,dx      !?
cicl:
 cmp cent,100
 jb cicl
 sub cent,100
 inc euro
cicl: