汇编语言程序设计 第3章:汇编语言程序格式

文章目录

  • 1. 伪指令
    • 1.1 段定义伪指令
    • 1.2 段寄存器说明伪指令
    • 1.3 过程定义伪指令
    • 1.4 源程序结束伪指令
  • 2. 变量/标号定义伪指令
    • 2.1 变量定义
    • 2. 2 标号定义
    • 2.3 表达式
  • 3.地址计数器与对准伪指令
    • 3.1 地址计数器$
    • 3.2 对准伪指令
  • 4. DOS功能调用
    • 4.1 DOS功能调用的一般方法
    • 4.2 常用的DOS功能调用
    • 4.3 汇编语言源程序格式
    • 4.4 汇编语言程序的上机过程
      • 4.4.1 汇编语言程序的工作环境
      • 4.4.2 建立ASM文件
      • 4.4.3 用MASM程序生成OBJ文件
      • 4.4.4 用LINK程序产生EXE文件
      • 4.4.5 调试程序DEBUG
  • 总结

1. 伪指令

1.1 段定义伪指令

格式:段名字 SEGMENT [类型]
……
段名字 ENDS
例4.1 data SEGMENT
……
data ENDS

1.2 段寄存器说明伪指令

格式:ASSUME 段寄存器:段名 [,段寄存器:段名]
说明:利用SEGMENT/ENDS定义完一个段之后,必须通过ASSUME伪指令来明确所定义的段与段寄存器之间的关系。

例4.2 ASSUME CS:code,DS:data
该语句告诉汇编程序,从现在开始CS寄存器对应名字为code的段,DS寄存器对应名字为data的段。

在这里插入图片描述

1.3 过程定义伪指令

格式:过程名 PROC FAR/NEAR
……
过程名 ENDP
例4.4
main PROC FAR
……
main ENDP

1.4 源程序结束伪指令

格式:END [<标号>]
说明:对于END后面所带的标号,必须事先在程序中加以定义,表示程序要从标号所对应的指令开始执行,也就是说标号给定了程序的启始地址。

2. 变量/标号定义伪指令

2.1 变量定义

格式:[<变量名>] 变量定义伪指令 <表达式>
功能:声明一个变量的数据类型、代表的值、地址。
说明:
(1) 变量名是可有可无的,如果有,则会被汇编成该变量所对应的最开始字节的偏移地址
(2) 变量定义伪指令(共5个)
DB:定义字节类型变量,指示每个操作数占1个字节。
DW:定义字类型变量,指示每个操作数占1个字(16位)。
DD:定义双字类型变量。
DQ:定义四字类型变量。
DT:定义十字节类型变量。

(3) 表达式可以是常数、字符串、变量、“?”、DUP子句等,各表达式间用逗号进行分隔。
① 表达式是常数的情况:
例4.5 X DW 1234H,4567H
② 表达式是字符串的情况:
例4.6 STR DB ‘HELLO’
X DB ‘AB’
Y DW ‘AB’
③ 表达式是变量的情况:
例4.7 X DB 10H
Y1 DW X
Y2 DD X
说明:用DW或DD可以把变量的地址存入存储器。使用DW时,将存储变量的偏移地址;使用DD时,将存储变量的偏移地址和段地址,并且先存放偏移地址,后存放段地址。
④“?”:表示不定义初值,只预留存储器空间。
例4.8 X DB 1CH,30H
Y DB ‘ASM’
Z DW 10H,?,20H
⑤ DUP:复制操作符,用来复制某个(或某些)操作数,DUP可以嵌套使用。
格式:
<重复次数> DUP(<操作数1>,<操作数2>,…)
(4) 变量的三个属性
① 变量的段属性:是指变量被定义时所在段的段地址
② 变量的偏移属性:是指从段的起始地址到定义变量的位置之间的字节数,也称为变量的偏移地址
③ 变量的类型属性,定义该变量时所保留的字节数目

2. 2 标号定义

标号在代码段中定义,后跟冒号,是指令在存储器中存放地址的符号表示。
标号也具有三个属性:
段属性、偏移属性、类型属性。
标号的段属性和偏移属性与变量的这两个属性类似,标号的类型属性有两种:
NEAR:标号只能在段内引用;
FAR:标号可以在段间引用。

2.3 表达式

  1. 常量:在源程序中已有确定数值的量。
    主要用于给变量赋初值等方面,其表现形式有两种:
    ① 数值常量:各种进制的数值或字符型。
    例4.11 MOV AX,15
    MOV AX,0FH
    例4.12 MOV AL,‘B’
    ② 符号常量:为常用量定义一个名字。
    <符号名> EQU <表达式>
    <符号名> = <表达式>
    其中表达式可以是常数、变量、标号、寄存器名等。
    例4.13 X1 EQU 50
    Y2= BX
    则:MOV AX,X1 等价于:
    MOV AX,50
    EQU和“=”区别:EQU不能重复定义,而“=”则可以。
    例4.14 X EQU 100
    X EQU 200 ;出错
  2. 数值表达式(分为三类)
    算术表达式、逻辑表达式、关系表达式
    ① 算术表达式
    可用运算符:+、-、、/、MOD
    例4.15 MOV AX,3
    6 等价于:MOV AX,18
    MOV AX,29 MOD 5 等价于:MOV AX,4
    ② 逻辑表达式
    可以使用的运算符:
    逻辑运算符(4个)和逻辑移位操作符(2个):
    AND(与)、OR(或)、
    NOT(非)、XOR(异或)。
    SHL(左移)、SHR(右移)。
    具体用法:
    <表达式1> AND <表达式2>
    <表达式1> OR <表达式2>
    <表达式1> XOR <表达式2>
    NOT <表达式>
    <表达式> SHL <移位次数>
    <表达式> SHR <移位次数>
    例4.16
    MOV AX,11110000B OR 00000001B
    等价于:
    MOV AX,11110001B
    MOV AX,11011001B SHL 2
    等价于:
    MOV AX,01100100B
    关系表达式
    关系运算符有:
    EQ(相等)、NE(不相等)、LT(小于)、LE(小于或等于)、GT(大于)、GE(大于或等于)。
    结果为布尔量:全1表示真,全0表示假。
    例4.17
    MOV AX,30 GT 100 等价于: MOV AX,0
    MOV AX,20 NE 10 等价于:MOV AX,0FFFFH
  3. 地址表达式
    地址表达式是由变量、标号、常量、寄存器等与各种运算符组成的有意义的式子,其结果是一个存储单元的地址或是一个数值。
    汇编语言中规定:如果变量或标号出现在表达式中,均是取它们的偏移地址参加运算,而不是取其所对应的存储单元的内容参加运算。
    ① 析值操作符
    析值操作符也称为数值回送操作符,这些操作符能把存储单元地址的一部分作为数值返回。
    析值操作符有5个:
    SEG、OFFSET、TYPE、LENGTH、SIZE。
    1… SEG
    格式:SEG <变量/标号>
    功能:回送变量或标号的段地址。
    例4.18 段定义如下:
    data SEGMENT
    ……
    num DW ?
    data ENDS
    假设该段的段地址是1000H
    MOV BX,SEG num 等价于: MOV BX,1000H
  1. OFFSET
    格式:OFFSET <变量/标号>
    功能:回送变量或标号的偏移地址。
    假设例4.18中变量num所在位置距段首20H个字节,则其偏移属性值为20H。
    MOV BX,OFFSET num 等价于: MOV BX,20H
  2. TYPE
    格式:TYPE <变量/标号>
    功能:返回变量或标号的类型值。
    例4.19
    X1 DW 100 DUP(?) ; X1是字类型
    Y1 DD 1234H,4567H ; Y1是双字类型
    则有:
    MOV BX,TYPE X1 等价于: MOV BX,2
    MOV BX,TYPE Y1 等价于: MOV BX,4
  3. LENGTH
    格式:LENGTH <变量>
    功能:在定义变量时如果使用了DUP,则返回分配给该变量的单元数,对于其他情况则返回1。
    例4.19 X1 DW 100 DUP(?)
    Y1 DD 1234H,4567H
    MOV AX,LENGTH X1 等价于:MOV AX,100
    MOV AX,LENGTH Y1 等价于:MOV AX,1
  4. SIZE
    格式:SIZE <变量>
    功能:返回分配给该变量的字节数,但此值是该变量的LENGTH值和TYPE值的乘积。
    例4.19 X1 DW 100 DUP(?)
    Y1 DD 1234H,4567H
    MOV AX,SIZE X1 等价于:MOV AX,200
    MOV AX,SIZE Y1 等价于:MOV AX,4
    ② 属性操作符
    属性操作用来指明某个变量、标号或地址表达式的属性,使它临时具有与原来不同的属性。属性操作符有4个:
    PTR、LABEL、THIS、段跨越前缀。
    (1)PTR
    格式:<类型> PTR <地址表达式>
    功能:临时改变标号或变量的类型属性。
    类型:BYTE、WORD、DWORD、NEAR、FAR
    例4.20 有数据段和变量的定义如下:
    data SEGMENT
    num DW 1234H
    data ENDS
    (2) LABEL
    格式:<变量/标号> LABEL <类型>
    功能:为紧跟在本伪指令后的变量或标号建立新名字,并为该新名字指定类型。
    说明:操作符LABEL提供了另一种定义变量或标号的方法,但并不为其分配存储空间。
    在这里插入图片描述
    (3)THIS
    格式:THIS <类型>
    功能:为紧跟在本伪指令后的变量或标号赋予一个新的类型。
    说明:操作符THIS通常与伪指令EQU或=连用,为当前存储单元定义一个具有新类型的名字。
    在这里插入图片描述
    (4)段跨越前缀
    格式:段寄存器:<操作数>
    功能:为变量或地址表达式指定段属性。
    例4.23 MOV AX,ES:[BX]
    在该指令中,源操作数的段属性值不再使用DS的内容,而是使用ES的内容。

3.地址计数器与对准伪指令

3.1 地址计数器$

利用汇编程序对源程序进行汇编的过程中,使用地址计数器(用$ 表示)来保存当前正在汇编的指令的偏移地址。在对每一个段进行汇编时,地址计数器$ 被初始化为0,在后继的汇编过程中,每处理一条指令,地址计数器$ 就增加一个值,此值为该指令所占的字节数
在这里插入图片描述

3.2 对准伪指令

(1) ORG
格式:ORG <常数表达式>
功能:指示下一个字节的偏移地址为常数表达式的值。
在这里插入图片描述
(2) EVEN
格式:EVEN
功能:使下一个变量或指令开始于偶数字节地址。
例4.26-1 数据段data1的定义如下所示:
data1 SEGMENT
X DB 10H
EVEN
array DW 1234H
data1 ENDS
在这里插入图片描述

4. DOS功能调用

4.1 DOS功能调用的一般方法

(1) 功能号送入AH寄存器;
(2) 根据需要设置入口参数;
(3) 使用INT 21H指令转入相应子程序;
(4) 调用结束后,按规定取得出口参数

4.2 常用的DOS功能调用

  1. 字符输入(1号功能调用)
    格式: MOV AH,01H
    INT 21H
    功能:从键盘输入一个字符,并将输入字符的ASCII码值送寄存器AL。
  2. 字符显示(2号功能调用)
    格式: MOV AH,02H
    MOV DL,待显示字符的ASCII码
    INT 21H
    功能:将DL中的字符显示在屏幕上。
    例4.27 在屏幕上显示字符“6”
  3. 字符串显示(9号功能调用)
    格式: MOV AH,09H
    LEA DX,字符串首偏移地址
    INT 21H
    功能:将数据段中DS:DX所指向的以‘ ’结尾的字符串显示在屏幕上。例 4.28 数据段中有如下字符串定义: S t r D B ‘ H e l l o ’结尾的字符串显示在屏幕上。 例4.28 数据段中有如下字符串定义: Str DB ‘Hello 结尾的字符串显示在屏幕上。例4.28数据段中有如下字符串定义:StrDBHello
    如何在屏幕上显示字符串“Hello”?
  4. 字符串输入(0A号功能调用)
    格式: MOV AH,0AH
    LEA DX,缓冲区首偏移地址
    INT 21H
    功能:从键盘向数据段中DS:DX所指的输入缓冲区输入字符串并且在屏幕上显示

输入缓冲区的要求:缓冲区的第0个字节规定缓冲区的大小,其值必须大于0,缓冲区的第1个字节用于存储实际输入字符的个数,从键盘输入的字符从缓冲区的第2个字节开始存放,输入的字符串以回车(0DH)结束,且回车字符也会被存入缓冲区中,但回车字符不计入实际输入的字符个数之中,当输入的字符个数超过了缓冲区大小时,多余字符将被忽略且扬声器发出警告。
在这里插入图片描述

  1. 带返回码终止(4C号功能调用)
    格式: MOV AH,4CH
    MOV AL,00H
    INT 21H
    功能:结束用户程序,返回DOS系统,并带回返回码0。
    说明:作为主程序的最后三条指令,用于确保用户程序能正常返回DOS系统而不致于死机。

4.3 汇编语言源程序格式

根据将来生成的可执行文件的种类,汇编语言源程序格式可以分为两种:
EXE文件格式和COM文件格式。
本节只介绍EXE文件格式,COM文件格式将在第7章介绍。

EXE文件格式汇编语言源程序结构如下:
DATA SEGMENT
……;数据段
DATA ENDS
EXTRA SEGMENT
…… ;附加段
EXTRA ENDS
STACK SEGMENT STACK
…… ;堆栈段
STACK ENDS

在这里插入图片描述

4.4 汇编语言程序的上机过程

4.4.1 汇编语言程序的工作环境

运行汇编语言程序,需要有以下文件:
(1) 编辑程序:EDIT.EXE
(2) 汇编程序:MASM.EXE
(3) 连接程序:LINK.EXE、TLINK.EXE
(4) 调试程序:DEBUG.COM

4.4.2 建立ASM文件

打开编辑程序EDIT,建立文本文件。
注意的事项:
(1) 每条汇编语言指令和伪指令都单独占一行,不允许两条或两条以上指令放在一行,也不允许一条指令分成几行;
(2) 源程序中使用的字符均为半角;
(3) 源文件的扩展名必须为ASM。

4.4.3 用MASM程序生成OBJ文件

MASM是DOS环境下所运行的一种功能很强的宏汇编程序,主要功能是进行语法检查并生成OBJ文件
在这里插入图片描述

4.4.4 用LINK程序产生EXE文件

OBJ文件并不是可执行文件,还必须使用连接程序(LINK)把OBJ文件转换为可执行的EXE文件。
在这里插入图片描述

4.4.5 调试程序DEBUG

DEBUG提供了一个控制测试的环境,监视和控制被测试程序的执行,可以直接发现和确定程序中的问题。

总结

在这里插入图片描述

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

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

相关文章

python垃圾回收机制

Python中的垃圾回收机制是自动的&#xff0c;它主要使用了引用计数来追踪和回收内存。 1、引用计数 当一个对象被创建时&#xff0c;就会被分配一块内存&#xff0c;然后将其引用计数设置为1。当另一个变量引用该对象时&#xff0c;引用计数就会增加1。当一个对象的引用计数变…

基于亚马逊云EC2+Docker搭建nextcloud私有化云盘

亚马逊云科技EC2云服务器&#xff08;Elastic Compute Cloud&#xff09;是亚马逊云科技AWS&#xff08;Amazon Web Services&#xff09;提供的一种云计算服务。EC2代表弹性计算云&#xff0c;它允许用户租用虚拟计算资源&#xff0c;包括CPU、内存、存储和网络带宽&#xff0…

ES解析word内容为空的问题和直接使用Tika解析文档的方案

导言 在上一篇文章最后&#xff0c;我们虽然跑通了ES文件搜索的全部流程&#xff0c;但是仍然出现了1个大的问题&#xff1a;ES7.3实测无法索引docx和doc文档&#xff0c;content有值但是无法解析到附件成为可读的可搜索的内容&#xff0c;附件内容为空&#xff08;附件中根本…

【源码独家】充电桩平台(四轮电动汽车 微服务 云快充协议)

文章目录 一、产品功能部分截图1.手机端&#xff08;小程序、安卓、ios&#xff09;2.PC端 二、小程序体验账号以及PC后台体验账号1.小程序体验账号2.PC后台体验账号关注公众号获取最新资讯 三、产品简介&#xff1f;1. 充电桩云平台&#xff08;含硬件充电桩&#xff09;&…

守护健康,从营养开始 —— 帕金森患者的饮食秘籍

亲爱的读者朋友们&#xff0c;您是否知道&#xff0c;在对抗帕金森病的道路上&#xff0c;正确的饮食和营养补充可以成为我们的有力盟友&#xff1f;今天&#xff0c;就让我们一起探索那些能够帮助帕金森患者改善症状、提高生活质量的营养素&#xff0c;开启健康生活的新篇章。…

Python数据分析-Numpy2

1.numpy读取数据 CSV:Comma-SeparatedValue,逗号分隔值文件 显示&#xff1a;表格状态 源文件&#xff1a;换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录 由于csv便于展示,读取和写入,所以很多地方也是用csv的格式存储和传输中小型的数据,为了方便教学,我们会经…

mysql 主从延迟分析

一、如何分析主从延迟 分析主从延迟一般会采集以下三类信息。 从库服务器的负载情况 为什么要首先查看服务器的负载情况呢&#xff1f;因为软件层面的所有操作都需要系统资源来支撑。 常见的系统资源有四类&#xff1a;CPU、内存、IO、网络。对于主从延迟&#xff0c;一般会…

2024-3-13,14(CSS)

1.复合选择器 有两个或者多个基础选择器&#xff0c;通过不同的方式组合而成。 目的是更加准确高效的选择目标元素&#xff08;标签&#xff09; 分类&#xff1a; 后代选择器&#xff1a;选中某个元素的所有后代元素 写法&#xff1a;父选择器 子选择器 {CSS属性}&#x…

软件授权在机器视觉行业的六大创新应用

智能制造已经离不开软件&#xff0c;软件打造高效低成本的制造是趋势&#xff0c;本文介绍通过软件授权赋能机器视觉实现更多在智能制造中的创新功能应用。 机器视觉应用软件在智能制造中呈现的六大创新应用趋势&#xff1a; 一、机器视觉&#xff1a;软件投入占比越来越高 通过…

位运算#蓝桥杯

位运算#蓝桥杯 文章目录 位运算#蓝桥杯1、小蓝学位运算2、异或森林3、位移4、笨笨的机器人5、博弈论 1、小蓝学位运算 #include<bits/stdc.h> using namespace std; using LL long long; const LL N 1e97; template<int kcz> struct ModInt { #define T (*this)…

IO流(一)

前置知识&#xff1a;字符集 常见字符集 ASCII字符集:只有英文、数字、符号等&#xff0c;占1个字节GBK字符集:汉字占2个字节&#xff0c;英文、数字占1个字节UTF-8字符集:汉字占3个字节&#xff0c;英文、数字占1个字节 Unicode字符集(统一码&#xff0c;也叫万国码) Unicode…

【Redis】Redis常用命令之Hash

1.hset&#xff1a;设置hash中指定的字段&#xff08;field&#xff09;的值&#xff08;value&#xff09;。 HSET key field value [field value ...]时间复杂度&#xff1a;插⼊⼀组field为O(1),插⼊N组field为O(N)。 返回值&#xff1a;添加的字段的个数。 2.hget&#xf…

Linux学习笔记(一)Linux基本指令

文章目录 前言目录常见命令1. pwd 打印当前所在路径2. cd 改变路径、切换路径3. 家目录 回到顶级目录4. 当前路径和上一路径5. 上一次路径6. 绝对路径和相对路径7. ls 列出目录内容8. mkdir 创建目录9. rmdir 删除目录10. touch 创建文件11. mv 修改文件目录、移动路径12. cp 复…

一口吃掉Linux基础操作

一般在windows上面想要操作Linux系统就需要装软件搞一个虚拟机&#xff0c;我用的是Ubuntu22&#xff0c;就是Linux的发行版.安装Ubuntu的过程比较复杂&#xff0c;最重要的一点是安装时要断网&#xff0c;否则会很慢。 Ubuntu 配置指南 — 地震“学”科研入门教程 先介绍一个…

光伏便携式EL检测仪是什么?—科技助农

光伏便携式EL监测仪是一种专门用于检测光伏电池组件性能的高效、实用的设备。它利用电致发光&#xff08;Electroluminescence&#xff0c;EL&#xff09;原理&#xff0c;通过检测光伏板在受到光照后产生的电流所激发出的光线&#xff0c;来评估光伏板的性能。这种设备通常具有…

C++初阶:2_类与对象(上)

类与对象(上) 一.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之…

【DAY10 软考中级备考笔记】数据结构 图

数据结构 图 3月11日 – 天气&#xff1a;晴 晚上无线网络突然不能用了&#xff0c;花费好久弄这个&#xff0c;耽误了一些时间 1. 图的定义 这里需要注意完全图的定义&#xff0c;以及完全图的边数 这里需要注意连通图和连通分量的概念。 2. 图的存储结构 图有两种存储结构&a…

Java操作Sql语句 出现迭代死循环 (Bug排查)

目录 1. 问题所示2. 原理分析3. 解决方法4. 彩蛋1. 问题所示 Java执行Sql语句来查询一些数据的时候 虽说数据量很大,但是查询过程中一直迭代查询 截图如下所示: 2. 原理分析 至于迭代死循环,可能是不满足的条件也进入查询(本身我的数据量就很大) 主要可能引起的两个原…

C#/WPF 清理任务栏托盘图标缓存

在我们开发Windows客户端程序时&#xff0c;往往会出现程序退出后&#xff0c;任务还保留之前程序的缓存图标。每打开关闭一次程序&#xff0c;图标会一直增加&#xff0c;导致托盘存放大量缓存图标。为了解决这个问题&#xff0c;我们可以通过下面的程序清理任务栏托盘图标缓存…

【UE5】非持枪趴姿移动混合空间

项目资源文末百度网盘自取 创建角色在非持枪状态趴姿移动的动画混合空间 在BlendSpace文件夹中单击右键选择 动画(Animation) 中的混合空间(Blend Space) 选择SK_Female_Skeleton 命名为BS_NormaProne 打开BS_NormaProne 水平轴表示角色的方向&#xff0c;命名为Directi…