实验7 解析
实验7 寻址方式在结构化数据访问中的应用
解析:
方法一:将每个数据项逐个进行传输,共有4个数据项(分别是年份、收入、雇员数、人均收入)人均收入需要计算后得到,每个数据项又有21个元素,所以需要传输21次
assume cs:code
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
code segment
start:mov ax,data
mov ds,ax ;ds指向data
mov ax,table
mov es,ax ;es指向table
mov si,0
mov di,0
mov bx,0
;转移年份
mov cx,21 ;一共21个年份
year:mov ax,ds:[si] ;将数据中的年份低16位取出放入ax中
mov es:[bx],ax ;将ax中的数据放入table中
mov ax,ds:[si+2] ;将数据中的年份高16位取出放入ax中
mov es:[bx+2],ax ;将ax中的数据放入table中
add si,4 ;si+4指向下一个年份
add bx,16 ;bx+16指向下一个数组
loop year ;转移到year
;转移收入
mov bx,0
mov di,5 ;设定table存放收入的起始地址
mov cx,21
income:mov ax,ds:[si] ;转移收入低16位
mov es:[bx+di],ax
mov ax,ds:[si+2] ;转移收入高16位
mov es:[bx+di+2],ax
add bx,16 ;bx+16指向下一组数据
add si,4 ;si+4指向下一个收入
loop income ;转移到income
;转移雇员数
mov bx,0
mov di,10 ;设定table存放雇员数的起始地址
mov cx,21
Num:mov ax,ds:[si] ;转移雇员数(只有两字节,所以使用ax传输一次即可)
mov es:[bx+di],ax
add bx,16 ;bx+16指向下一组数据
add si,2 ;si+2指向下一个雇员数
loop Num
;计算人均收入
mov bx,0
mov cx,21
pcome:mov ax,es:[bx+5] ;低16位放入ax中
mov dx,es:[bx+5+2] ;高16位放入dx中
div word ptr es:[bx+10] ;除以人数
mov es:[bx+13],ax ;商存放在ax中
add bx,16
loop pcome
mov ax,4c00h
int 21h
code ends
end start
方法二:一次传输一组数据,一共传输21次
assume cs:code
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
code segment
start:mov ax,data
mov ds,ax ;ds指向data
mov ax,table
mov es,ax ;es指向table
mov si,0
mov di,0
mov bx,0
mov cx,21 ;一个21组数据
s:;转移年份(4字节)
mov ax,ds:[si] ;转移年份低16位
mov es:[bx],ax
mov ax,ds:[si+2] ;转移年份高16位
mov es:[bx+2],ax
;转移收入(4字节)
mov ax,ds:[si+84] ;转移收入低16位
mov es:[bx+5],ax
mov ax,ds:[si+84+2] ;转移收入高16位
mov es:[bx+7],ax
;转移雇员数(2字节)
mov ax,ds:[168+di] ;转移雇员数(只有2字节,所以使用ax转移一次即可)
mov es:[bx+10],ax
;计算人均收入(2字节)
mov ax,es:[bx+5] ;将收入的低16位放入ax中
mov dx,es:[bx+5+2] ;将收入的高16位放入dx中
div word ptr es:[bx+10] ;除以雇员数
mov es:[bx+13],ax ;将商保存(除法后商存放在ax中)
add di,2 ;di+2指向下一个雇员数
add si,4 ;si+4指向下一个年份和收入
add bx,16 ;bx+16指向下一组数据
loop s
mov ax,4c00h
int 21h
code ends
end start
将上面程序在DOS中运行后效果如下: