汇编语言:寻址方式在结构化数据访问中的应用

任务说明:某公司从1975成立一直到1995年的基本情况如下:

年份 收入(千美元) 雇员(人) 人均收入(千美元)
1975 16 3 ?
1976 22 7 ?
1977 382 9 ?
1978 1356 13 ?
1979 2390 28 ?
8000 38 ?
1995 5937000 17800 ?

已知程序中的数据按下面的方式定义:

 

assume cs:codesg,ds:datasg,es:table

datasg 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

dd 5937000

           ;以上是公司21年总收入

dw 3,7,9,13,28,38,130,220,476,78,1001,1442,2258,2793,4037,5635,8226

dw 11542,14430,15257,17800

以上表示21年每年雇佣人数

dataend

table 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:0H ‘1975’ 16 3 ?
Table:10H ‘1976’ 22 7 ?
Table:20H ‘1977’ 382 9 ?
Table:30H ‘1978’ 1356 13 ?
Table:40H ‘1979’ 2390 28 ?
…. 8000 38 ?
Table:140H ‘1995’ 5937000 17800 ?

 

一、分析设计想法

这个题目的本质是循环读取字符串,将字符串复制到寄存器中并放到指定的内存单元中,同时用到了除法,只要一步一步稳扎稳打的进行,一般是不会出现错误的。

 

二、程序的设计

 

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

 

 table segment

    db 21 dup ('year summ ne ?? ');首先覆盖掉空的内存单元,方便查看结果

 table ends

 

 stack segment

   dw 0,0,0,0,0,0,0,0;定义堆栈段

 stack ends

 

codesg segment

 

start:

          mov ax,table

          mov es,ax

          mov ax,data

          mov ds,ax

         

          mov bx,0 ;存年份偏移

          mov si,0 ;存人数偏移

          mov di,0 ;存table段中偏移

         

          mov cx,21 ;循环21年

 

       s0:

          ;将数据段中的年份复制到附加段中

          mov ax,[bx]

          mov es:[di],ax

          mov ax,[bx+2]

          mov es:[di+2],ax

         

          ;将数据段中的收入复制到附加段中

          mov ax,[bx+84]

          mov es:[di+5],ax

          mov ax,[bx+86]

          mov es:[di+7],ax

 

       ;将数据段中的人数复制到附加段中

       mov ax,[si+168]

       mov es:[di+10],ax

         

          ;通过除法计算出人均收入

          mov ax,[bx+84];低位

          mov dx,[bx+86];高位

          div word ptr [si+168];商存在ax中

          mov es:[di+13],ax

         

       add bx,4

          add si,2

          add di,16

     loop s0

        

 

  mov ax,4c00H

  int 21H

 
  codesg ends

  end start

 

三、程序的结果

四、心得体会

通过这个大作业程序的设计,我进一步掌握了堆栈段,数据段和附加段的简单使用,并且学会了如何在汇编语言中使用除法,在除法的过程中分别用哪些存储器存储数据,并通过格式化的控制,能够存储较为整齐的数据,在学习汇编语言程序设计的过程中,我常常会遇到自己没有思绪的程序,完全不知道该怎么写,或者按照我思考的样子却写不出我想要的结果,但是慢慢修改,慢慢积累,遇到的坑多了,也就不容易遇到坑了,写不好没关系,哪怕再小的程序,多写多改,慢慢地我就会提高的。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注