汇编语言程序设计 第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.hqwc.cn/news/539056.html

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

相关文章

汽车电子零部件(1):综述

汽车零部件有哪些? 这里有一份汽车零部件清单,它们是汽车制造的部件,包括油车和电车;并不详尽。这些零件中的许多(并非全部)也用于卡车和公共汽车等其他机动车辆。 <

Sublime查看ANSI编码文档乱码问题

原因为没有安装对应的解码插件。 选择安装插件包 选择插件包&#xff1a;ConvertToUTF8或者GBK&#xff0c;我试了第一个插件包不行&#xff0c;安装GBK插件包后OK。

Git提交代码进入coding

安装Git后建一个文件在文件里右键点击Git Bash使用命令配置用户名和邮箱git config --global user.name "你的用户名"和git config --global user.email "你的邮箱"命令git init来初始化&#xff0c;自动将当前仓库设置为master创建一个项目&#xff08;一…

SpringBoot之Bean扫描、Bean注册

目录 Bean扫描 Bean注册 Bean lmport 自定义注解 注册条件 Bean扫描 Bean扫描有两种方式 1、标签:<context:component-scan base-package"com.mybatis"/> 2、注解: ComponentScan(basePackages "com.mybatis") springboot启动类注解可以自…

NO9 蓝桥杯单片机之串口通信的使用

1 基本概念 简单来说&#xff0c;串口通信是一种按位&#xff08;bit&#xff09;传输数据的通信方式。 其他一些知识就直接贴图吧&#xff08;单工&#xff0c;半双工这些学过通信的同学应该都知道&#xff0c;可以上网查询一下具体概念。&#xff09; 来源还是&#xff1a;…

派对游戏2024年新局面:二超多强,市场细分

2023年末&#xff0c;《元梦之星》上线迎战《蛋仔派对》&#xff0c;网腾大战打响。 这场战役从开局就进入到了白热化&#xff0c;双方投入真金白银来拉拢玩家&#xff0c;于春节这一亲朋相聚最适合派对游戏的时段集中发力&#xff0c;互有胜负。 目前《元梦之星》略处下风&a…

打开链接跳转的模式

摘要&#xff1a; 今天遇到一个需求&#xff1a;后台小程序的域名下打开微信客服链接的&#xff01;但是小程序的域名拒绝任何第三方域名&#xff0c;跨域了&#xff01;为了上线这微信客服的功能&#xff0c;打开新页签&#xff0c;脱离小程序的域名实现微信客服链接的跳转启动…

python练习一

1. 五个PPT上的界面打印【print、input函数】 print("\t\t\t\t\t英雄联盟商城登录界面\n~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~\n\t\t\t\t\t1. 用户登录\n\t\t\t\t\t2. 新用户注册\n\t\t\t\t\t3. 退出系统\n" "~ * ~ * ~ * ~ * ~ * ~ * ~…

音视频实战---读取音视频文件的AAC音频保存成aac文件

1、使用avformat_open_input函数打开音视频文件 2、使用avformat_find_stream_info函数获取解码器信息。 3、使用av_dump_format设置打印信息 4、使用av_init_packet初始化AVPacket。 5、使用av_find_best_stream查找对应音视频流的流下标。 6、使用av_read_frame读取音视…

新发现个上头的神仙写简历工具,分分钟惊掉你下巴!

你们在制作简历时&#xff0c;是不是基本只关注两件事&#xff1a;简历模板&#xff0c;还有基本信息的填写。 当你再次坐下来更新你的简历时&#xff0c;可能会发现自己不自觉地选择了那个“看起来最好看的模板”&#xff0c;填写基本信息&#xff0c;却没有深入思考如何使简历…

字符串|28.实现strStr() 学会KMP算法

力扣题目链接 class Solution { public:void getNext(int* next, const string& s) {int j -1;next[0] j;for(int i 1; i < s.size(); i) {while(j > 0 && s[i] ! s[j 1]) {j next[j];}if(s[i] s[j 1]) {j;}next[i] j;}}int strStr(string haystack…

Python二级备考

考试大纲如下&#xff1a; 基本要求 考试内容 考试方式 比较希望能直接刷题&#xff0c;因为不懂的比较多可能会看视频。 基础操作刷题&#xff1a; 知乎大头计算机1-13题 import jieba txtinput() lsjieba.lcut(txt) print("{:.1f}".format(len(txt)/len(ls)…