首页
社区
课程
招聘
[旧帖] [原创]王爽汇编 第8章编程题答案(思考了整整一天) 0.00雪花
发表于: 2012-11-17 22:21 1361

[旧帖] [原创]王爽汇编 第8章编程题答案(思考了整整一天) 0.00雪花

2012-11-17 22:21
1361
本人初来看雪,看到坛子里牛人如云,很是羡慕,看到论坛里面提到的王爽汇编一书确实经典。看的我是爱不释手。不知道各位有这个同感没?下面的程序是我通过不断调试,改进,写出来定的课后答案,希望各位指点一二,我感激不尽。

上面是题外话。进入正题

题目:实验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

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 3386
活跃值: (1413)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
其实  这样的问题你没必要发帖,在百度上一搜就出来,一般是没人回答你的。自己去http://www.baidu.com/s?word=%E6%B1%87%E7%BC%96+%E7%8E%8B%E7%88%BD+%E7%AD%94%E6%A1%88&tn=sitehao123&ie=utf-8 看看吧
2012-11-18 18:10
0
游客
登录 | 注册 方可回帖
返回
//