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

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

实验内容

 


以下是我解答的完整的代码:

:>----------------------------------------------------------------------------------------

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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。