实验7 寻址方式在结构化数据访问中的应用,即寻址方式与div指令的综合运用
assume cs:codesg
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个字符串
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型数据
dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226
dw 11542, 14430, 15257, 17800
;以上是表示21年公司雇员人数的21个word型数据
data ends
table segment
;结构体table段在debug中一行的格式
db 21 dup('year summ ne ?? ')
table ends
codesg segment
start: mov ax, data
mov ds, ax
mov ax, table
mov es, ax
mov bx, 0 ;定位结构体table段中的数组元素
mov di, 0 ;定位data中的4字节数据
mov si, 0 ;定位data中的2字节数据
mov cx, 15H
s:;转移年份到结构体table段中
mov ax, ds:[di];
mov es:[bx], ax
mov ax, ds:[di+2]
mov es:[bx+2], ax
;添加空格20,这里不用00因为收入的4字节数据最后的00容易混淆;为了统一,下面统一用20作为空格
mov byte ptr es:[bx+4], 20H
;转移收入到结构体table段中
;作为被除数
mov ax, ds:[di+84];
mov es:[bx+5], ax
mov ax, ds:[di+86]
mov es:[bx+7], ax
;添加空格
mov byte ptr es:[bx+9], 20H
;转移雇员数量到结构体table段中
;作为除数
mov ax, ds:[si+168]
mov es:[bx+10], ax
;添加空格
mov byte ptr es:[bx+12], 20H
;计算人均收入,并转移人均收入到结构体table段中
mov ax, es:[bx+5] ;低16位
mov dx, es:[bx+7] ;高16位
div word ptr es:[bx+10]
mov es:[bx+13], ax ;因为题目中要求人均收入取整,所以用ax存储除法操作的商,不需要余数
;添加空格
mov byte ptr es:[bx+15], 20H
;一个循环操作完成,bx加16(在debug中一行刚好16字节),di加2
add bx, 16
add di, 4
add si, 2
loop s
mov ax, 4c00h
int 21h
codesg ends
end start
效果如下:
绿色方框圈起来的部分,依次为:收入、雇员数量、人均收入、年份。