汇编语言(王爽)实验7
实验要求:
编程将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整) 结果也按照下面格式保存在table段中
本实验难度偏适中,主要理解思路和一个关键点的处理即可
具体思路和解释见代码区域
assume cs:codesg
data segment
;076a:0000 起始地址,每次递增4Byte
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 * 4 = 84byte
;076a:0054 起始地址,每次递增4Byte
dd 16, 22, 382, 1356, 2390,8000, 16000, 24486, 50065, 97479, 140417, 197514
dd 345980, 590827, 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000
;21 * dw = 42word = 84byte
;076a:00a8 起始地址,每次递增2Byte
dw 3, 7, 9, 13, 28, 38, 130, 220, 76, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226
dw 11542, 14430, 15257, 17800
;21*字 = 42byte
data ends
table segment
;076a:00e0 起始地址
db 22 dup ('year summ ne ?? ')
;076a:00e0+10h 存放数据地址
table ends
stack segment
dw 16 dup (0) ;栈空间
stack ends
codesg segment
start:
mov ax, data
mov ds, ax ;ds指向内存数据去
mov ax, stack
mov ss, ax ;ss指向栈区
mov sp, 16
mov ax, table
mov es, ax ;es指向table区
mov bx, 10h ;外层循环的游标
mov di, 0 ;数据区 db, dd, dw
mov cx, 21 ;外层循环的次数
outter:
push cx ;将外层循环次数入栈
mov cx, 4
mov si, 0 ;在es指向的table区每一行的游标
inner1:
mov al, [di + 0]
mov es:[bx+si], al
inc si
inc di
loop inner1
;inner内循环将年份数据送入到table区
mov byte ptr es:[bx+si], ' '
inc si
mov cx, 2 ;两次inner2内循环即可
sub di, 4 ;di为4,此时需要将di为0,以便将dd数据区送入到table区
inner2:
mov ax, [di + 0054h]
mov es:[bx+si], ax
add si, 2
add di, 2
loop inner2
;inner2内循环是将 收入 送入到 table区
mov byte ptr es:[bx+si], ' '
inc si
push di ;di为4入栈
sub di, 4
mov ax, di ;被除数的低字段
mov dx, 0 ;被除数的高字段
mov di, 2 ;除数
div di
mov di, ax ;将商赋给di
;找dw段的位置
;db增长为 0 , 4, 8, 12, 16, 20
;dd增长为 0 , 4, 8, 12, 16, 20
;dw增长为 0 , 2, 4, 6, 8, 10.....
;故dw的di为 di = (di - 4) / 2
;由于结果:商 可能为di,为16位,所以使用ax, dx来表示被除数
mov ax, [00a8h + di]
mov es:[bx+si], ax ;将雇员数送到table区
add si, 2
pop di ;di出栈,为4,以便下一次循环使用
mov byte ptr es:[bx+si], ' '
inc si
;进行除法操作算出人均收入
mov ax, es:[bx + 05h]
mov dx, es:[bx + 07h]
div word ptr es:[bx + 0ah] ;总收入/雇员数
mov es:[bx + si], ax ;将结果送到table区
add si, 2
mov byte ptr es:[bx+si], ' '
add bx, 10h ;将bx+10h,进行下一行的写入
pop cx ;将外层循环次数出栈
loop outter
mov ax, 4c00h
int 21h
codesg ends
end start
可以复制粘贴到编辑器里查看具体内容
1,思路逻辑要清晰,如何使用内外循环
2,在每次内循环中如何使用变量将db, dd, dw区依次赋值到table 区
3,理解db, dd, dw之间的间距和每次递增大小
结果如下
仔细对比可以发现,db, dd, dw数据都已写入到table区段