学习dos汇编碰到的问题 div cx 后??[bx+si]

JACK_GOD_123 2016-02-27 03:33:43
assume cs:codesg,ds:data,es:table

data segment

db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995' ;以上是表示21年的21个字符串
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 ;以上是表示21年公司总收的21个

dword型数据
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,45257,17800 ;以上是表示21年公司雇员人数的21个word型数据

data ends

table segment

db 21 dup('year summ ne ?? ')

table ends


codesg segment

start: mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov si,0
mov di,0

mov cx,21
s: mov ax,[0+si]
mov es:[0+di],ax
mov ax,[2+si]
mov es:[2+di],ax
;年份传送


mov ax,[0+51h+si]
mov es:[0+5+di],ax
mov dx,[51h+2h+si]
mov es:[0+5+2+di],dx
;收入传送
push cx
;保护cx
mov cx,[0+0A8h+bx]
mov es:[0+0Ah+di],cx
;雇员传送

div cx
pop cx

mov es:[0+0Dh+di],ax

add bx,2
add si,4
add di,10h

loop s

mov ax,4c00h
int 21h
codesg ends
end start
求助 ,这段汇编代码在dosbox的debug中 显示这样
...全文
538 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
JACK_GOD_123 2016-02-28
  • 打赏
  • 举报
回复
引用 2 楼 danteng2000 的回复:
注释一下,你到底要实现什么功能

[/img]结果如图 现在我想请问的是为什么会发生这种除法溢出 求解释
JACK_GOD_123 2016-02-28
  • 打赏
  • 举报
回复
引用 2 楼 danteng2000 的回复:
注释一下,你到底要实现什么功能
这段代码编译链接后的程序在debug中用g命令的表现为无法结束程序,有点类似于陷入了死循环,不能正常返回 。然后我用emu8086 调试之后发现错误为div 溢出,但是新的问题又来了,请看五楼
JACK_GOD_123 2016-02-28
  • 打赏
  • 举报
回复
引用 2 楼 danteng2000 的回复:
注释一下,你到底要实现什么功能
谢谢回复 , 我的问题来自于汇编语言第二版 王爽的 第八章 实验7 寻址方式在结构化数据访问中的应用 编程,将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整),结果也按照下面的格式保存在table段中。 格式形如这样的 1975 0016 03 05 这样的依次排列
JACK_GOD_123 2016-02-28
  • 打赏
  • 举报
回复
引用 9 楼 danteng2000 的回复:
哦,知道了,王爽汇编不是有一个实验 要你自己做一个不会溢出的除法麽 你的答案就在里面,那个习题你应该有答案,和你自己的比较一下就明白了 你不能直接用这个除法,得自己设计一个能运行的子程序 你这个8086汇编 被除数放AX(只能是2个字节)里,除数放CX的时候(只能放CL,只能是1个字节) 商会被放到AL里,余数放AH里 当你除数(放CX里)是2个字节的时候,你必须把被除数当成4个字节的,不够4个字节就要高2个字节填0,高2个字节放DX里,低2个字节放AX里 商在AX中,余数在DX中 dword更复杂你得去看书 不过感觉你学太快了, 王爽的书之所以好用就是一个原则,实验和测试点不过关不要往下学。 假如无视这个那好处也基本没了。 无符号数除法指令 DIV(DIVision) 格式: DIV OPRD ---- 功能: 实现两个无符号二进制数除法运算. ---- 说明: 1. 其中OPRD为任一个通用寄存器或存储器操作数. ---- 2. 字节相除,被除数在AX中;字相除,被除数在DX,AX中,除数在OPRD中. 字节除法: (AL)<--(AX)/OPRD,(AH)<--(AX)MOD OPRD 字除法: (AX)<--(DX)(AX)/OPRD,(DX)<--(DX)(AX) MOD OPRD 3. 示例: DIV BETA [BX] DIV CX;商在AX中,余数在DX中 DIV BL;商在AL中,作数在AH中 4. 当除法的商产生溢出时,例如字节除法的商大于0FFH,字除法的商大于0FFFFH将 置溢出标志位OF=1,并产生一个类型0溢出中断. 5. 本指令不产生有效的标志位。
恩 非常感谢 这个溢出的问题 昨晚也在百度上得到了解决方案 只是目前这个无溢出子程序目前还没在王爽老师的书看到 是昨晚在网上看到的
JACK_GOD_123 2016-02-28
  • 打赏
  • 举报
回复
引用 6 楼 DelphiGuy 的回复:
mov ds,ax mov ax,table mov es,ax mov si,0 mov di,0 xor bx,bx mov ax,[0+54h+si] mov es:[0+5+di],ax mov dx,[54h+2h+si] mov es:[0+5+2+di],dx
谢谢回复 这个错误后来我改正了
JACK_GOD_123 2016-02-28
  • 打赏
  • 举报
回复
引用 2 楼 danteng2000 的回复:
注释一下,你到底要实现什么功能
用计算器计算之后,发现确实溢出了,看样子被除数的
引用 7 楼 fornetuse123 的回复:
0x86的除法指令正确执行是有条件的。这个条件是:被除数的高位寄存器数值,必须小于除数。 如果数据不满足这样的条件,被除数的高位寄存器数值大于或者等于除数(相当于除法运算后产生的商会是个跟被除数大小一样的数值级别,但是实际上用来存放商的实际寄存器数值级别只有被除数的一半大小,比如说被除数是32位寄存器,那么除数必须是16位寄存器,商也是默认用16位寄存器来保存的,你能用16位寄存器保存10000H这个数值么?),就会产生除法溢出。 会自动触发0号中断---除法溢出中断。 就你所举的例子: 被除数10353939H,它的高位寄存器数值1035远远大于除数3。商远远大于10000H,你让ax怎么保存 则在程序运行到这一条除法指令时会发生0号中断出错。
谢谢指点 昨晚想明白之后 用计算器算了一遍 再加上百度印证了这个事实
danteng2000 2016-02-28
  • 打赏
  • 举报
回复
哦,知道了,王爽汇编不是有一个实验 要你自己做一个不会溢出的除法麽 你的答案就在里面,那个习题你应该有答案,和你自己的比较一下就明白了 你不能直接用这个除法,得自己设计一个能运行的子程序 你这个8086汇编 被除数放AX(只能是2个字节)里,除数放CX的时候(只能放CL,只能是1个字节) 商会被放到AL里,余数放AH里 当你除数(放CX里)是2个字节的时候,你必须把被除数当成4个字节的,不够4个字节就要高2个字节填0,高2个字节放DX里,低2个字节放AX里 商在AX中,余数在DX中 dword更复杂你得去看书 不过感觉你学太快了, 王爽的书之所以好用就是一个原则,实验和测试点不过关不要往下学。 假如无视这个那好处也基本没了。 无符号数除法指令 DIV(DIVision) 格式: DIV OPRD ---- 功能: 实现两个无符号二进制数除法运算. ---- 说明: 1. 其中OPRD为任一个通用寄存器或存储器操作数. ---- 2. 字节相除,被除数在AX中;字相除,被除数在DX,AX中,除数在OPRD中. 字节除法: (AL)<--(AX)/OPRD,(AH)<--(AX)MOD OPRD 字除法: (AX)<--(DX)(AX)/OPRD,(DX)<--(DX)(AX) MOD OPRD 3. 示例: DIV BETA [BX] DIV CX;商在AX中,余数在DX中 DIV BL;商在AL中,作数在AH中 4. 当除法的商产生溢出时,例如字节除法的商大于0FFH,字除法的商大于0FFFFH将 置溢出标志位OF=1,并产生一个类型0溢出中断. 5. 本指令不产生有效的标志位。
fornetuse123 2016-02-28
  • 打赏
  • 举报
回复
引用 6 楼 DelphiGuy 的回复:
mov ds,ax mov ax,table mov es,ax mov si,0 mov di,0 xor bx,bx mov ax,[0+54h+si] mov es:[0+5+di],ax mov dx,[54h+2h+si] mov es:[0+5+2+di],dx
想了半天才明白红色修改部分的作用,汇编还是没入门
fornetuse123 2016-02-28
  • 打赏
  • 举报
回复
0x86的除法指令正确执行是有条件的。这个条件是:被除数的高位寄存器数值,必须小于除数。 如果数据不满足这样的条件,被除数的高位寄存器数值大于或者等于除数(相当于除法运算后产生的商会是个跟被除数大小一样的数值级别,但是实际上用来存放商的实际寄存器数值级别只有被除数的一半大小,比如说被除数是32位寄存器,那么除数必须是16位寄存器,商也是默认用16位寄存器来保存的,你能用16位寄存器保存10000H这个数值么?),就会产生除法溢出。 会自动触发0号中断---除法溢出中断。 就你所举的例子: 被除数10353939H,它的高位寄存器数值1035远远大于除数3。商远远大于10000H,你让ax怎么保存 则在程序运行到这一条除法指令时会发生0号中断出错。
  • 打赏
  • 举报
回复
mov ds,ax mov ax,table mov es,ax mov si,0 mov di,0 xor bx,bx mov ax,[0+54h+si] mov es:[0+5+di],ax mov dx,[54h+2h+si] mov es:[0+5+2+di],dx
danteng2000 2016-02-27
  • 打赏
  • 举报
回复
注释一下,你到底要实现什么功能
JACK_GOD_123 2016-02-27
  • 打赏
  • 举报
回复
从debug中是不是可以看出div后面的指令出了问题 希望各位大大指教

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧