码迷,mamicode.com
首页 > 编程语言 > 详细

学习<<汇编语言 -王爽>>这本书一段时间,自已完成的一道实试题

时间:2015-03-01 17:13:35      阅读:332      评论:0      收藏:0      [点我收藏+]

标签:汇编   汇编语言   实验题解答   内存中表数据的储存   

实验七 寻址方式在结构化数据访问中的应用(书中第172页)

实验内容

 

技术分享 

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

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年公司总收入的21dword型数据(每个占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年公司雇员人数的21word型数据(每个占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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!