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

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

一、实验目的

1)了解汇编语言的程序结构,编写一个简单的完整汇编程序

2)理解寻址方式的意义

二、实验内容

Power idea公司从1975年成立到1995年的基本情况如下:

年份          收入(千美元)          雇员(人)         人均收入(千美元)

1975                 16                  4                             ?

1976                 22                  7                             ?

1977                 382                10                             ?

1978                 1356               13                             ?

1979                 2390               28                             ?

1980                 8000               38                             ?

……

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'

;以上是表示21年的21个字符串

dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140317,197514

dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000

;以上表示21年公司总收入的21个dword型数据

dw 4,7,10,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226

dw 11542,14430,15257,17800

;以上是表示21年公司雇员人数的21个word型数据

data ends

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:0

1975

 

16

 

3

 

 

table:10H

1976

 

22

 

7

 

 

table:20H

1977

 

382

 

10

 

 

table:30H

1978

 

1356

 

13

 

 

table:40H

1979

 

2390

 

28

 

 

table:50H

1980

 

8000

 

38

 

 

      

table:140H

1995

 

5937000

 

17800

 

?

 

1:实验中需要进行21次类似操作,故需要使用Loop指令来实现循环结构,循环次数默认存放在cx寄存器中。例如,要计算2的20次方,其具体格式如下:

                       mov ax, 2

                       mov cx, 19

                     s: add ax,ax

                       loop  s

2:计算人均收入需要使用div指令。Div指令格式如下:

                       Div 寄存器/内存单元(除数的存放地址)

被除数默认存放在AX(或DX和AX)中。如果除数为16位,被除数为32位,则被除数存放在DX和AX中,其中DX存放高16位,AX存放低16位。同时AX存放除法操作的商,DX存放除法操作的余数。例如:

div word ptr ES:[0]

需要注意的是,在对内存单元的访问中,使用word ptr(属性修改运算符PTR)来指明访问的内存单元是字单元。若使用 byte ptr,则说明访问的是字节单元。

三、实验要求

1、使用emu8086中的exe模板编写程序,要求编码规范,注释清晰。在程序中选择合适的寻址方式来访问data段和table段的数据;

2、emu8086中调试运行程序,并使用【single step】功能单步执行该程序,观察每执行一条命令后寄存器内容的变化情况,体会各个寄存器的作用程序运行完毕后,选择菜单【view】【memory】,在“Random Access Memory”界面中查看相应内存区域的值,检查程序的运算结果正确与否。并将table段所在内存的值截图。


实验完成情况:

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

table segment
db 21 dup ('year summ ne ?? ')  ;最后这里像实验要求的内容一样,需要留出一个空格
table ends

code segment
start:
    mov ax,table   
    mov ds,ax
    mov ax,data
    mov es,ax
    
    mov cx,21 ;设置循环次数
    
    mov si,0  ;table
    mov di,0  ;year,income
    mov bx,0  ;empl,average
    ;mov bp,0  ;empl
    
    ;将年份移入table中
  s:mov ax,es:year[di]
    mov ds:[si],ax 
    mov ax,es:year[di+2]
    mov ds:[si+2],ax
    
    ;将收入移入table中
    mov ax,es:income[di]
    mov ds:[si+5],ax
    mov ax,es:income[di+2]
    mov ds:[si+7],ax
        
    ;将雇员数移到table中
    mov ax,es:empl[bx]
    mov ds:[si+10],ax
    
    ;计算人均收入,存入table中
    mov dx,es:income[di+2] ; 被除数为32位 dx存放高16位 
    mov ax,es:income[di]   ; ax存放低16位
    div word ptr es:income[di]
    mov ds:[si+13],ax
    
    add si,10H
    add di,4
    add bx,2
    
    loop s          
    
    mov ax, 4c00h ; exit to operating system.
    int 21h    
ends

end start ; set entry point and stop the assembler.



1.在开头有assume语句声明段在那个段寄存器里面

2.由于ax仅仅能存放16位2个字接所以需要分两次将年份的高两位和低两位分别传进table表中

3.di默认与ds搭配,所以需要以 es:income[di]来访问data中的income

4.在使用除法的时候,若被除数是32位的话,需要将高16位存放在dx,低16位存放在ax中。在内存中,想像一个图,从上到下地址逐渐升高,由低地址向高地址存数,当一个数占32位的时候,高位存放在高地址。









  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章 基础知识 1.1 机器语言 1.2 汇编语言的产生 1.3 汇编语言的组成 1.4 存储器 1.5 指令和数据 1.6 存储单元 1.7 CPU对存储器的读写 1.8 地址总线 1.9 数据总线 1.10 控制总线 1.11 内存地址空间(概述) 1.12 主板 1.13 接口卡 1.14 各类存储器芯片 1.15 内存地址空间 第2章 寄存器 2.1通用寄存器 2.2字在寄存器的存储 2.3几条汇编指令 2.4物理地址 2.516位结构的CPU 2.68086CPU给出物理地址的方法 2.7“段地址×16+偏移地址=物理地址” 的本质含义 2.8段的概念 2.9段寄存器 2.10CS和IP 2.11修改CS、IP的指令 2.12代码段 实验1查看CPU和内存,用机器指令 和汇编指令编程 第3章寄存器(内存访问) 3.1内存字的存储 3.2DS和(address) 3.3字的传送 3.4mov、add、sub指令 3.5数据段 3.6栈 3.7CPU提供的栈机制 3.8栈顶超界的问题 3.9push、pop指令 3.10栈段 实验2用机器指令和汇编指令编程 第4章第一个程序 4.1一个源程序从写出到执行的过程 4.2源程序 4.3编辑源程序 4.4编译 4.5连接 4.6以简化的方式进行编译和连接 4.71.exe的执行 4.8谁将可执行文件程序装载进入 内存并使它运行? 4.9程序执行过程的跟踪 实验3编程、编译、连接、跟踪 第5章(BX)和loop指令 5.1(BX) 5.2Loop指令 5.3在Debug跟踪用loop指令实现的 循环程序 5.4Debug和汇编编译器masm对指令的 不同处理 5.5loop和(bx)的联合应用 5.6段前缀 5.7一段安全的空间 5.8段前缀的使用 实验4(bx)和loop的使用 第6章 包含多个段的程序 6.1在代码段使用数据 6.2在代码段使用栈 6.3将数据、代码、栈放入不同的段 实验5编写、调试具有多个段的程序 第7章更灵活的定位内存地址的 方法 7.1anol和or指令 7.2关于ASCII码 7.3以字符形式给出的数据 7.4大小写转换的问题 7.5(bx+idata) 7.6用(bx+idata)的方式进行数组的 处理 7.7SI和DI 7.8(bx+si)和(bx+di) 7.9(bx+si+idata)和(bx+di+idata) 7.10不同的寻址方式的灵活应用 实验6实践课程程序 第8章数据处理的两个基本问题 8.1bx、si、di和bp 8.2机器指令处理的数据在什么地方 8.3汇编语言数据位置的表达 8.4寻址方式 8.5指令要处理的数据有多长 8.6寻址方式的综合应用 8.7div指令 8.8伪指令dd 8.9dup 实验7寻址方式结构化数据访问应用 第9章转移指令的原理 9.1操作符offset 9.2jmp指令 9.3依据位移进行转移的jmp指令 9.4转移的目的地址在指令的jmp 指令 9.5转移地址在寄存器的jmp指令 9.6转移地址在内存的jmp指令 9.7jcxz指令 9.8loop指令 9.9根据位移进行转移的意义 9.10编译器对转移位移超界的检测 实验8分析一个奇怪的程序 实验9根据材料编程 第10章CALL和RET指令 10.1ret和retf 10.2call指令 10.3依据位移进行转移的call指令 10.4转移的目的地址在指令的call 指令 10.5转移地址在寄存器的call指令 10.6转移地址在内存的call指令 10.7call和ret的配合使用 10.8mul指令 10.9模块化程序设计 10.10参数和结果传递的问题 10.11批量数据的传递 10.12寄存器冲突的问题 实验10编写子程序 课程设计1 第11章标志寄存器 11.1ZF标志 11.2PF标志 11.3SF标志 11.4CF标志 11.5OF标志 11.6adc指令 11.7sbb指令 11.8cmp指令 11.9检测比较结果的条件转移指令 11.10DF标志和串传送指令 11.11pushf和popf 11.12标志寄存器在Debug的表示 实验11编写子程序 第12章内断 12.1内断的产生 12.2断处理程序 12.3断向量表 12.4断过程 12.5断处理程序和iret指令 12.6除法错误断的处理 12.7编程处理0号断 12.8安装 12.9do0 12.10设置断向量 12.11单步断 12.12响应断的特殊情况 实验12编写0号断的处理程序 第13章int指令 13.1int指令 13.2编写供应用程序调用的 断例程 13.3对int、iret和栈的深入理解 13.4BIOS和DOS所提供的 断例程 13.5BIOS和DOS断例程的 安装过程 13.6BIOS断例程应用 13.7DOS断例程应用 实验13编写、应用断例程 第14章端口 14.1端口的读写 14.2CMOS RAM芯片 14.3shl和shr指令 14.4CMOS RAM存储的时间信息 实验14访问CMOS RAM 第15章外断 15.1接口芯片和端口 15.2外断信息 15.3PC机键盘的处理过程 15.4编写int 9断例程 15.5安装新的int 9断例程 实验15安装新的int 9断例程 第16章直接定址表 16.1描述了单元长度的标号 16.2在其他段使用数据标号 16_3直接定址表 16.4程序入口地址的直接定址表 实验16编写包含多个功能程序断例程 第17章使用BIOS进行键盘输入 和磁盘读写 17.1int 9断例程对键盘输入的处理 17.2使用int 16h断例程读取 键盘缓冲区 17.3字符串的输入 17.4应用int 13h断例程对磁盘 进行读写 实验17编写包含多个功能程序断例程 课程设计2 综合研究 研究试验1搭建一个精简的C语言 开发环境 研究试验2使用寄存器 研究试验3使用内存空间 研究试验4不用main函数编程 研究试验5函数如何接收不定数量的 参数 附注 附注1Intel系列微处理器的3种工作 模式 附注2补码 附注3汇编编译器(masm.exe)对jmp的 相关处理 附注4用栈传递参数 附注5公式证明

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值