实验七
寻址方式在结构化数据访问中等的应用
要求
- 将data段中的数据按照如下格式写到table段中,并计算21年中的人均收入
- 结果也按照下面的格式保存在table段中
assume cs:code,ds:data,ss:stack
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'
;以上是表示21年的21个字符串 year 偏移地址 0
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是表示21年公司总收入的21个dword数据 sum 偏移地址 84
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800 ;表示每年的人数 偏移地址 168
data ends
table segment
;0123456789ABCDEF
db 21 dup ('year summ ne ?? ')
table ends
stack segment stack
db 128 dup (0)
stack ends
code segment
start: mov ax,data
mov ds,ax ;设置数据段
mov ax,stack
mov ss,ax
mov sp,128 ;设置栈段
mov ax,table
mov es,ax ;表示目的段地址 ds位源段地址
mov si,0 ;ds
mov di,84 ;ds
mov bp,168 ;ds
mov bx,0 ;es
mov cx,21
;'year summ ne ?? '
num: push ds:[si]
pop es:[bx]
push ds:[si+2]
pop es:[bx+2] ;将年份栈 year被替换
mov ax,ds:[di]
mov dx,ds:[di+2]
mov es:[bx+5],ax
mov es:[bx+7],dx ;表示将summ充填
push ds:[bp]
pop es:[bx+10]
div word ptr ds:[bp]
mov es:[bx+13],ax
add si,4
add di,4
add bp,2
add bx,10H
loop num
mov ax,4C00H
int 21H
code ends
end start
解释:
mov si,0 ;ds
mov di,84 ;ds
mov bp,168 ;ds
mov bx,0 ;es
其中使用es:[bx]来访问目的内存,即需要复制到哪里的地址
使用ds:[si]来访问年份的内存
使用ds:[di]来访问每年的收入
使用ds:[bp]来访问每年的员工数
'year summ ne ?? '这个占十六个字节,先使用21行这个字符串来表示这个table 然后将年份 每年收入 员工人数和平均工资充填其中
在求平均工资时使用的是16位除数,因此使用dx和ax分别作为被除数的高16位和低16位,商的结果存放在ax中,再讲ax移动到table表中的对应位置 es:[bx+13]
每一次循环表示充填一行数据即将 ‘year summ ne ??’ 替换成 年份 每年收入 员工人数和平均工资
下面这几条指令分别定义了ds的偏移地址分别表示 年份 每年收入和员工人数的偏移地址
mov si,0 ;ds
mov di,84 ;ds
mov bp,168 ;ds
mov bx,0 ;es
处理年份时使用两个入栈出栈的操作才能将一个年份存入 year 位置
push ds:[si]
pop es:[bx]
push ds:[si+2]
pop es:[bx+2] ;将年份栈 year被替换
下面这几条指令表示将 年份 每年收入 员工人数和’year summ ne ??'向后移动一个单位
add si,4
add di,4
add bp,2
add bx,10H