入门学习汇编,个人感觉是一件很枯燥的事情,因为汇编的基础学习很难有像其他高级语言那样,有花巧的技术来吸引你,即使像C语言那样printf()输出到控制台的功能都要到后面深入学习才会有,运行结果只能使用debug命令。为了调动自己的积极性,下面将自己完成王爽老师的《汇编语言》一书中的实验7的答案粘贴出来,秀一秀,自娱自乐一下^_^:
题目:Power idea公司从1975年成立一直到1995年基本情况如下:
年份 | 收入(千美元) | 雇员(人) | 人均收入(千美元) |
---|---|---|---|
1975 | 16 | 3 | ? |
1976 | 22 | 7 | ? |
1977 | 382 | 9 | ? |
1978 | 1356 | 13 | ? |
1979 | 2390 | 28 | ? |
1980 | 8000 | 38 | ? |
: | |||
: | |||
: | |||
1995 | 5937000 | 17800 | ? |
下面的程序中,已经定义好了这些数据:
assume cs:codesgdata 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 endstable segment db 21 dup ('year summ ne ?? ')table ends
编程:将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整),结果也按照如下所示格式存在table段中:
年份(4字节) | 空格 | 收入(4字节) | 空格 | 雇员数(2字节) | 空格 | 人均收入(2字节) | 空格 | |
行内地址 1年占1行 每行的 起始地址 | 0 1 2 3 | 4 | 5 6 7 8 | 9 | A B | C | D E | F |
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:tabledata 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 endstable segment db 21 dup ('year summ ne ?? ')table endscodesg segmentstart: 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 21hcodesg endsend start
上面的代码没有按照题目的提示来做,按提示还真不知道怎么做,如果你有好的解法,欢迎来拍板,写这篇博客的另外一个目地就是希望能结交一些对汇编感兴趣的朋友。
下面是我的运行结果:
个人感觉解本题,找准数据的地址很重要!