王爽《汇编语言》实验7

入门学习汇编,个人感觉是一件很枯燥的事情,因为汇编的基础学习很难有像其他高级语言那样,有花巧的技术来吸引你,即使像C语言那样printf()输出到控制台的功能都要到后面深入学习才会有,运行结果只能使用debug命令。为了调动自己的积极性,下面将自己完成王爽老师的《汇编语言》一书中的实验7的答案粘贴出来,秀一秀,自娱自乐一下^_^:

题目:Power idea公司从1975年成立一直到1995年基本情况如下:

年份收入(千美元)雇员(人)人均收入(千美元)
1975163?
1976227?
19773829?
1978135613?
1979239028?
1980800038?
:   
:   
:   
1995593700017800?

 下面的程序中,已经定义好了这些数据:

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,11430,15257,17800
   ; 以上是表示21年公司雇员人数的21个word型数据
data ends

table segment
   db 21 dup ('year summ ne ?? ')
table ends

编程:将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整),结果也按照如下所示格式存在table段中:

 年份(4字节)空格收入(4字节)空格雇员数(2字节)空格人均收入(2字节)空格
行内地址
1年占1行
每行的
起始地址
0  1  2  345  6  7  89A  BCD  EF
Table:0'1975' 16 3 ? 
Table:10H'1976' 22 7 ? 
Table:20H'1977' 382 9 ? 
Table:30H'1978' 1356 13 ? 
Table:40H'1979' 1390 28 ? 
Table:50H'1980' 8000 38 ? 
:        
Table:140H'1995' 5937000 17800 ? 

提示:可将data段中的数据看成是多个数组,而将table中的数据看成一个结构型数据的数组,每个结构型数据中包含多个数据项。可用bx定位每个结构型数据,用idata定位数据项,用si定位数组项中每个元素,对于table中的数据的访问可采用[bx].idata和[bx].idata[si]的寻址方式。

个人的解答:

assume cs:codesg,ds:data,ss:table

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,11430,15257,17800
   ; 以上是表示21年公司雇员人数的21个word型数据
data ends

table segment
   db 21 dup ('year summ ne ?? ')
table ends

codesg segment
start: mov ax,data
       mov ds,ax
       mov bx,0              ; 设置date段的地址
       mov dx, table
       mov ss,dx
       mov bp,0              ; 设置table段的地址

       mov di,54h            ; 公司总收入的起始偏移地址
       mov si,0A8h           ; 公司雇员的起始偏移地址

       mov cx,21
    s: mov ax,[bx]
       mov dx,[bx+2]
       mov [bp],ax
       mov [bp+2],dx         ; 将date段中的年份数据存放到table段的前四个字节单元处

       mov ax,[bx+di]
       mov dx,[bx+di+2]
       mov [bp+5], ax
       mov [bp+7], dx        ; 将date段中的总收入存放到table段的第6个位置的双字单元处

       div word ptr [si]     ; 得到除数:公司雇员数
       mov [bp+13], ax       ; 将得到的取整后的结果存放到table段的第13个位置的字单元处

       mov ax,[si]
       mov [bp+10], ax       ; 将date段中的公司雇员人数存放到table段的第10个位置的字单元处

       add bx,4
       add si,2
       add bp,10H
       loop s

       mov ax,4c00h 
       int 21h

codesg ends

end start

上面的代码没有按照题目的提示来做,按提示还真不知道怎么做,如果你有好的解法,欢迎来拍板,写这篇博客的另外一个目地就是希望能结交一些对汇编感兴趣的朋友。

下面是我的运行结果:

个人感觉解本题,找准数据的地址很重要!

转载于:https://my.oschina.net/websoft/blog/76630

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值