高分悬赏 王爽汇编第二版第8章实验7------debug做除法时溢出问题

DHSFK 2014-05-23 08:09:50
做到cx=6时就溢出,debug不下去了!求高手解答啊~~~

代码:

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'

dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514

dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000

dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226

dw 11452,14430,15257,17800

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 bx,0
mov si,0
mov di,0
mov cx,21

s0: mov ax,[bx] ;将年份按格式放入表格中
mov es:[si],ax
mov ax,2[bx]
mov es:2[si],ax



mov ax,ds:53h[bx] ;将收入按格式放入表格中
mov es:7h[si],ax ;这里答案是 mov es:5h[si],ax,个人认为我的代码是正确的
mov dx,ds:55h[bx]
mov es:5h[si],dx ;这里答案是 mov es:7h[si],ax,个人认为我的代码是正确的


div word ptr ds:0a7h[di] ;将平均收入按格式放入表格中
mov es:0dh[si],ax

mov ax,ds:0a7h[di] ;将人数按格式放入表格中
mov es:0ah[si],ax

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

loop s0



mov ax,4c00h
int 21h

codesg ends

end start
...全文
289 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Explorerlxz 2014-06-05
  • 打赏
  • 举报
回复
王爽老师书写的很好,这个章节还没讨论除法溢出呢,第十章子程序那里才涉及到,循序渐进! 楼主程序有几个小问题,intel CPU对字节顺序的处理方式遵循小尾方式,即高位字节存放于高地址,低位字节存放于低地址比如dword 12345678h在内存中从低到高的字节顺序是78h,56h,34h,12h。本题中在转存收入(双字)时,应依次存放!这点可由上面两图看出! 其它错误楼上几位已经说清楚了,楼主自己慢慢理解
Explorerlxz 2014-06-05
  • 打赏
  • 举报
回复

[code=text]assume cs:codesg
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,15257,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 si,0

mov ax,table
mov es,ax
mov di,0

mov bx,0a8h

mov cx,21

s: mov ax,[si] ;year
mov es:[di],ax
mov ax,[si+2]
mov es:[di+2],ax

mov ax,[si+54h] ;income
mov es:[di+5],ax
mov dx,[si+56h]
mov es:[di+7],dx

div word ptr [bx] ;average income
mov es:[di+0dh],ax

mov ax,[bx] ;number of employers
mov es:[di+0ah],ax

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

mov ax,0c00h
int 21h
codesg ends
end start[code]
我自己写的程序,不过参考借鉴了lz和ls的几个朋友
Alkaid_Seven 2014-06-05
  • 打赏
  • 举报
回复
mov ax,ds:53h[bx] ; //mov ax,ds:54h[bx] mov es:7h[si],ax ; // mov es:5h[si],ax mov dx,ds:55h[bx] ; //mov dx,ds:56h[bx] mov es:5h[si],dx ; // mov es:7h[si],dx div word ptr ds:0a7h[di] ; // div word ptr ds:0a8h[di] mov es:0dh[si],ax mov ax,ds:0a7h[di] ; // mov ax,ds:0a8h[di] mov es:0ah[si],ax 我运行了一下你的代码,将红色代码替换你原来的代码,就好了。 书上的答案是对的。
yuexicheng 2014-05-25
  • 打赏
  • 举报
回复
如果是因为除法溢出的问题写个子程序处理除法溢出就好了,下面是一个处理32位除法不会产生溢出的子程序
deal_divover:
                         ;传入参数(dx)=被除数的高16位 (ax)=被除数的低16位 (di)=16位的除数
         push bx    ;返回(dx)=商的高16位(ax)=商的低16位(di)=余数
         push ax
         mov ax,dx
         xor dx,dx
         div di
         mov bx,ax
         pop ax
         div di
         mov di,dx
         mov dx,bx
         pop bx
         ret
          
fastkb 2014-05-25
  • 打赏
  • 举报
回复
xor dx,dx div word ptr ds:0a7h[di] ;将平均收入按格式放入表格中 mov es:0dh[si],ax 做这个除法之前肯定DX里有值才导致的溢出。
「已注销」 2014-05-25
  • 打赏
  • 举报
回复
楼主,我也是学这一本的,不过这个实验我略过,帮顶!!!!!!!!!

21,499

社区成员

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

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