实验内容
下面的程序中已经定义好了这些数据:
assume cs:codesg
data segment
db ‘1975’,’1976’,’1977’,’1978’,’1980’,’1980’,’1981’,’1982’,’1983’
db ‘1984’,’1985’,’1986’,’1987’,’1988’,’1989’,’1990’,’1991’,’1992’
db ‘1993’,’1994’,’1995’
;以上是表示21年的21个字符串(每个字符串占4个字节)
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型数据(每个占4个字节)
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型数据(每个占2个字节)。
data ends
table segment
db 21 dup(‘year summ ne ?? ‘)
table ends
codesg segment
start:
codesg ends
end start
编程:将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整),结果也按照下表所示的格式保存在table段中。
以下是我解答的完整的代码:
:>----------------------------------------------------------------------------------------
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‘
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
data ends
stack segment
dw 0,0,0,0,0,0,0,0 ;为了更好的理解栈,这里使用了栈用来保存数据
stack ends
table segment
db 21 dup (‘year summ ne ?? ‘)
table ends
codesg segment
start: mov ax, data ;初始化ds段寄存器为data
mov ds, ax
mov ax, table ;初始化es段寄存器为table
mov es, ax
mov ax, stack ;初始化ss段寄存器为stack
mov ss, ax
mov sp, 10H ;初始化ss栈段指针sp
mov bx, 0 ;这里用bx控制对table数据的行移动,每次移动16个字节
mov bp, 0 ;用bp指向数据段各部分数据的首地址(附加功能:暂存出栈数据)
mov si, 0 ;用si来移动结合bp取出data段的数据
mov di, 0 ;用di来移动结合bx来访问table的每行的各列数据的首地址
push si ;si先入栈因为si用来移动取出data中的数据,但日期数据和总收入
;数据的移动量是4个字节,而雇员人数的移动量是2个字节,为了用
;si来统一操作,所以想到用栈来保存si取平均收入的移动量。
mov cx, 15H ;cx用来控制对table的行移动(共21行=15H)
s0: mov ax, [si]
mov dx, [si].2H
mov es:[bx], ax
mov es:[bx].2H, dx
;以上是复到data中的日期数据到table中每行的‘year‘
mov bp, 54H
mov di, 5H
mov ax, ds:[bp][si]
mov dx, ds:[bp][si].2H
mov es:[bx][di], ax
mov es:[bx][di].2H, dx
;以上是复到data中的日期数据到table中每行的‘summ‘
pop bp
push si
mov si, bp
;取出si为2的平均收入的移动量,并保存移动量为4的si
mov bp, 0A8H
mov di, 0DH
div word ptr ds:[bp][si]
mov es:[bx][di], ax
;算出平均收入,并保存到table每行的‘??‘
mov di, 0AH
mov ax, ds:[bp][si]
mov es:[bx][di], ax
;从data中复制公司雇员人数,并保存到table每行的‘ne‘
add si, 2H ;当前的si每次加2的移动量(因为,si可操作人数部分的数据)
pop bp
push si
mov si, bp
;以上是将si改为每次加4的移动量(即,si改为操作日期、收入数据),并且将
;si每次加2的移动量入栈保存
add si, 4H ;当前的si每次加4的移动量(si可操作日期、收入数据部分的数据)
add bx, 10H ;跳向table下一行的首地址
loop s0 ;重复以上的操作
mov ax, 4c00H
int 21H
codesg ends
end start
:<-----------------------------------------------------------------------------------------
以下是运行后table段中的数据以及对应的ASCII码表示:
总结:
代码写得有点长,因为还是刚学不久,但整个实验题做下来对表在内存中的保存有了很清晰的理解,继续加油学习! 如果大家有更好的代码欢迎分享。
------------- 以上的习题部分及代码引用于王爽老师的<<汇编语言>>第二版 ----------------
本文出自 “9256624” 博客,请务必保留此出处http://9266624.blog.51cto.com/9256624/1616257
学习<<汇编语言 -王爽>>这本书一段时间,自已完成的一道实试题
原文地址:http://9266624.blog.51cto.com/9256624/1616257