第7章 汇编语言的基本语法
1A003 计算机组织与系统结构 · 第二部分 授课对象:8086/8088 CPU,MASM V5.0 宏汇编
一、汇编语言概述
1.1 定义
汇编语言是一种面向机器的程序设计语言,是用符号表示的低级程序设计语言(机器语言的符号化描述),通常为特定计算机或计算机系列专门设计。
- 用汇编语言编写的程序不能由机器直接执行,必须经汇编程序翻译成机器语言程序
- 汇编语言指令与机器语言指令之间基本是一一对应的关系
1.2 优缺点
优点:
- 可充分利用机器的硬件功能和结构特点
- 加快程序执行速度
- 减少目标程序占用的存储空间
- 常用于编写实时控制程序、实时通信程序、系统软件程序
缺点:
- 编程效率低(与人们描述计算过程的需要差距大)
- 与机器硬件结构紧密耦合,可移植性差
二、汇编语言源程序的组成(7.1.2)
2.1 两类语句
MASM V5.0 规定,源程序每行只能写一个语句,行长不超过 128 个字符。每个语句最多由四个字段组成:名字字段、操作字段、操作数字段、注释字段。
| 语句类型 | 格式 | 说明 |
|---|---|---|
| 伪指令语句(说明性) | [名字] 伪指令说明符 [参数...] [;注释] | 面向汇编程序和连接程序,不产生机器代码 |
| 指令语句(可执行) | [名字:] 指令助记符 [操作数...] [;注释] | 经汇编后翻译成机器指令,由CPU执行 |
- 伪指令的名字:段名、过程名、变量名、符号名、宏名、结构名、记录名等
- 指令语句的名字:只能是标号(后跟冒号)
- 注释以分号
;开头,汇编程序忽略
2.2 示例
; 伪指令语句
A DB 20H, 30H ; 定义字节变量
; 指令语句
L: ADD AX, BX ; 加法指令,L为标号三、汇编语言的操作对象与数据类型(7.1.4)
3.1 常数与常量
编程时已确定其值、运行期间不变的数据对象称为常数。
8086/8088 允许四种形式的常数:整数、字符串、组合BCD码数、实数,但 CPU 只能处理前三种。
常数表达式的名字称为常量,用 EQU 或 = 定义:
A EQU 7— EQU 定义的符号不允许重复定义A = 7—=定义的符号可以重复定义(如A = 8)
3.2 变量
编程时只能确定初始值、运行期间可修改的数据对象称为变量。变量是存储单元中的数据,通常定义在数据段(DS)和附加段(ES)。
变量由 DB/DW/DD 等伪指令定义,变量名即变量的符号地址。
变量的三个属性:
- 段基值属性:变量所在段的段基值
- 偏移地址属性:变量所在存储单元的段内偏移地址
- 类型属性:变量所占存储单元的字节数
注意:
A DB 50, 60, 70, 80中,A 仅代表第一个变量(初值50)的地址。
3.3 标号
标号是指令地址的名字(符号地址),定义在指令前,用冒号分隔。只能定义在代码段(CS)中,代表其后第一条指令首字节的地址。
标号的三个属性:
- 段基值属性:标号后第一条指令所在代码段的段基值
- 偏移地址属性:标号后第一条指令首字节的段内偏移
- 距离属性(类型):NEAR(近,段内)或 FAR(远,段间)
3.4 段名与过程名
- 段名:
SEGMENT和ENDS左边的名字,标识段的开始和结束 - 过程名:
PROC和ENDP左边的名字,等同于标号,具有标号的全部属性
3.5 偏移地址计数器 $
汇编程序用 $ 保存当前正在汇编的指令/变量的偏移地址。每个段开始时 $ 清为 0,每处理一条就增加对应字节数。
在伪指令中:$ 代表其所在地的偏移地址
A DW 1, 2, $+4, 3, 4, $+4
; 若A偏移0074H,则第一个$+4 = 0074H+4+4 = 007CH
; 第二个$+4 = 0074H+0AH+4 = 0082H在指令中:$ 代表本条指令第一个字节的偏移地址
DEC CX
JZ $+5 ; 跳过后面3字节的MOV指令
MOV AX, 2
LAB: ...四、汇编语言的伪操作符
4.1 算术伪操作(7个)
+ - * / MOD SHL SHR
- 用于数据运算、地址运算、数据与地址混合运算
- 例:
124 MOD 3 = 1,10110101B SHL 2 = 11010100B - 地址运算例:
N1 EQU B1-W1(字节数),N2 EQU $-W1(从W1到当前的字节数)
4.2 关系伪操作(6个)
EQ NE LT GT LE GE
- 结果为逻辑值:真 = -1(n位全1),假 = 0(n位全0)
- 例:字操作时
(60H LE 70H) GE (60H LT 30H) = 0FFFFH GE 0000H = 0FFFFH
4.3 逻辑伪操作(4个)
NOT AND OR XOR
- 例:字操作
1234H OR 2AFEH = 3AFEH,NOT 0F0H = 0FF0FH - 字节操作
NOT 0F0H = 0FH
4.4 重复置数操作符 DUP
格式:重复次数 DUP (初值1[, 初值2...])
; 以下四行等效(13个变量)
W DW 25, 8, 2, 3, 2, 3, 6, 8, 2, 3, 2, 3, 6
W DW 25, 2 DUP(8, 2, 3, 2, 3, 6)
W DW 1 DUP(25), 2 DUP(8, 2 DUP(2, 3), 6)
W DW 1 DUP(25), 2 DUP(1 DUP(8), 2 DUP(2, 3), 1 DUP(6))- LENGTH:第一组变量的重复次数(W 的 LENGTH = 1)
- SIZE = TYPE × LENGTH(W 的 SIZE = 2 × 1 = 2)
练习:
A DB 1, 2, 5 DUP(0,1,2 DUP(3))→ 前6字节数据是:01H, 02H, 00H, 01H, 03H, 03H
4.5 取属性(分析)伪操作(5个)
| 操作符 | 格式 | 功能 |
|---|---|---|
SEG | SEG 变量/标号 | 取段基值 |
OFFSET | OFFSET 变量/标号 | 取偏移地址 |
TYPE | TYPE 变量/标号 | 取类型值(字节=1,字=2,双字=4…) |
LENGTH | LENGTH 变量 | 取第一组DUP重复次数 |
SIZE | SIZE 变量 | 取大小(= TYPE × LENGTH) |
举例:
W1 DW 20 DUP(3, 10 DUP(7))→ TYPE=2, LENGTH=20, SIZE=40W2 DW 8, 20 DUP(3, 10 DUP(7))→ TYPE=2, LENGTH=1, SIZE=2B1 DB 20 DUP(3, 10 DUP(7))→ TYPE=1, LENGTH=20, SIZE=20
4.6 指定属性(合成)伪操作(3个)
| 操作符 | 格式 | 功能 |
|---|---|---|
PTR | 类型 PTR 操作数 | 指定类型(BYTE/WORD/DWORD/NEAR/FAR) |
: | 段寄存器:操作数 | 临时指定段归属(段超越) |
THIS | THIS 类型 | 指定当前地址的类型 |
PTR 例:MOV BYTE PTR [BX], 5 — 指定存储单元为字节类型
段超越例:MOV AX, ES:[BX] — 段基值取自ES而非DS
THIS 例:
A EQU THIS BYTE ; A为字节类型,与B同地址
B DD 12345678H ; B为双字类型
START EQU THIS FAR ; START为FAR属性标号
MOV CX, 100THIS 常与 EQU 连用,为当前存储单元定义一个指定类型的变量或标号,其段地址和偏移地址与下一个存储单元相同。
4.7 分离操作符(3个)
| 操作符 | 格式 | 功能 |
|---|---|---|
SHORT | SHORT 标号 | 按短距离处理(-128~+127) |
HIGH | HIGH 字操作数 | 取高字节 |
LOW | LOW 字操作数 | 取低字节 |
例:HIGH 1234H = 12H,LOW 1234H = 34H
4.8 表达式与操作优先级
表达式四类:算术表达式、逻辑表达式、关系表达式、地址表达式
优先级从高到低:
()[]<>LENGTHWIDTHSIZEMASK(结构字段名):(段超越前缀)PTROFFSETSEGTYPETHISHIGHLOW+(正)-(负)*/MODSHLSHR+-EQNELTLEGTGENOTANDORXORSHORT
例:
HIGH 1234H + 2 = 12H + 2 = 14H(HIGH优先于+)HIGH (1234H + 2) = HIGH 1236H = 12H
五、汇编语言的伪指令(7.1.5)
5.1 数据定义伪指令(6种)
| 伪指令 | 单位 | 字节数 | 说明 |
|---|---|---|---|
DB | 字节 | 1 | Define Byte |
DW | 字 | 2 | Define Word |
DD | 双字 | 4 | Define Doubleword |
DF | 3字(远字) | 6 | Define Farword |
DQ | 4字 | 8 | Define Quadword |
DT | 10字节 | 10 | Define Tenbytes |
示例:
A DB 12H, ? ; 字节,2个
B DW ?, 3456H ; 字,2个
C DD 789ABCDEH ; 双字,1个
D DB 'A', 'B', 'C', 'D' ; 字符串,4字节
E DB 'ABCD' ; 同上,4字节
F DW 'AB', 'CD' ; 字字符串,存储顺序不同注意:
DB 'AB'和DW 'AB'的存储情况不同(低字节/高字节顺序不同)。
5.2 符号定义伪指令(3种)
| 伪指令 | 格式 | 说明 |
|---|---|---|
= | 符号名 = 表达式 | 可重复定义 |
EQU | 符号名 EQU 表达式 | 不可重复定义 |
PURGE | PURGE 符号名... | 取消EQU定义,之后可重新定义 |
5.3 段定义伪指令(3种)
(1) SEGMENT — 段开始
格式:段名 SEGMENT [定位类型] [组合类型] ['类别']
定位类型(4种):
BYTE:任意字节地址开始WORD:偶地址开始PARA(缺省):节地址开始(16的倍数)PAGE:页地址开始(256的倍数)
1节 = 16字节,1页 = 16节 = 256字节
组合类型(6种):
PUBLIC STACK COMMON MEMORY AT 表达式 NONE(缺省)
- 堆栈段必须用
STACK类型,不能省略 - NONE 表示各段不组合,各有自己的段基值
类别:用引号括起,同类别的段相邻存放,长度不超过40字符。
(2) ENDS — 段结束
格式:段名 ENDS — 段名必须与 SEGMENT 左边相同。
(3) ASSUME — 指定段寄存器
格式:ASSUME 段寄存器:段名[, 段寄存器:段名...]
必须出现在变量和标号使用之前,指定某段由哪个段寄存器寻址。
5.4 指定偏移地址伪指令(2种)
| 伪指令 | 格式 | 功能 |
|---|---|---|
ORG | ORG 常数表达式 | 将$设为表达式的值 |
EVEN | EVEN | 将$调整为最近的偶数 |
示例:
ORG 1000H
A DB 47H, 12H, 45H ; 地址1000H~1002H
EVEN ; 调整到1004H
B DB 47H ; 地址1004H字数组对齐技巧:
DATA-SEG SEGMENT
EVEN
WORD-ARRAY DW 100 DUP(?)
DATA-SEG ENDS5.5 过程定义伪指令(2种)
过程名 PROC [NEAR|FAR] ; NEAR为缺省
...
RET
过程名 ENDP过程名等同于标号,具有段基值、偏移地址、距离三个属性。
5.6 类型定义伪指令 LABEL
格式:变量名或标号 LABEL 类型属性名
作用:给当前地址处的变量或标号取一个别名,并赋予另一种类型属性。与 EQU THIS 作用类似。
六、汇编语言程序的开发(7.1.3)
6.1 开发流程
源程序.ASM → 汇编(MASM.EXE) → 目标文件.OBJ → 连接(LINK.EXE) → 可执行文件.EXE
↓
调试(DEBUG.COM)
6.2 汇编程序功能(两种)
- 基本汇编 ASM.EXE
- 宏汇编 MASM.EXE(功能更强)
四大功能:
- 检查源程序,测出语法错误并给出信息
- 产生目标文件 .OBJ
- 可给出列表文件 .LST(源+目标对照)和交叉索引文件 .CRF
- 展开宏指令
6.3 连接程序 LINK.EXE
- 对 .OBJ 文件进行定位、链接
- 生成 .EXE 可执行文件
- 可生成 .MAP 映射文件和 .LIB 库文件
6.4 调试程序 DEBUG.COM
常用命令:
U— 反汇编G =起始地址 断点地址— 执行T =地址 指令条数— 单步跟踪
6.5 BIOS 和 DOS 中断
BIOS 中断:位于 ROM 中(地址 0FE00H 开始的 8KB),提供上电自检、引导装入、I/O设备处理程序等。
调用格式:
设置入口参数 → 设置功能号(AH) → INT XXHDOS 中断(INT 21H):类型 21H 的软件中断,包含一系列功能子程序(外设管理、文件读写、目录管理等)。
; 例:在显示器上输出字符 '$'
MOV DL, '$' ; 入口参数
MOV AH, 6 ; 功能号6
INT 21H ; DOS系统功能调用七、宏汇编(7.4)
7.1 宏定义与宏调用
宏(MACRO)是源程序中一段有独立功能的代码,定义一次可多次调用。
宏定义格式:
宏名 MACRO [形式参数表] ; 用逗号隔开
... ; 宏定义体
ENDM宏调用格式:宏名 [实在参数表]
汇编时进行宏展开:用宏定义体取代宏指令名,用实在参数一一取代形式参数。
7.2 无变元宏
; 宏定义
SAVEREG MACRO
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
ENDM
; 宏调用
SAVEREG
; 宏展开:将上述6条PUSH全部列出7.3 带参数宏
; 宏定义
FOO MACRO P1, P2, P3
MOV AX, P1
P2 P3
ENDM
; 宏调用
FOO WORD_VAR, INC, AX
; 宏展开:
+ MOV AX, WORD_VAR
+ INC AX7.4 宏调用 vs 子程序调用
| 对比项 | 子程序调用 | 宏调用 |
|---|---|---|
| 处理时机 | 运行时调用 | 汇编时展开 |
| 目标代码长度 | 短(一份) | 长(每次调用都展开) |
| 内存占用 | 小 | 大(调用次数越多越大) |
| 执行时间 | 长(调用/返回开销) | 短(无额外开销) |
| 参数传递方式 | 寄存器/栈/存储器 | 直接参数替换 |
适用场景:功能简短、调用次数少 → 宏;功能复杂、调用频繁 → 子程序
八、完整示例程序
DATA SEGMENT ; 数据段
NUM DW 0011101000000111B
NOTES DB 'The result is:', '$'
DATA ENDS
CODE SEGMENT ; 代码段
ASSUME CS:CODE, DS:DATA
BEGIN:
MOV AX, DATA
MOV DS, AX
MOV DX, OFFSET NOTES ; 显示提示信息
MOV AH, 9H
INT 21H
MOV BX, NUM ; 装入数据
MOV CH, 4 ; 4位十六进制
ROTATE:
MOV CL, 4
ROL BX, CL ; 循环左移4位
MOV AL, BL
AND AL, 0FH ; 取低4位
ADD AL, 30H ; 转ASCII
CMP AL, '9'
JLE DISPLAY
ADD AL, 07H ; A~F 加7
DISPLAY:
MOV DL, AL
MOV AH, 2
INT 21H ; 显示一位
DEC CH
JNZ ROTATE
MOV AX, 4C00H ; 返回DOS
INT 21H
CODE ENDS
END BEGIN功能:将 NUM 中的 16 位二进制数以 4 位十六进制数形式在屏幕上输出。
状态: partial(图片型PPT,嵌入文本层完整提取,核心知识体系完整) 关联: 计算机组成-第5章-计算机微型计算机的组成及工作过程 · 第8章-寻址方式与指令系统-计算机组成 来源: /田浩然上传的资料/1A003 计算机组织与系统结构/第二部分/第7章 汇编语言的基本语法.ppt