DJ13-1 汇编语言程序设计-2

news2024/11/22 15:28:45

目录

一、段定义伪指令

1. 段名

2. 定位类型

3. 组合类型

4. 类别名

二、设定段寄存器伪指令

1. 设定段寄存器伪指令

2. 段寄存器的初始化方法

三、过程定义伪指令


一、段定义伪指令

伪指令 SEGMENT 和 ENDS 用于定义一个逻辑段。

使用时必须配对,分别表示定义的开始与结束。

格式:

[ ] 内的是可选参数,设有默认值。各个参数之间用空格分隔,参数之间的顺序不能改变。

1. 段名

① 段名由用户自己任意选定,但要符合标识符定义规则

② 最好选用与该逻辑段用途相关的名称。如:第一个数据段为 DATA1,第二个数据段为 DATA2 等。

③ 一对 SEGMENT 和 ENDS 前的段名必须一致。

④ 段名代表段地址。

段地址 = 段基地址 = 段基址

2. 定位类型

定位类型决定了当前段起始数据边界,即第一个可存放数据的存储单元的位置,再由起始数据边界决定当前段地址。定位类型可以有4种取值:PAGE、PARA、WORD、BYTE 。

(1)PAGE:表示该段从一个页面的边界开始存放数据。

由于一个页面为 256 个字节且页面编号从 0 开始,因此 PAGE 定位类型的段起始地址的最后 8 位二进制数一定为 0,即以 00H 结尾的地址。

(2)PARA:表示该段从一个小节的边界开始存放数据。

由于一个小节为 16 个字节且页面编号从 0 开始,因此 PARA 定位类型的段起始地址的最后 4 位二进制数一定为 0,即以 0H 结尾的地址。

在省略情况下,定位类型默认为 PARA 。

(3)WORD:表示该段从一个偶数字节地址开始存放数据。

WORD 定位类型的段起始地址的最后一位二进制数一定为 0,即以 0B 结尾的地址。

(4)BYTE:表示该段起始数据单元地址可以是任一地址值。

3. 组合类型

指定段与段之间的连接关系和定位。

它有六种取值选择:NONE、PUBLIC、STACK、COMMON、MEMORY、AT 。

(1)NONE

表示本段与其它逻辑段无连接关系,不同的程序模块中,即使具有相同的段名,也分别装入内存。默认情况下,组合类型是 NONE 。

(2)PUBLIC

表示对于不同程序模块中用 PUBLIC 说明的具有相同段名的逻辑段,汇编时将它们连接在一起,构成一个大的逻辑段。

(3)STACK

① 把不同程序模块中所有同名的堆栈段连接成一个连续堆栈段。

② 系统自动对 SS 段寄存器初始化为该连续段的段地址,并初始化堆栈指针 SP 。

(4)COMMON

对不同程序模块中用 COMMON 说明的同名逻辑段,连接时从同一个地址开始装入,即所有逻辑段重叠在一起,连接之后的长度等于最长的逻辑段。

(5)MEMORY

表示本段在存储器中应定位在所有其它段之后的最高地址上。如果有多个用 MEMORY 说明的段,则只处理第一个用 MEMORY 说明的段,其余的被视为 COMMON 。

不是在整个内存的最高地址上,只是在我们这个程序的最高地址上。

(6)AT

根据表达式的值定位段地址。如:AT  8000H,则段地址为 8000H,即本段的起始物理地址为 80000H 。

4. 类别名

类别名为某一个段或几个相同类型段设定类型名称。

类别名必须用单引号引起来。所用字符串可任意选定,但它不能使用程序中的标号、变量名或其它定义的符号。

系统进行连接处理时,把不同程序模块类别名相同的段存放在相邻的存储区,但段的划分与使用仍按原来的设定。优先级:组合类型 > 类别名。

举例

分配空间:

如果在段定义中选用了 PARA 定位类型说明,则在一个段的结尾与另一个段的开始之间可能存在一些空白,图中以蓝色框表示。CODE 段的组合类型为 MEMORY,因此被装入在其它段之后。

加载到内存:

① 当定位类型为 PAGE 和 PARA 时,段基物理地址直接选用段起始数据地址,即它们是重合的。

② 当定位类型为 WORD 和 BYTE 时,段基物理地址与段起始数据地址可能不同,即第一个存储单元的偏移地址不一定为0。

二、设定段寄存器伪指令

1. 设定段寄存器伪指令

(1)定义

ASSUME 的作用是告诉汇编程序,在处理源程序时,定义的逻辑段与哪个段寄存器关联。即对应的标号、变量等对应的段地址用哪个段寄存器来表示,可以在程序中多次设定。

ASSUME 并不设置各个段寄存器的具体内容,段寄存器的值是在程序运行时设定的。

(2)格式

格式:ASSUME   段寄存器名:段名,段寄存器名:段名,…

其中,段寄存器名可以为CS、DS、ES 和 SS,段名是用 SEGMENT/ENDS 伪指令定义的段名。

(3)举例

 

 

2. 段寄存器的初始化方法

(1)DS 和 ES 的装入

 

(2)SS 的装入

SS 的装入有两种方法。

① 在段定义伪指令的组合类型项中,使用 STACK 参数,并在段寻址伪指令 ASSUME 语句中把该段与 SS 段寄存器关联。

SS 将被系统自动装入 STACK 段的段地址,且 (SP) = 40H,即堆栈的长度。

② 如果在段定义伪指令的组合类型中,未使用 STACK 参数,或者是在程序中要调换到另一个堆栈,这时可以使用类似于 DS 和 ES 的装入方法。

MOV  AX,STACK1 等价于 MOV  AX,SEG  STACK1 。

 

(3)CS 的装入

CPU 在执行指令之前根据 CS 和 IP 的内容来从内存中提取指令,即必须在程序执行之前装入 CS 和 IP 的值。因此,CS 和 IP 的初始值就不能用可执行语句来装入。

装入 CS 和 IP 一般有以下两种情况。

汇编时系统软件按照结束伪指令指定的地址装入初始的 CS 和 IP 。

任何一个源程序都必须以 END 伪指令来结束,即:END 起始地址。其中,起始地址可以是一个标号或表达式,它与程序中第一条指令语句前所加的标号必须一致。

  • END 伪指令用来指示源程序结束和指定程序运行时的起始地址。
  • 当程序被装入内存时,系统软件根据起始地址的段地址和偏移量分别被装入 CS 和 IP 中。

START 即为程序入点,标号名字可以随便取,但是一定要配对:

 

② 在程序运行期间,当执行某些指令时,CPU 自动修改 CS 和 IP,使它们指向新的代码段。

  • 执行段间过程调用 CALL 和段间返回指令 RET

  • 执行段间无条件转移指令 JMP

  • 响应中断及中断返回指令

  • 执行硬件复位操作

 

 

三、过程定义伪指令

在程序设计过程中,常常将具有一定功能的程序段设计成一个子程序。在 MASM 宏汇编程序中,用过程来构造子程序。格式如下:

(1)过程名

过程名是子程序的名称,它被用作过程调用指令 CALL 的目的操作数。

过程名类同一个标号的作用,具有段、偏移量和类型三个属性。而类型属性使用 NEAR 和 FAR 来指定,若没有指定,则隐含为 NEAR 。

  • NEAR:过程只能被本段指令调用。
  • FAR:过程可以供其它段的指令调用。

(2)RET 返回指令

每一个过程中必须包含有返回指令 RET,其作用是控制 CPU 从该过程中返回到调用过程的主程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

木聚糖-聚乙二醇-聚乙烯亚胺|PEI-PEG-Xylan|聚乙烯亚胺-PEG-木聚糖

木聚糖-聚乙二醇-聚乙烯亚胺|PEI-PEG-Xylan|聚乙烯亚胺-PEG-木聚糖 中文名称:木聚糖-聚乙烯亚胺 英文名称:Xylan-PEI 别称:聚乙烯亚胺修饰木聚糖,PEI -木聚糖 提供PEG接枝修饰木聚糖,木聚糖-聚乙二醇-聚乙烯亚胺&a…

CenterFusion: Center-based Radar and Camera Fusion for 3D Object Detection 解读

paper: CenterFusion: Center-based Radar and Camera Fusion for 3D Object Detection code: https://github.com/mrnabati/CenterFusion 0 引言 自动驾驶的感知应用中, 通常会融合多模态传感器, 如lidar和camera的融合。 单纯基于radar做感知的研究工…

[附源码]Python计算机毕业设计Django网上书城网站

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

在 python 中使用 Haar-Cascade 进行人脸检测

介绍在本文中,我们将讨论在 OpenCV python 中使用 Haar Cascade(级联)实现人脸检测器。识别图像中的给定对象称为对象检测。可以使用多种技术来完成此任务,但在本文中,我们将使用带有预训练 XML 文件的 haar 级联。这是…

毕业设计 单片机多功能红外空调遥控器 - 嵌入式 物联网

文章目录0 前言1 简介2 主要器件3 实现效果4 硬件设计空调遥控器原理原理图解码IR信号5 软件说明代码与Homekit进行连接5 最后0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩…

3D nunuStudio脚本开发入门

在 3D应用集成开发环境 nunuStudio 中,脚本是使用 javascript 语言编写的,javascript 是用于开发网页的语言,它是一种易于学习的语言,本教程不需要任何编程知识。 但我建议你在继续学习下一个教程之前学习 javascript 编程的基础知…

JSP | oa项目增加用户登录的功能

目录 一:实现用户登录的功能 (1)当前oa应用还存在的问题? (2)实现登录功能? (3)最终达到的结果? (4)目前存在的问题?…

ASEMI-GBU808整流桥如何测好坏

编辑-Z 整流桥是将交流转化为直流的集成电路设备,主要用于开关电源或逆变电源的整流电路。接下来,让我们了解GBU808整流桥,以及GBU808整流桥如何测好坏的方法。 整流桥GBU808的结构 整流桥GBU808有四只脚分别是AC输入两只脚,用符…

​win10下安装 RabbitMQ​

下载安装包:RabbitMQ-Windows版.7z-Java文档类资源-CSDN下载 下载RabbitMQ一定要保持 Erlang 和 RabbitMQ 的版本匹配 1、安装 Erlang 安装 RabbitMQ 之前需要先安装 Erlang 环境 Erlang 下载地址 https://www.erlang.org/downloads 2、安装 RabbitMQ RabbitMQ 下…

【网络层】RIP协议详解(应用层)、慢收敛、OSPF协议(适合大网络)

注:最后有面试挑战,看看自己掌握了吗 文章目录路由选择分类RIP--距离向量路由选择------简单-------每个路由器维护一个到其他的最佳距离向量记录---------跳数最少-----RIP距离最高16(不可达)最多15个网络-------只适合小的互联网…

Springboot集成activiti7

在pom文件中添加SpringBoot集成Activiti7的依赖 <!--添加activiti和SpringBoot整合的依赖内置的MyBatis版本与外面的会有冲突&#xff0c;所以需要排除--> <dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-start…

毕业设计-深度学习身份证号码检测识别-python-opencv

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

Spring Security HTTP认证

本文内容来自王松老师的《深入浅出Spring Security》&#xff0c;自己在学习的时候为了加深理解顺手抄录的&#xff0c;有时候还会写一些自己的想法。 HTTP提供了用户权限控制和认证的通用方式&#xff0c;这种认证方式通过HTTP请求头来提供认证信息&#xff0c;而不是通过表单…

[附源码]计算机毕业设计基于Springboot校园运动会管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

opencv c++ 霍夫圆检测

1、原理 a&#xff09;对某点&#xff0c;以其为圆心的圆为无数&#xff08;一圈圈的圆&#xff09;&#xff0c;将其从x-y平面坐标系上转换到r-θ极坐标系上后&#xff0c;则变成了以r、θ为自变量&#xff0c;为固定值&#xff0c;x、y为因变量的式子&#xff1a; b&#xff…

一文带你走进JS语法(最全笔记)

目录 基本语法 1.引入方式 2.注释 3.输入输出语句 4.变量和常量 5.原始数据类型 6.运算符 7.流程控制语句 8.数组 9.函数 DOM 1.概述 2.元素对象的操作 3.元素内属性操作 4.元素内文本操作 事件 面向对象 1.定义类的方式 2.继承 内置对象 1.Number对象 2…

matlab贝叶斯隐马尔可夫hmm模型实现

贝叶斯隐马尔可夫模型是一种用于分割连续多变量数据的概率模型。该模型将数据解释为一系列隐藏状态生成。每个状态都是重尾分布的有限混合&#xff0c;具有特定于状态的混合比例和共享的位置/分散参数。 相关视频&#xff1a;马尔可夫链原理可视化解释与R语言区制转换Markov r…

java面试总结

文章目录JVM类的加载过程类加载器有哪些什么是双亲委派双亲委派的好处如何打破双亲委派java内存模型栈帧的结构java堆的分代设计对象内存分配对应的GC为什么需要Survivor区?只有Eden不行吗&#xff1f;为什么要有两个Survivor区对象创建过程对象内存布局对象头Mark Word对象大…

提高 K8S 容器运行时的可观察性最佳方法之一

当谈到云原生可观察性时&#xff0c;可能每个人都会提到OpenTelemetry (OTEL)&#xff0c;因为社区需要依赖标准来将所有集群组件开发指向到同一方向。OpenTelemetry 使我们能够将日志、指标&#xff08;metrics&#xff09;、跟踪&#xff08;traces&#xff09;和其他上下文信…

内容爆炸时代,如何打造品牌经营的“弹药库”?

&#x1f446;点击一键预约本周三主题直播&#x1f446;2017年&#xff0c;华为总裁办发布《华为之熵&#xff0c;光明之矢》的内部学习邮件&#xff0c;将热力学中“熵”的概念应用到企业管理中&#xff0c;成为被人们津津乐道的“熵减哲学”。对于“熵”的概念&#xff0c;大…