实验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                                                .
Posted on 2015-08-04 22:49  mconintet  阅读(672)  评论(0编辑  收藏  举报