第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 等伪指令定义,变量名即变量的符号地址。

变量的三个属性:

  1. 段基值属性:变量所在段的段基值
  2. 偏移地址属性:变量所在存储单元的段内偏移地址
  3. 类型属性:变量所占存储单元的字节数

注意:A DB 50, 60, 70, 80 中,A 仅代表第一个变量(初值50)的地址。

3.3 标号

标号是指令地址的名字(符号地址),定义在指令前,用冒号分隔。只能定义在代码段(CS)中,代表其后第一条指令首字节的地址。

标号的三个属性:

  1. 段基值属性:标号后第一条指令所在代码段的段基值
  2. 偏移地址属性:标号后第一条指令首字节的段内偏移
  3. 距离属性(类型):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个)

操作符格式功能
SEGSEG 变量/标号取段基值
OFFSETOFFSET 变量/标号取偏移地址
TYPETYPE 变量/标号取类型值(字节=1,字=2,双字=4…)
LENGTHLENGTH 变量取第一组DUP重复次数
SIZESIZE 变量取大小(= TYPE × LENGTH)

举例:

  • W1 DW 20 DUP(3, 10 DUP(7)) → TYPE=2, LENGTH=20, SIZE=40
  • W2 DW 8, 20 DUP(3, 10 DUP(7)) → TYPE=2, LENGTH=1, SIZE=2
  • B1 DB 20 DUP(3, 10 DUP(7)) → TYPE=1, LENGTH=20, SIZE=20

4.6 指定属性(合成)伪操作(3个)

操作符格式功能
PTR类型 PTR 操作数指定类型(BYTE/WORD/DWORD/NEAR/FAR)
:段寄存器:操作数临时指定段归属(段超越)
THISTHIS 类型指定当前地址的类型

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, 100

THIS 常与 EQU 连用,为当前存储单元定义一个指定类型的变量或标号,其段地址和偏移地址与下一个存储单元相同。

4.7 分离操作符(3个)

操作符格式功能
SHORTSHORT 标号按短距离处理(-128~+127)
HIGHHIGH 字操作数取高字节
LOWLOW 字操作数取低字节

例:HIGH 1234H = 12H,LOW 1234H = 34H

4.8 表达式与操作优先级

表达式四类:算术表达式、逻辑表达式、关系表达式、地址表达式

优先级从高到低:

  1. () [] <>
  2. LENGTH WIDTH SIZE MASK(结构字段名)
  3. :(段超越前缀)
  4. PTR OFFSET SEG TYPE THIS
  5. HIGH LOW
  6. +(正) -(负)
  7. * /
  8. MOD SHL SHR
  9. + -
  10. EQ NE LT LE GT GE
  11. NOT
  12. AND
  13. OR XOR
  14. SHORT

例:HIGH 1234H + 2 = 12H + 2 = 14H(HIGH优先于+) HIGH (1234H + 2) = HIGH 1236H = 12H

五、汇编语言的伪指令(7.1.5)

5.1 数据定义伪指令(6种)

伪指令单位字节数说明
DB字节1Define Byte
DW字2Define Word
DD双字4Define Doubleword
DF3字(远字)6Define Farword
DQ4字8Define Quadword
DT10字节10Define 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 表达式不可重复定义
PURGEPURGE 符号名...取消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种)

伪指令格式功能
ORGORG 常数表达式将$设为表达式的值
EVENEVEN将$调整为最近的偶数

示例:

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  ENDS

5.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(功能更强)

四大功能:

  1. 检查源程序,测出语法错误并给出信息
  2. 产生目标文件 .OBJ
  3. 可给出列表文件 .LST(源+目标对照)和交叉索引文件 .CRF
  4. 展开宏指令

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 XXH

DOS 中断(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  AX

7.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