|

楼主 |
发表于 2012-7-5 11:17:03
|
显示全部楼层
拜托老鸟帮俺看一下吧。。。为什么老是显示 Devide overflow :L:L:L
assume cs:codesg,ds:datasg,ss:stacksg,es:tablesg
datasg 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,187514
dd 345980,590827,803530,1183000,2759000,3753000,4649000,5937000
;以上是表示21年公司总收的21个dword型数据
dw 3,7,9,13,28,130,220,476,778,1001,1442,2258,2793,4037,5635,2886
dw 11542,14430,15257,17899
;以上是表示21年公司雇员人数的21个word型数据
datasg ends
tablesg segment
db 21 dup('year sumn ne ?? ')
tablesg ends
stacksg segment stack
db 0
stacksg ends
codesg segment
start: mov ax,tablesg
mov es,ax ;es指向tablesg段
mov ax,datasg
mov ds,ax ;将datasg段定义为数据段
mov ax,stacksg
mov ss,ax
mov sp,10h ;将stacksg段定义为栈段
mov bx,0
mov cx,21 ;设置循环次数为21次,因为是21年的数据
s0: push cx ;将CS入栈保存循环次数
;复制年份和收入
mov cx,4 ;设置循环次数为4次,因为是4个字节
mov si,0
mov di,0 ;将偏移地址清零
s1: mov al,ds:[bx+si] ;用bx来控制行,si来控制列,idata来控制特定的位置
mov es:[bx+di],al ;用al不用ax,每次传送一个字节
mov al,ds:[bx+si+54h] ;前八十四个字节是年份
mov es:[bx+di+5],al ;第五行开始,第四行是空格
inc si
inc di
loop s1
;复制人数
mov cx,2 ;设置循环次数为2次,因为是2个字节
mov si,0
mov di,0 ;将偏移地址清零
s2: mov al,ds:[bx+si+0a8h]
mov es:[bx+di+13],al
inc si
inc di
loop s2
;计算人均收入
mov ax,es:[bx+5] ;将低位放入ax中
mov dx,es:[bx+7] ;将高位放入dx中
div word ptr es:[bx+10]
mov es:[bx+13],ax
pop cx ;将CS出栈
add bx,10h ;推进一行
loop s0
mov ax,4c00h
int 21h ;中断程序正常退出
codesg ends
end start
|
|