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'
; 以上是表示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,200,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
; 以上是表示21年公户雇员人数的21个word型数据
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
code segment
start:
code ends
end start
答案
assume cs:codesg ds:data ss:stack
data segment
db '1975','2176','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,200,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
; 以上是表示21年公户雇员人数的21个word型数据
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
stack segment
db 0
stack ends
code segment
start:
; 指定data段的地址
mov ax, data
mov ds, ax
; 设置循环的次数
mov cx, 21
; 初始化寻址寄存器
mov si, 0
mov di, 0
mov bx, 0
s:
; 设置table段的内存地址
mov ax, table
mov es, ax
; 读取年份。一个年份数据总共占用4个字节,ax寄存器最多能够读取2个字节,所以要读 si 和 [si+2]。
mov ax, ds:[si]
mov es:[bx], ax
mov ax, [si+2]
mov es:[bx+2], ax
; 读取收入。一个收入数字占用2个字,也就是4个字节,所以不能用ax来保存。所以只能用 dx 和 ax 两个寄存器联合存放。dx 存放高地址,ax 存放低地址。
mov ax, [si + 84]
mov es:[bx+5], ax
mov dx, [si + 84 + 2]
mov es:[bx+7], dx
; 把当前ax的值保存在栈中
push ax
; 把雇员数保存在table表中第11个字节
mov ax, [di + 84 + 84]
mov es:[bx+10], ax
; 把栈顶的值还原给ax中
pop ax
; 由于被除数是32位,所以除数要16位
div word ptr es:[bx+10]
; 由于被除数是32位,ax的值为商,赋值table表中的对应的位置
mov es:[bx+13], ax
; 雇员每次循环要添加2个字节
add di, 2
; table中每一行占用16个字节
add bx, 16
; 年份和收入每次循环要添加4个字节
add si, 4
loop s
mov ax, 4c00h
int 21h
code ends
end start
结果图
网友评论