本人初来看雪,看到坛子里牛人如云,很是羡慕,看到论坛里面提到的王爽汇编一书确实经典。看的我是爱不释手。不知道各位有这个同感没?下面的程序是我通过不断调试,改进,写出来定的课后答案,希望各位指点一二,我感激不尽。
上面是题外话。进入正题
题目:实验7 寻址方式在结构化数据访问中的应用
具体内容挺多的,就不列了,感兴趣的朋友可以百度。”汇编语言 王爽“大概意思是把数据段中的数据格式化的放到table段中。
刚刚看这个题目,本来信心满满的可以一次性搞定。后来才知道,对于一个初学者来说挺棘手的。
运行环境:win8CP版 编程软件:MASM for Windows 集成实验环境共享版
我个人认为,整个程序难就难在32位数据的取值,和16位数据的不同长度的取值。以前老是想把这3个结构中整到一块去,弄了半天也没搞的定,后来想了个笨方法
mov ax,[si+168]
mov es:[bx],ax;保存雇员人数
add si,2
用SI 来做员工数据的首地址。依次来提取数据,并写入。
还有就是除法。老是提示溢出。我想估计是程序提取数据的时候估计把高位做除数了。后来调试完也就证实了这一想法!
总结:这一课题坐下来感觉扎实了许多。把以前的都翻出来看看。巩固了一下,特别是堆栈的压栈
出栈。程序代码我写了详细的注释。希望大家看看,也把你们写的答案贴在下面,一起探讨探讨。。。
程序代码如下:
table segment
db 21 dup('yuar summ me ?? ')
table ends
DSEG 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,45257,17800
;以上是表示21年公司雇员人数的21个Word型数据
DSEG ENDS
CSEG SEGMENT
assume cs:CSEG, ds:DSEG, es:table
start: mov ax, dseg
mov ds, ax
mov ax,table
mov es,ax
mov cx,015h
mov bx,0h;定义写入公司信息指针
mov di,0h;定义读取公司信息指针
mov si,0h;定义读取公司员工人数的基指指针
s: mov ax,[di]
mov es:[bx],ax
ADD bx,2
mov ax,[di+2]
mov es:[bx],ax;保存一年年份
ADD bx,2
mov al,20h
mov es:[bx],al;根据各式需要写入一个空格
inc bx
mov ax,[di+84]
mov es:[bx],ax
ADD bx,2
mov ax,[di+86]
mov es:[bx],ax;保存公司收入
ADD bx,2
mov al,20h
mov es:[bx],al;根据各式需要写入一个空格
inc bx
mov ax,[si+168]
mov es:[bx],ax;保存雇员人数
add si,2
push bx ;暂存行指针
mov dx,[di+86] ;高16位
mov ax,[di+84];低16位
mov bx,es:[bx]
div bx
pop bx
push ax;暂时保存除法的结果,该寄存器用来做添加空格用
add bx,2
mov al,20h
mov es:[bx],al;根据各式需要写入一个空格
inc bx
pop ax
mov es:[bx],ax;将除法后的结果写入
add bx,2
mov al,20h
mov es:[bx],al;根据各式需要写入一个空格
add di,4
inc bx
loop s
mov ax, 4c00h ;程序结束,返回到操作系统系统
int 21h
CSEG ENDS
END start
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!