这个实验刚做的开始有点问题,搁置了几天,今天做了修改,感谢大佬的文章。
总体思路:这是个关于寻址方式的实验,年份和收入为四个字节,雇员为两个字节,年份和收入可共用一个寄存器di,用[di+idata]方式区分,雇员数可用si定位,dx表示行数,每次换行dx+10H,di+4,si+2。bx控制换行,[di+idata]负责指向下一个年份数据及总收入数据,[si]负责指向下一个雇员人数。
1.题目框架
assume cs:codesg,ds:data
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 11542,14430,15257,17800
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
codesg segment
start:
mov ax,4c00h
int 21h
codesg ends
end start
2.设置段寄存器
mov bx,data 设置ds指向(取数据处)
mov ds,bx
mov bx,table 设置es指向(存数据处)
mov es,bx
mov si,0
mov di,0
3.21行循环21次
mov cx,21 共21年的数据;
s:(留白)
add bx,10H 调整行数
add di,4 调整di、si指向下一个数据
add si,2
loop s
4.复制年份
mov ax,[di] 年份前两个字节;
mov es:[bx],ax bx标记行数
mov ax,[di+2] 年份后两个字节;
mov es:[bx+2],ax +2指向bx行具体位置
5.复制总收入
mov ax,[di+84] 存储被除数低16位;
mov es:[bx+5],ax
mov dx,[di+84+2] 存储被除数高16位; 注:div规则:被除数为32位时,ax存储低16位,dx存储高16位
mov es:[bx+7],dx
6. 复制雇员人数
mov bp,[si+168]
mov es:[bx+10],bp
7. 计算人均收入并存入
div bp
mov es:[bx+13],ax
8.汇总
assume cs:codesg,ds:data
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 11542,14430,15257,17800
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
codesg segment
start:
mov ax,data 设置ds指向(取数据处)
mov ds,ax
mov ax,table 设置es指向(存数据处)
mov es,ax
mov si,0
mov di,0
mov cx,21 共21年的数据;
s:mov ax,[di] 年份前两个字节;
mov es:[bx],ax bx标记行数
mov ax,[di+2] 年份后两个字节;
mov es:[bx+2],ax +2指向bx行具体位置
mov ax,[di+84] 存储被除数低16位;
mov es:[bx+5],ax
mov dx,[di+84+2] 存储被除数高16位; 注:div规则:被除数为32位时,ax存储低16位,dx存储高16位
mov es:[bx+7],dx
mov bp,[si+168]
mov es:[bx+10],bp
div bp
mov es:[bx+13],ax
add bx,10H 调整行数
add di,4 调整di、si指向下一个数据
add si,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start