汇编语言——寻址方式的综合应用及转移指令的原理

一、 实验目的

  1. 定位内存单元的寻址方式汇总
  2. 寻址方式的综合应用
  3. 转移指令的分类和原理
  4. 熟悉在显存中编程的方法

二、 实验内容及要求

(一)寻址方式的汇总及综合应用

  1. 定位内存单元的寻址方式有几种,并举例说明。
  2. 寻址方式在结构化数据访问中的应用。

题目如下

Power idea公司从1975年成立一直到1995年的基本情况如下。 年份 收入(千美元)
雇员 人均收入(千美元) 1975 16 3 ? 1976 22 7 ?
1977 382 9 ? 1978 1356 13 ? 1979
2390 28 ? 1980 8000 38 ? M 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

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

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


代码如下

assume cs:code,ds:data,es:table
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'
;以上是表示21年的字符串 4 * 21 = 84  8个位
dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是表示21年公司总收入的dword型数据 4 * 21 = 84  32位
dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw 11542,14430,15257,17800
;以上是表示21年公司雇员人数的21个word型数据 2 * 21 = 42   16个位
data ends

table segment
db 21 dup ('year summ ne ?? ') ; 'year summ ne ?? ' 刚好16个字节
table ends

code segment
start:
;data数据 放在ds
mov ax,data
mov ds,ax
;table数据 放在 es
mov ax,table
mov es,ax
;三个寄存器初始化
mov bx,0 ;data中数据定位(和idata结合,用于年份和收入)
mov si,0 ;table中定位(和idata给合用于定位存放数据的相对位置)
mov di,0 ;data中用于得到员工数
;cx循环次数
mov cx,21
;循环内容
s:
   ;年
   ;将年从data 到 table 分为高16位和低16位
   mov ax,[bx]
   mov es:[si],ax
   mov ax,[bx+2]
   mov es:[si+2],ax

   ;空格
   ;table 增加空格
   mov byte ptr es:[si+4],20h

   ;收入
   ;将收入从data 到 table ,收入数据分为高16位和低16位
   mov ax,[bx+84]
   mov es:[si+5],ax
   mov ax,[bx+86]
   mov es:[si+7],ax

   ;空格
   ;table 增加空格
   mov byte ptr es:[si+9],20h

   ;雇员数
   ;将雇员数从data 到 table 
   mov ax,[di+168]
   mov es:[si+10],ax

   ;空格
   ;table 增加空格
   mov byte ptr es:[si+12],20h

   ;计算工资
   ;取ds处工资,32位,dx放高16位,ax放低16位
   mov ax,[bx+84]
   mov dx,[bx+86]
   ;计算人均收入,结果为16位,保存在ax中
   div word ptr ds:[di+168]
   ;将结果存入table处
   mov es:[si+13],ax

   ;空格
   ;table 增加空格
   mov byte ptr es:[si+15],20h

   ;改变三个寄存器值,实现循环
   add si,16
   add di,2
   add bx,4

loop s

mov ax,4c00h
int 21h
code ends
end start

程序debug结果如下。

如果图片显示过小,请右键->在新标签页中打开

debug说明

  • 1
    点赞
  • 2
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

aurorayqz

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值