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','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
code segment
start: mov ax,data
mov ds,ax
mov ax,table
mov es,ax
mov bx,0
mov si,84
mov di,00a8h
mov cx,21
mov bp,0
s: mov ax,ds:[si]
mov dx,ds:[si+2]
mov bx,ds:[di]
div bx
mov es:[bp],ax
add si,4
add di,2
inc bp
inc bp
loop s
mov ax,4c00h
int 21h
code ends
end start
加载程序后,观察数据段。年份从076A:0000开始,076A:0053结束,076A:0054开始是双字的十进制的16,第一个被除数,si填入十进制84,用si存储偏移地址定位被除数;低位送入ax,高位[si+2]送入dx;
用di存储偏移地址,定位除数,第一个除数地址076A:00A8,di存入00A8H;bp存放es段偏移地址,结果存放es:[bp],被除数是双字类型,除数是字类型,结果是两个字节,故每次循环最后si+4,di+2,bp+2;
运行后结果,0778:0000处 0005;0778:0002处0003,最后一个结果0778:0029处014D