《汇编语言》——王爽第三版实验7

该编程实验涉及在结构化数据访问中使用寻址方式,通过汇编语言实现对数据段的数据进行读取、计算并写入到table段中。程序计算了21年的人均收入,并将结果按特定格式存储。利用bx和si寄存器定位data段的数据,bp寄存器定位table段的数据,通过div指令进行除法运算求得人均收入。
摘要由CSDN通过智能技术生成

实验七:寻址方式在结构化数据访问中的应用

在这里插入图片描述
编程,将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整),结果也按照下面的格式保存在table段中。
在这里插入图片描述

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

可以把年份,总收入,雇员数,人均收入看成一整个结构。
{ ‘1975’,16, 3, ?}就是一个结构,同理 {1976, 22, 7, ?}也是一个结构。

年份,总收入雇员数,人均收入就是其中的项。
在结构{ ‘1975’,16, 3, ?}中’1975’,16,3,?都是它的项。

项中也有元素。
‘1975’是4个字节,第一个字节是’1’,ASCII码是31h,这个’1’就是它的元素。

对于data中的数据,用bx来定位每一个结构,用idata来定位项,用si来定位项中的元素。
对于table中的数据,因为没有那么多的寄存器,用bp来定位每一个结构,bp + 偏移地址来表示所有的东西。

assume cs:code, ds:data, es:table, ss:stack

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'
    ; 每一个字符都是一个ASCII码占一个字节,4*21 = 84字节

    ;54h是下面的开始
    dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514
    dd 345980, 590287, 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000
    ; 21个双字, 4*21 = 84字节

    ;54h + 54h是下面的开始
    dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226
    dw 11542, 14430, 15257, 17800
    ; 21个字, 42字节
    ;54h+54h+2ah是后面的开始

data ends

table segment

    db 21 dup('year summ ne ?? ')

table ends

stack segment

stack ends

code segment

    start:  mov ax, data
            mov ds, ax
            mov bx, 0 ;定位data结构型数据
            mov si, 0 ;定位数据项中的每个元素

            mov ax, table
            mov es, ax
            mov bp, 0 ;定位table结构型数据

            mov ax, stack
            mov ss, ax
            mov sp, 2

            mov cx, 21
       s:   mov ax, ds:[bx].0[si] ;ds + 0 + si定位,找到年份的低字节
            mov es:[bp], ax ;bp定位,低字节拷入
            mov ax, ds:[bx].0[si + 2] ;高字节
            mov es:[bp + 2], ax

            mov ax, ds:[bx].84[si] 
            mov es:[bp + 5], ax ;拷入收入低字节
            mov dx, ds:[bx].84[si + 2]
            mov es:[bp + 7], dx ;拷入收入高字节

            push cx ;因为被除数是4字节,所以要用dx存高位,ax存低位,所有16位寄存器(ax,bx,cx,dx,si,di)都在使用,只能用栈暂存了
        
            mov cx, ds:[84 + 84 + di] ;84+84是雇员的地址,也就3,7,9……中3所在的位置,循环一次加一个字,也就是二个字节
            mov es:[bp + 0ah], cx

            div cx
            pop cx

            mov es:[bp + 0dh], ax ;div结果在ax中

            add di, 2 ;雇员地址,一次加2个字节
            add bx, 4 ;bx是年份,一次加4个字节
            add bp, 16 ;bp是table年份的首地址,一次加10h

            loop s

            mov ax, 4c00h
            int 21h
code ends

end start

在这里插入图片描述

  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CCPigSnail

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值