<div class="blockcode"><blockquote>assume cs:codesg,ds:data,es:table,ss:stacksg
data segment ;错误的地方我在下方注释了
db '1975','1976','1977','1978','1979','1980','1981','1982','1983','1984','1985'
db '1986','1987','1988','1989','1990','1991','1992','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 11542,14430,15257,17800
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
stacksg segment
dw 0,0,0,0,0 ;栈的定义用dw,不然后面会出错
stacksg ends
codesg segment
start:mov ax,table
mov es,ax
mov ax,data
mov ds,ax
mov ax,stacksg
mov ss,ax
mov sp,10 ;修改栈顶指针
mov di,0
mov si,0 ;si的位置改到这里
mov cx,21
s:push cx
mov cx,4
mov bx,0
;你原本mov si,0写在这里,每次进入循环都只是读data段第一个字节
s1: mov al,byte ptr ds:[si] ;更改s1的位置
mov byte ptr es:[bx+di],al
mov al,byte ptr ds:[si+84]
mov byte ptr es:[bx+di+5],al
inc bx
inc si
loop s1
pop cx
add di,16
loop s
mov si,0
mov di,0
mov cx,21
s2:push cx
mov bx,0 ;把这句放到这里,不然每次进入循环都会置bx为0
mov cx,2
s3: ;把 mov bx,0放在这里的话,你后面的inc bx就没有意义了
mov al,byte ptr ds:[168+di]
mov byte ptr es:[si+10+bx],al
inc bx
inc di
loop s3
pop cx
add si,16 ;table段的下一行,是16,不是4
loop s2
mov bx,0
mov cx,21
s4:mov ax,es:[5+bx] ;高低位你弄反了,所以会发生除法溢出
mov dx,es:[7+bx] ;把5和7换过来
div word ptr es:[10+bx]
mov es:[13+bx],ax
add bx,16
loop s4
mov ax,4c00h
int 21h
codesg ends
end start