第四章 宏汇编语言程序设计
本章内容
? 汇编语言程序格式
? MASM中的表达式
? 伪指令语句
? DOS系统功能调用
? BIOS中断调用
概述
? 汇编语言
? 利用指令的助记符、符号地址、标号来编
写的语句
? 汇编语言源原程序
? 用汇编语言编写的程序
汇编程序 连接程序
















一个例子程序
? Page 124,例 4-1
? 程序由 段的描述 组成
? 指令语句 /伪指令语句构成
§ 4-1 汇编语言程序格式
? 指令性语句
? 伪指令语句
? 数据项
汇编语言程序格式 —— 指令语句
? 对象
? CPU
? 与机器码相对应,要求 CPU执行的操作
? 格式
[标号,] 指令助记符 [[操作数 ],操作数 ][ ;注释 ]
汇编语言程序格式 —— 伪指令语句
? 对象
? 汇编程序
? 通知编译器,如何生成目标码。本身不产生
机器目标吗
? 格式
[名字 ] 伪指令助记符 [[操作数 ],操作数,..][ ;注释 ]
汇编语言程序格式 —— 数据项
? 常数
? 确定的数据,有固定值,没有属性
? 变量
? 存放在存储单元中的值
? 在程序中以变量名的形式出现,代表存放数
据的存储单元的 符号地址
? 三属性
? 段属性 /段内偏移量属性 /类型属性
汇编语言程序格式 —— 数据项
? 标号
? 可执行指令语句的首字节地址的符号表示
? 被 JMP/CALL/LOOP等 所使用
? 三属性
? 段属性 /段内偏移量属性 /类型(距离)属性
§ 4-2 MASM中的表达式
? 指令操作数形式
? 常数、变量、标号,表达式,关键字
? 表达式的构成
? 运算符
? 运算对象:常数、变量、标号
? 结果为 常数, 地址
? 在汇编时求值
? 六大类运算
表达式 —— 算术运算
? 加、减、乘、除、模、左移、右移
? 运算对象、结果
? 整数
? 禁忌
? 地址相加
? 无法求值
表达式 —— 算术运算
? 例,
abc equ 35h
var1 db 10h
var2 db 0ah
mov ax,abc shr 4
mov ax,abc shl 4
mov cx,var2 - var1
mov bx,abc - 5
表达式 —— 逻辑运算
? 与、或、非、异或 —— 按位运算
? 运算对象、结果
? 常数
? 禁忌
? 变量名
表达式 —— 逻辑运算
? 例,
abc = 10h
abc1 equ 2ah
v1 db 3ah
mov ax,abc and 0fh
mov ax,abc or abc1
mov ax,v1 and abc
表达式 —— 关系运算
? EQ,NE,LT,GT,LE,GE
? 对象
? 数据
? 同段内的偏移地址
? 结果
? 真:全 1
? 假:全 0
表达式 —— 关系运算
? 例,
abc equ 10h
mov ax,abc eq 10
mov ax,abc lt 10
mov ax,abc gt 10
表达式 —— 数值返回运算
? Offset,seg,type,length,size
? 对象
? 变量、标号
? 结果
? 值
表达式 —— 数值返回运算
? Offset
? 变量、标号的段内偏移地址
? 与 LEA 的差异???
? Seg
? 变量、标号的段地址
表达式 —— 数值返回运算
? Type
? 变量、标号的类型属性
? Length
? 外层 DUP的单元个数
? 无 DUP则返回 1
表达式 —— 数值返回运算
? Size
? size = length * type
表达式 —— 属性修改运算
? Ptr
? 临时改变变量、标号的类型属性
mov word ptr [bx],0
jmp far ptr sub1
? This
? 给变量、标号赋予类型
first equ this byte
table dw 2000h
表达式 —— 属性修改运算
? High/Low
? 字节分离
? 常数、常数表达式
mov al,low (offset da1)
§ 4-3 伪指令语句
? 不生成机器码,帮助解释、生成指令的
机器码
? 变量定义、存储器分配、段定义 ……
伪指令语句 —— 数据定义
? 定义 /分配变量的存储器单元,并初始化
存储器单元
? 格式
变量名 助记符 操作数,操作数 … ;注释
符号地址
DB
DW
DD
伪指令语句 —— 数据定义
? DUP的使用
? 定义重复数据
? 例
abc db 10 dup(0)
ab db 100 dup(1,2,34 dup(0))
伪指令语句 —— 数据定义
? 字符串的定义
? DB/DW/DD?
? DB按正常的顺序排列
? DW/DD只能以两个一组作定义,顺序不同
伪指令语句 —— 数据定义
? 符号地址的使用
? DW?
? DD?
? DB??
伪指令语句 —— 赋值
? 不分配存储器空间
? 常数
? EQU
? 不可重复赋值
? =
? 可重复赋值
伪指令语句 —— 段定义
段名 segment 定位类型 组合类型 ‘分类名’
……
段名 ends
伪指令语句 —— 段定义
段名 segment 定位类型 组合类型 ‘分类名’
……
段名 ends
定义该段起始地址定

Para
Byte
Word
Page
伪指令语句 —— 段定义
段名 segment 定位类型 组合类型 ‘分类名’
……
段名 ends
定义组合类型
NONE
PUBLIC
COMMON
AT
STACK
伪指令语句 —— 段定义
段名 segment 定位类型 组合类型 ‘分类名’
……
段名 ends
定义该段的分类名,分
类名相同,被组合成同
一个段
伪指令语句 —— 数据定义
dseg segment at 0055h
one db 0
two dw two
three dd two
four equ 10h
five dw four
six db 5 - four
dseg ends
伪指令语句 —— 段分配语句
? ASSUME
? 说明当前段是哪些段,帮助汇编程序产生段前缀
? 必须放在第一句指令之前
? 不得短缺
Assume cs:cseg,ds:dseg,ss:sseg,es:eseg
Assume nothing
伪指令语句 —— 过程定义
? 子程序
? 格式
过程名 PROC 属性
……
Ret
过程名 ENDP
伪指令语句 —— END
? 结束语句
? 标识程序的首指令
? 格式
END 标号
伪指令语句 —— 段寄存器的初始化
? DS/ES
? 指令装入
mov ax,dseg
mov ds,ax
mov ax,eseg
mov es,ax
伪指令语句 —— 段寄存器的初始化
? SS/SP
? 自动装入
sseg segment STACK
dw 100 dup(0)
sseg ends
伪指令语句 —— 段寄存器的初始化
? SS/SP(指令装入 )
? 定义
sseg segment
dw 100 dup(0)
top label word
sseg ends
? 装入
Mov ax,sseg
Mov ss,ax
Mov sp,offset top
top equ this word
伪指令语句 —— 段寄存器的初始化
? CS
? 自动装入
? end后的标号便是第一条指令 (语句 )
CS:IP
汇编语言源程序的框架
? 段的描述
? title
? 注释
? 数据段
? (附加段 )
? 堆栈段
? 代码段 (Assume)
? end 标号
汇编语言源程序的框架
Title <程序名 >
<常量定义 >
dseg segment
<变量定义 >
dseg ends
eseg segment
<变量定义 >
eseg ends
sseg segment stack
100H dup(0)
sseg ends
cseg segment
assume cs:cseg,ds:dseg,es:eseg,ss:sseg
main proc far
start,push ds
xor ax,ax
push ax
mov ax,dseg
mov ds,ax
mov ax,eseg
mov es,eseg
……
ret
main endp
cseg ends
end start
其他伪指令
? ORG <表达式 >
? 定位伪指令
? 设置汇编程序位置指针,指定下一语句的起
始偏移地址
? $
? 汇编时用于指示下一数据 /指令的段内偏移量,
当前位置计数器
? 常常用来计算前一变量的长度,字节数
其他伪指令
dseg segment
org 1000h
v1 db 10h,20h,30H,40H
count equ $ - v1
dseg ends
其他伪指令
? <名称 > Label <类型 >
? 给存储单元 (变量或标号 )取一名字,并指定其
类型
? <名称 >同样具有三个属性
DataByte Label Byte
DataWord DW 20H Dup(0)
结构定义语句
? 复杂数据的定义,将不同类型的数据放在
同一个数据结构中
? 结构定义
结构名 STRUC
……
结构名 ENDS
? 结构变量预置
结构变量名 结构名 <元素值,元素值,……>
定义结构成员,
但不分配内存
预置时,才被分配存储单元
结构定义预置
tab struc
t1 db ‘abcd’
t2 dw?
t3 dw seg L1
t4 dw 2 dup(0)
t5 dw 1122H
dw 3344H
tab ends
one tab <>
two tab <‘STOP’>
three tab <,0FH,SEG L2>
four tab 5 dup <‘EFGH’,55H>
结构中的变量
? 简单变量
? 由 DB,DW,DD定义的单个结构元素
? 内容可被修改
? 如,T1 DW 1234H
? 多重变量
? 包含多个元素
? 值不可改,只能使用初值
? 如,T4 DW 2 DUP( 0)
? T5 DW 1122H,3344H
结构中的变量
? 字符串
? 内容可改,长度不得超过
? 如,T6 DB ‘ASBD’
? 多重结构
? 引用另一结构
结构的使用
MOV TWO.T2,AX
MOV BX,FOUR.T5[0]
MOV SI,OFFSET FOUR
MOV BX,[SI].T5[0]
结构的使用
? 例,Page 149/例 4-41
? 利用结构存储学生的信息
? 结构变量的预置
? ……
§ 4-4 DOS系统功能调用和 BIOS中断调用
? 中断服务子程序
? INT n
? API,用户不必了解 I/O设备及接口的要求,
方便使用
常用的软件中断
? 退出程序
? Int 20h,程序段前缀,DS段首地址,INT 20H的代码
? Int 21h,返回 DOS
? Int 27h,驻留退出
? 根据情况选择退出的方式
DOS系统功能调用
? 一个中断服务子程序,根据不同的调用参
数,区分不同的操作