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

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提供了一个控制测试的环境,监视和控制被测试程序的执行,可以直接发现和确定程序中的问题。

总结

在这里插入图片描述

  • 29
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

赵远疴

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值