bitianchi 发表于 2011-10-20 08:52:51

小甲鱼老师你在哪

assume cs:code,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','1996'
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
data ends
table segment
db 21 dup('year summ ne ??')
table ends

code segment
start:
mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov bx,0
mov di,0
mov si,0
mov cx,21
s:mov al, ;年份
mov es:,al
mov al,
mov es:,al
mov al,
mov es:,al
mov al,
mov es:,al

mov ax, ;收入
mov dx,
mov es:,ax
mov es:,dx

mov ax, ;人数
mov es:,ax

mov ax, ;人均收入
mov bx,
div word ptr ax
mov es:,

add bx,4
add si,2
add di,16

loop s
mov ax,4c00h
int 21h
code ends
end start

显示divide overflow
求助小甲鱼老师

后知淡然 发表于 2011-10-20 09:45:42

{:1_1:}除法溢出了!

tsembrace 发表于 2011-10-20 09:57:58

你这代码我就根本编译通不过~
1、错误
mov ax, ;人均收入
;熟悉下div用法,下面的bx应为dx
mov bx,
;下面这句,ax已经是word型了,不需要指定ptr,但这里的问题是除数应该是员工数,而不是ax
div word ptr ax
;下面内存空间数据传输要用reg做中介的;况且你这句本身在这个代码段里也让人摸不着头脑,你这句用到了div的结果么?
mov es:,

上面整段改为:
mov ax, ;人均收入
mov dx,
div word ptr
mov es:,ax 2、优化mov al, ;年份
mov es:,al
mov al,
mov es:,al
mov al,
mov es:,al
mov al,
mov es:,al
调整为:
mov ax, ;年份
mov es:,ax
mov ax,
mov es:,ax 3、经过上述修改,发现编译依然有问题,发现:
3.1 数据区收入部分你少了一年的收入数,自己去数数吧
3.2 table区预设的字符串你少了一个字节,导致每行只有15byte,循环递增时候add di,16不能正确进入下一行。
;缺少最后一个空格
db 21 dup('year summ ne ?? ')
我估计你直接写完代码也就去调试了,调试了发现通不过就拿这儿来了;错误别人可以帮你指出的,粗心却需要自己认真些去克服,不然,多少有浪费彼此时间的味道~


bitianchi 发表于 2011-10-20 12:50:21

谢谢楼上,粗心是挺害人的
页: [1]
查看完整版本: 小甲鱼老师你在哪