实验7
Power idea 公司从 1975 年成立一直到 1995 年的基本情况如下:
年份 | 收入(千美元) | 雇员(人) | 人均收入(千美元) |
---|---|---|---|
1975 | 16 | 3 | ? |
1976 | 22 | 7 | ? |
1977 | 382 | 9 | ? |
1978 | 1356 | 13 | ? |
1979 | 2390 | 28 | ? |
1980 | 8000 | 38 | ? |
... | |||
1995 | 5937000 | 17800 | ? |
下面的程序中,已经定义好了这些数据:
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
db 21 dup('year summ ne??')
table ends
编程,将 data 段中的数据按如下格式写入 table 段中,并计算 21 年中的人均收入(取整),结果也按照下面的格式保存在 table 段中:
assume cs:code, 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 个字符串
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
db 21 dup('year summ ne?? ')
table ends
stack segment
dw 20 dup(0)
stack ends
code segment
start:
mov ax, table
mov ax, data
mov ax, stack
mov ss, ax
mov sp, 40
mov bp, 0
mov bx, 0
push bx ; 保存年份的偏移地址 ss:38
mov bx, 84
push bx ; 保存收入的偏移地址 ss:36
mov bx, 168
push bx ; 保存雇员的偏移地址 ss:34
mov bx, 0
push bx ; 保存 table 的行号 ss:32
mov cx, 21
lp0:
push cx
; 21 次循环
; 设置 4 字节年份
mov cx, 2
mov si, 0
lp1:
mov ax, data
mov ds, ax
mov bp, 38
mov bx, [bp]
push [bx]
add bx, 2
mov [bp], bx
mov bp, 32
mov bx, [bp]
mov ax, table
mov ds, ax
pop [bx+si]
add si, 2
loop lp1
; 设置 1 个字节的空格
mov byte ptr [bx+si], 20h
; 设置 4 个字节收入
mov cx, 2
mov si, 0
lp2:
mov ax, data
mov ds, ax
mov bp, 36
mov bx, [bp]
push [bx]
add bx, 2
mov [bp], bx
mov bp, 32
mov bx, [bp]
mov ax, table
mov ds, ax
pop [bx+5+si]
add si, 2
loop lp2
; 设置一个字节的空格
mov byte ptr [bx+5+si], 20h
; 设置两个字节的雇员
mov ax, data
mov ds, ax
mov bp, 34
mov bx, [bp]
push [bx]
add bx, 2
mov [bp], bx
mov ax, table
mov ds, ax
mov bp, 32
mov bx, [bp]
pop [bx+0ah]
; 设置一个字节的空格
mov byte ptr [bx+0ch], 20h
; 做除法,因为除数是 16 位的,所以被除数必须是 32 位的,dx 存放
; 高 16 位,ax 存放低 16 位
mov ax, [bx+5]
mov dx, [bx+7]
mov si, [bx+0ah]
div si
; 将 ax 中的商存放
mov [bx+0dh], ax
; 设置行尾的空格
mov byte ptr [bx+0fh], 20h
add bx, 16
mov [bp], bx
pop cx
dec cx
cmp cx, 0
jne lp0
mov ax, 4c00h
int 21h
code ends
end start
调试运行可以得出正确答案:
-d 0b52:0 150
0B52:0000 31 39 37 35 20 10 00 00-00 20 03 00 20 05 00 20 1975 .... .. ..
0B52:0010 31 39 37 36 20 16 00 00-00 20 07 00 20 03 00 20 1976 .... .. ..
0B52:0020 31 39 37 37 20 7E 01 00-00 20 09 00 20 2A 00 20 1977 ~... .. *.
0B52:0030 31 39 37 38 20 4C 05 00-00 20 0D 00 20 68 00 20 1978 L... .. h.
0B52:0040 31 39 37 39 20 56 09 00-00 20 1C 00 20 55 00 20 1979 V... .. U.
0B52:0050 31 39 38 30 20 40 1F 00-00 20 26 00 20 D2 00 20 1980 @... &. ..
0B52:0060 31 39 38 31 20 80 3E 00-00 20 82 00 20 7B 00 20 1981 .>.. .. {.
0B52:0070 31 39 38 32 20 A6 5F 00-00 20 DC 00 20 6F 00 20 1982 ._.. .. o.
0B52:0080 31 39 38 33 20 91 C3 00-00 20 DC 01 20 69 00 20 1983 .... .. i.
0B52:0090 31 39 38 34 20 C7 7C 01-00 20 0A 03 20 7D 00 20 1984 .|.. .. }.
0B52:00A0 31 39 38 35 20 81 24 02-00 20 E9 03 20 8C 00 20 1985 .$.. .. ..
0B52:00B0 31 39 38 36 20 8A 03 03-00 20 A2 05 20 88 00 20 1986 .... .. ..
0B52:00C0 31 39 38 37 20 7C 47 05-00 20 D2 08 20 99 00 20 1987 |G.. .. ..
0B52:00D0 31 39 38 38 20 EB 03 09-00 20 E9 0A 20 D3 00 20 1988 .... .. ..
0B52:00E0 31 39 38 39 20 CA 42 0C-00 20 C5 0F 20 C7 00 20 1989 .B.. .. ..
0B52:00F0 31 39 39 30 20 18 0D 12-00 20 03 16 20 D1 00 20 1990 .... .. ..
0B52:0100 31 39 39 31 20 38 1F 1C-00 20 22 20 20 E0 00 20 1991 8... " ..
0B52:0110 31 39 39 32 20 58 19 2A-00 20 16 2D 20 EF 00 20 1992 X.*. .- ..
0B52:0120 31 39 39 33 20 28 44 39-00 20 5E 38 20 04 01 20 1993 (D9. ^8 ..
0B52:0130 31 39 39 34 20 28 F0 46-00 20 99 3B 20 30 01 20 1994 (.F. .; 0.
0B52:0140 31 39 39 35 20 68 97 5A-00 20 88 45 20 4D 01 20 1995 h.Z. .E M.
0B52:0150 00 .