8086汇编语言宏指令语句
8086汇编指令手册

8086汇编指令手册一、数据传输指令它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.1. 通用数据传送指令.MOV 传送字或字节. 例: MOV 目的操作数源操作数(CX不能作目的)MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字传送到以SS为段基址、SP为偏移地址的栈中(SP-1指示堆栈中可以存放数据的位置,存源操作数的高8位 SP-2源操作数的低8位,完成进栈操作)例:PUSH 源操作数POP 把字弹出堆栈. 与PUSH相反例:POP 目的操作数PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSWAP 交换32位寄存器里字节的顺序XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数,操作数不能为立即数) 例:XCHG 目的操作数,源操作数CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )XADD 先交换再累加.( 结果在第一个操作数里 )XLAT 字节查表转换.例:MOV BX,2000H ;BX 指向一张 256 字节的表的偏移首地址MOV AL,5 ;AL 为表的被转换码 (0-255,即0-FFH)XLAT ;返回 AL 为查表结果. ( [BX+AL]->AL )2. 输入输出端口传送指令.输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,其范围是 0-65535.IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} ) 例:IN AL,n (00H-FFH) IN AX,DX(16位)OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 ) 例:OUT n,AL OUT DX,AX3. 目的地址传送指令.LEA 装入有效地址. LEA 16位寄存器,源操作数偏移地址例: LEA SI,[2040H] ;(SI)=2040H注:MOV SI,[2040H] ;SI中为偏移地址为2040单元中的内容,而不是2040H这个值LDS 传送目标指针,把指针内容装入DS. 例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送目标指针,把指针内容装入ES. 例: LES DI,string ;把段地址:偏移地址存到ES:DI.LFS 传送目标指针,把指针内容装入FS. 例: LFS DI,string ;把段地址:偏移地址存到FS:DI.LGS 传送目标指针,把指针内容装入GS. 例: LGS DI,string ;把段地址:偏移地址存到GS:DI.LSS 传送目标指针,把指针内容装入SS. 例: LSS DI,string ;把段地址:偏移地址存到SS:DI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装入AH. FR寄存器的低8位->AH SAHF 标志寄存器传送,把AH内容装入标志寄存器. AH->FR寄存器的低8位PUSHF 标志入栈. FR寄存器推入堆栈中POPF 标志出栈.从栈顶中弹出的内容存入FR寄存器中(唯一可改变TF标志位的指令)PUSHD 32位标志入栈.POPD 32位标志出栈.二、算术运算指令ADD 加法.(进位影响CF标志位)例:ADD AL,12H; ADD WORD PTR[BX],5B28H ;WORD PTR 是伪指令,用以指明该存储器操作数是字型ADC 带进位加法. (低16用ADD,高16位用ADC)INC 加 1. 例:INC AX; INC BYTE PTR[BX];PTR为宏汇编中的运算符,BYTE用以指明该存储器操作数是字节型AAA 对非压缩BCD数加法操作的结果进行校正DAA 对压缩BCD数加法操作的结果进行校正SUB 减法.无符号操作数相减,若CF=1,则结果为补码。
8086汇编语言宏指令语句

Source listing[NUL.LST]: (源列表文件名)
列表文件名(缺省:无列 表文件)
Cross reference[NUL.CRF]: 交叉参考文件用的文件名 (缺省:无交叉参考文件) (交叉参考文件名)
第5章 汇编语言程序设计
5.2.3 用连接程序生成可执行程序文件(EXE 文件) 经汇编后产生的目标程序文件(OBJ文件)并不 是可执行程序文件,必须经连接后才能成为可执行文件 (EXE文件)。连接程序并不是专门为汇编语言程序设 计的,如果一个程序是由若干个模块组成的,也可以通 过连接程序把它们连接在一起。这些模块可以是汇编程 序产生的目标程序文件,也可以是高级语言编译程序产 生的目标程序文件。 完成连接功能的程序是LINK程序。连接过程如下 表所示:
第5章 汇编语言程序设计
⑵ 从程序的执行时间来分析,每调用一次子程序 都要保护和恢复返回地址(断点)及寄存器内容(现场) 等,要消耗较多的时间。宏指令调用时不需要这个过程, 执行时间较短。因此,从执行时间来分析,宏指令又优 于子程序。 综上所述,当某一需多次访问的程序段较长,访 问次数又不是太多时,选用子程序结构较好。当某一需 多次访问的程序段较短,访问次数又很频繁时,选用宏 指令结构显然要更好些。
库文件名表(各文件之间 用+号隔开)
第5章 汇编语言程序设计
DATA SEGMENT … DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA START: MOV AX, DATA MOV DS, AX MOV ES, AX … MOV AH, 4CH INT 21H CODE ENDS END START
第5章 汇编语言程序设计
5.5.1 用编辑程序建立汇编语言源程序文件
8086汇编语言

DATA_WORD DW 100, 100H
DATA_BYTE DB 100 DUP (?)
MESS1
DB ‘AB’
MESS2
DW ‘AB’
例: OPER1 DB 1, 2 OPER2 DW 1234H, 5678H … MOV AX, WORD PTR [ OPER1+1] MOV AL, BYTE PTR [OPER2]
伪指令--供汇编过程的20种伪操作。 3、操作数 (1)常数类:
二、八、十、十六进制、科学表示法、字符串等
(2)变量(标号):所有的变量和标号都有三种属性
段值(SEG) 偏移量(OFFSET) 类型(TYPE):变量(BYTE/WORD/DWORD)
标号(NEAR / FAR)
(3)表达式
A、算术操作符: , , ,
AX=3402H AL=34H
OPER1 01 02
OPER2 34 12 78 56
低地址 高地址
三、段定义伪操作
格式: 段名 SEGMENT [定位类型, 组合类型, 类别]
……
段名 ENDS 例:定义用户堆栈
stack segment qqq dw 40H dup (?) stack ends code segment
start: mov ax, data1
mov ds, ax
mov ax, data2
mov es, ax
; 段地址段寄存器
…
code ends
end start
四、程序开始和结束伪操作 ORG 常数表达式 ;使下一地址是常数表达式的值 ORG 100H START: …...
END [程序首地址标号] 五、过程定义 PROC
宏汇编语言小结

ARRAY ARYEND
DW DW MOV
1,2,3,4,5,6,7 ? CX, (ARYEND-ARRAY)/2
; 符号地址常数 有意义 ; 时意义不明确 ;
ADD MOV MOV
AX, BLOCK+2 AX, BX+1 AX, [BX+1]
; 寄存器间接寻址
2)逻辑运算符
逻辑运算符包括:逻辑乘(AND)、逻辑加(OR)、按 位加(XOR)、逻辑非(NOT)四种运算;另外还有 SHL(左移)、SHR(右移)运算。由于逻辑运算是按 位操作,且在汇编过程中完成,因而运算的结果仍为整 数常量。
综合举例
DATA SEGMENT A DW M BUF DB ‘AB’,0DH,0AH CON EQU 500H B DW 0FFAAH D DD BUF M DB 2 DUP (1),A DUP(2,’B’),’123’,1,2,3 DATA ENDS
4 标号
标号是一条指令语句的符号地址。在汇编源程序中,只有在需要 转向一条指令语句时,才为该指令语句设置标号,以便在转移类 指令(含子程序调用指令)中直接引用这个标号。因此,标号可 作为转移类指令的操作数,即转移地址。 【例】符号地址表示。 ┆ NEXT:MOV AL, [SI] ;带标号NEXT的指令 ┆ DEC CX JNE NEXT ;标号NEXT作转移指令的操作数
宏汇编语言 小结
宏汇编语言格式 表达式 (*)8086基本指令系统 常用的汇编伪指令
宏汇编语言格式
1 指令语句格式
2 伪指令语句格式
1 指令语句格式
指令语句的一般格式如下: [标号:]指令助记符 [ 操作数 ]; [ 注释] 标号:标号是机器指令语句存放地址的符号表示,代表 该指令目标代码的第一个字节地址,后面必须紧跟冒号 “:” 。 指令助记符:指令助记符为语句的核心成分,表示了该 语句的操作类型。 操作数:操作数表示指令助记符的操作对象。 注释:注释均以分号开始,它可占一行或多行,一般放 在一条语句的后面。
8086-8088 汇编语言指令表

(续)
操作
ODITSZAPC
无符号除法:AX 除以 src,商送 AL,余 数送 AH;或(DX,AX)除以 src,商送 AX, 余数送 DX 带符号除法:AX 除以 src,商送 AL,余数 送 AH;或(DX,AX)除以 src,商送 AX,余 数送 DX
u---uuuuu u---uuuuu
把 AL 中的和调整到压缩的 BCD 格式
u---xxxxx
把 AL 中的差调整到压缩的 BCD 格式
u---xxxxx
把 AL 中的和调整到非压缩的 BCD 格式, AH 加调整产生的进位值 把 AL 中的差调整到非压缩的 BCD 格式, AH 减调整产生的借位值
u---uuxux u---uuxux
---------
JZ JE
跳 JZ label
JNZ JNE 转 JNZ label
JS
JS label
若 ZF 为 1,转到 label 处继续执行 若 ZF 为 0,转到 label 处继续执行 若 SF 为 1,转到 label 处继续执行
-------------------------
·418·
-----------------
把标志寄存器 FLAGS 入栈
---------
POPF IN OUT ADD ADC INC
POPF
出栈一个字数据,送到标志寄存器 FLAGS 中
rrrrrrrrr
IN AL, src IN AX, src OUT dst, AL OUT dst, AX ADD dst, src
JNC label
若 CF 为 0,即无符号数比较的不小于,
转到 label 处继续执行---------跳 转
8086伪指令

8086伪指令(汇编语言程序格式)汇编语言程序中的语句可以由指令、伪指令和宏指令组成。
上一章我们介绍了8086指令系统中的6类指令,每一条指令都对应一种CPU操作。
伪指令又称为伪操作,它是在对源程序汇编期间由汇编程序处理的操作,它们可以完成如处理器选择、定义程序模式、定义数据、分配存储区、指示程序结束等功能。
宏指令是由用户按照宏定义格式编写的一段程序,其中语句可以是指令、伪指令,甚至是已定义的宏指令。
宏指令将在第七章中介绍。
伪指令和指令的区别在于,每一条指令必须生成机器代码,然后在程序运行期间由CPU来执行其操作;而伪指令是在汇编期间由汇编程序执行的操作命令,除了数据定义及存储器分配伪指令分配存储器空间外,其它伪指令不生成目标码。
和各种指令一样,伪指令也是程序设计不可缺少的工具。
下面介绍一些常用的伪指令。
4.2.1 段定义伪指令段定义伪指令是表示一个段开始和结束的命令,80x86有两种段定义的方式:完整段定义和简化段定义,分别使用不同的段定义伪指令来表示各种段。
4.2.1.1 完整的段定义伪指令完整段定义伪指令的格式如下:段名 SEGMENT...段名 ENDS段名由用户命名。
对于数据段、附加段和堆栈段来说,段内一般是存储单元的定义、分配等伪指令语句;对于代码段中则主要是指令及伪指令语句。
定义了段还必须说明哪个段是代码段,哪个段是数据段。
ASSUME伪指令就是建立段和段寄存器关系的伪指令,其格式为:ASSUME 段寄存器名: 段名,…段寄存器名必须是CS、DS、ES和SS中的一个,而段名必须是由SEGMENT定义的段名。
·定位类型:说明段的起始边界值(物理地址)。
·组合类型:说明程序连接时的段组合方法。
·类别:在单引号中给出连接时组成段组的类型名。
连接程序可把相同类别的段的位置靠在一起。
例4.1; * * * * * * * * * * * * * * * * * * * * * * *data_seg1 segment ; 定义数据段...data_seg1 ends; * * * * * * * * * * * * * * * * * * * * * * *data_seg2 segment ; 定义附加段...data_seg2 ends; * * * * * * * * * * * * * * * * * * * * * * *code_seg segment ; 定义代码段assume cs:code_seg, ds:data_seg1, es:data_seg2start: ; 程序执行的起始地址; set DS register to current data segmentmov ax, data_seg1 ; 数据段地址mov ds, ax ; 存入DS寄存器; set ES register to current extra segmentmov ax, data_seg2 ; 附加段地址mov es, ax ; 存入ES寄存器...code_seg ends ; 代码段结束; * * * * * * * * * * * * * * * * * * * * * * * * * *end start由于ASSUME伪指令只是指定某个段分配给哪一个段寄存器,它并不能把段地址装入段寄存器中,所以在代码段中,还必须把段地址装入相应的段寄存器中:MOV AX,DATA_SEG1 ; 数据段地址MOV DS,AX ; 存入DS寄存器MOV AX,DATA_SEG2 ; 附加段地址MOV ES,AX ; 存入ES寄存器如果程序中还定义了堆栈段STACK_SEG,也需要把段地址装入SS中:MOV AX,STACK_SEG ; 堆栈段地址MOV SS,AX ; 存入ES寄存器注意,在程序中不需要用指令装入代码段的段地址,因为在程序初始化时,装入程序已将代码段的段地址装入CS寄存器了。
华中科技大学8086汇编讲义第三章宏汇编语言
第三章宏汇编语言每种计算机语言都规定了自己的字符、基本词汇、典型语句和语法规则。
同样,汇编语言也有自己的字符、基本词汇、典型语句和语法规则。
字符:ASCII字符基本词汇:符号指令(MOV、ADD)伪指令(DB、SEGMENT等)典型语句:●机器指令语句——对应机器指令的一种操作。
●伪指令语句——无机器语言与之对应,不生成机器指令。
●宏指令语句——一条宏指令对应多条机器指令,产生一组目标代码。
语法规则:基本语法单位(常量、变量、标号、表达式)前面的例子已介绍了源程序的基本结构、格式、名字的定义、语句格式,下面将更深入地介绍有关语法规则。
3.1表达式汇编程序的语句及程序格式都比较固定,语句中除正确选择操作符之外,主要问题在于正确表示操作数地址,这涉及到寻址方式,可以归结到地址表达式的使用。
表达式:由常数、寄存器、标号、变量加上运算符构成的式子。
3.1.1.常量与数值表达式一.常量常量:从源程序翻译成目标程序期间已经有确定数值的量。
用途:赋值、作立即数、位移量。
由常量与运算符组成的式子。
数值表达式在汇编期间进行运算,结果为常量。
汇编期间允许对常量进行3种运算:1.算术运算包括:+、–、*、/、模除(MOD,取余数)、右移、左移。
2.逻辑运算●逻辑乘:AND(与)●逻辑加:OR(或)●按位加:XOR(异或)●逻辑非:NOT(非)3.关系运算包括:相等(EQ)、不等(NE)、小于(L T)、大于(GT)、小于等于(LE)、大于等于(GE)。
运算结果:关系不成立,结果为0;关系成立,结果为–1(0FFFFH)。
如:N = 50M = (N EQ 50)该关系成立,M =–1。
3.1.2.变量、标号与地址表达式一.变量变量:数据存贮单元的名字。
(存放地址的符号表示)。
变量有三个属性:段、EA、类型。
其中类型由定义时的伪指令确定(DB、DW、DD、DT)。
变量的定义:格式:[变量名] 数据定义伪指令表达式[,…]数据定义伪指令:DB、DW、DD、DQ、DT等。
8086汇编语言语句的类型和格式
⑴ 算术运算符:+、-、*、/和取模运算。
⑵ 逻辑运算符:、、和。
⑶ 关系运算符:、、、、、。结果只有两个全 1或全0。
⑷ 分析运算符:利用分析运算符可以把一个存 储单元地址分解为段地址和偏移地址等。分析运算符 有 、 、、和等。
分析运算符表达式
带分析运算符的表达式
: ,2[] ;取一个字节加数 1 0F8H,60H,0,74H,3 ;被加数 第一条语句是指令语句,其中“:”是名字,“”是指令助记符, “,2[]”是操作数,“;”后面是注释部分;第二条语句是伪指 令语句,其中“1”是名字,“”是伪指令定义符,“0F8H, 60H,0,74H,3”是操作数,“;”后面是注释部分。
⑵ 定义变量的类型为,给变量分配字操作数。
⑶ 定义变量的类型为,给变量分配双字操作 数。
除了常数、表达式和字符串外,问号“?”也 可以作为数据定义伪指令的操作数,此时仅给变量保 留相应的存储单元,而不赋与变量某个确定的初值。
当同样的操作数重复多次时,可用重复操作符 “”表示,其形式为:
n (初值[,初值…0])
1) 名字
汇编语言语句的第一个组成部分是名字()。在指令语句 中,这个名字是一个标号。指令语句中的标号实质上是指“:”后 面指令所在的存储地址(逻辑地址)。供、和等指令作操作数使用, 以寻找转移目标地址。并非每条指令语句必须有标号,但如果 一条指令前面有一标号,则程序中其它地方就可以引用这个标 号。在例5.1中,、就是标号。标号后面有一个冒号。
• , K3
;()←20H,返回前面的数值
• , K4
;()←01H
• , K3
;()←40H
• , K4
;()←04H
8086汇编语言指令表(按字母顺序)
2. 示例: (AL)=18H,(BL)=06H
ADD AL,BL ; (AL)<--(AL)+(BL) ; (AL)=1EH
DAA ; (AL)
DAS
组合十进制减法调整指令 DAS(Decimal Adjust for Subtraction)
则(AL)<--(AL)-6,(AH)<--(AH)-1,CF<--AF,(AL)<--(AL) and 0FH,
否则(AL)<--(AL) and 0FH
ADC
带进位加法指令 ADC(Addition Carry)
格式: ADC OPRD1,OPRD2
功能: OPRD1<--OPRD1 + OPRD2 + CF
DAA
组合的十进制加法调整指令 DAA(Decimal Adjust for Addition)
格式: DAA
功能: 对AL中的两个组合进制数相加的结果进行调整,调整结果仍放在AL中,进位标志放在CF中.
说明:
1. 调整操作如下
(1) 若(AL) and 0FH>9 或 AF=1,则(AL)<--(AL)+6,AF<--1,对低四位的调整.
格式: DAS
功能: 对两个组合十进制数相减后存于AL中的结果进行调整,调整后产生一个组合的十进制数且仍存于AL中.
说明:
调整操作
若(AL) and 0FH > 9 或 AF=1,则(AL)<--(AL)-6,AF=1
若(AL) and 0F0H > 90H 或 CF=1,则(AL)<--(AL)-60,CF=1
第4讲8086汇编程序设计
MOV BX,[SI十32H] ;常数32H作位移量
DB 12H
;定义一个字节数据
DW 1234H
;定义一个字数据
DD 12345678H ;定义一个双字数据
DB ′ 9BD′ ;定义三个字节的字符串数据,在 内存中就是39H、42H、44H
9
(2)表达式及运算符
表达式由常数、寄存器、标 号、变量与一些运算符组合 而成,分为数字表达式和地 址表达式。汇编过程中,汇 编程序按照一定的优先规则, 对表达式进行计算后得到一 个数值或地址,用作指令的 操作数。
汇编程序不区分大小写
3
汇编语言语句统一格式规定
指令性语句、伪指令语句和宏指令语句的统一格式:
[名字项] 操作项 [操作数项] [;注释项]
1.名字项:最多由21个字符组成。可由下列字符组成。
①字母A~Z、a~z
②数字0~9
③特殊符号?、· 、@ 、- 、$等
注意:
➢ 名字项的第一个字符不可以是数字,必须是字母或特殊字
•算术运算符 •移位运算符 •逻辑运算符 •关系运算符 •分析运算符 •综合运算符
10
➢算术运算符和移位运算符
•算术运算符: +(加)、-(减)、*(乘)、/(除)、MOD(求模) •移位运算符: SHL(左移)、SHR(右移) •可以用于数值表达式又可用于地址表达式。
11
【例】 算术和移位运算符进行数值表达式运算
15 RET
;返回DOS
16
START ENDP
;………………………………………………………………
② LOW和HIGH
格式为: LOW 表达式
或 HIGH 表达式
此运算符用于对一个16位数据或地址表达式,用HIGH取其高 位字节、LOW取其低位字节。所以此运算符又称为字节分离 运算符。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第5章 汇编语言程序设计 DECADD1 DL, BUFFER DECADD1 AREA1, AREA2 则汇编时进行宏展开,得到以下指令: DECADD1 DL, BUFFER + MOV AL, DL + ADD AL, BUFFER + DAA + MOV DL, AL DECADD1 AREA1, AREA2 + MOV AL, AREA1 + ADD AL, AREA2 + DAA + MOV AREA1, AL 宏扩展后,原来宏体中的指令前面都加上了符号“+”, 以示区别。
第5章 汇编语言程序设计
MASM宏汇编的提示信息及回答 提示信息 Source filename[.ASM]: (源文件名) 回 答
欲汇编的.ASM源文件名 (缺省:命令中的文件名)
Object filename[Source.OBJ]: 可重新定位目标文件名 (缺省:源文件名.OBJ) (目标文件名)
第5章 汇编语言程序设计
LINK程序的提示信息及回答
提示信息 回 答
Oject Modules[.OBJ] (目标模块) Run File [object.EXE] (运行文件) List File [NUL.MAP] (列表文件) Libraries [.LIB] (库文件)
目标代码模块表(各模块 之间用+号隔开) 连接后生成的执行文件名 (缺省:目标文件名) 列表文件名(缺省:无文 件名)
库文件名表(各文件之间 用+号隔开)
第5章 汇编语言程序设计
DATA SEGMENT … DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA START: MOV AX, DATA MOV DS, AX MOV ES, AX … MOV AH, 4CH INT 21H CODE ENDS END START
第5章 汇编语言程序设计
5.5.1 用编辑程序建立汇编语言源程序文件
建立一个汇编语言源程序,可以使用Windows系统 下的记事本程序来编写,也可以使用DOS操作系统下的 EDIT程序来编写。 例如从键盘输入二个数存入内存以DATA开始的二 个单元中,然后选出其中的大数输出。 设编辑后的汇编语言源程序名为:exp1.asm
第5章 汇编语言程序设计
5.5 汇编语言程序上机过程
要想在计算机上 运行汇编语言程序,必须首先 对源程序进行汇编和连接。下图表示了对汇编语言源 程序的编辑、汇编和连接的过程。
编辑程序 编辑 汇编程序 汇编 连接程序 连接
手写程序 EDIT
.ASM文件 MASM
.OBJ文件 LINK
.EXE文件ቤተ መጻሕፍቲ ባይዱ
汇编语言程序上机过程
宏定义由MASM宏汇编程序提供的伪指令实现, 其格式为
第5章 汇编语言程序设计
宏指令名
MACRO
[形式参数]
…
宏体
ENDM 宏调用的格式为 宏指令名 [实际参数] 这就是说,只要在源程序中写上已定义过的宏指 令名就算是调用该宏指令了。 具有宏调用的源程序被汇编时,每个宏调用将被 MASM进行宏展开。宏展开实际上是用宏定义式设计的 宏体去代替相应的宏指令,并用实际参数一一取代形参。
第5章 汇编语言程序设计
DATA SEGMENT … DATA ENDS CODE SEGMENT MAIN FROC FAR ASSUME CS:CODE, DS:DATA, ES:DATA START: PUSH DS XOR AX, AX PUSH AX MOV AX, DATA MOV DS, AX MOV ES, AX … RET MAIN ENDP CODE ENDS END START
第5章 汇编语言程序设计
宏指令与子程序的区别 在汇编语言程序设计中,宏指令和子程序都给设 计者提供了很大方便。他们都是可被程序多次调用的程 序段,并且调用前必须由设计者事先根据需要按一定格 式进行定义。然而,宏指令和子程序由于定义方法和几 个是不同,使用中会有许多不同之处,主要是空间和时 间的差异。 ⑴ 子程序由CALL指令调用,由RET指令返回, 所以汇编后子程序的机器码只占有一个程序段,不管调 用多少次均如此,较为节约内存。宏指令在每次宏调用 处宏展开时,宏体都要占一个程序段,调用次数愈多, 占用内存愈多。因此从内存空间开销来说,子程序优于 宏指令。
第5章 汇编语言程序设计
5.4 宏指令语句
1.宏指令、宏定义和宏调用 宏指令是源程序中具有独立功能的一段程序代 码。在汇编语言中,如果在源程序中需要多次使用同 一个程序段,可以将这个程序段定义(宏定义)为一
个宏指令,然后每次需要是,即可简单地用宏指令名
来代替(称为宏调用),从而避免了重复书写,使源
程序更加简洁、易读。
第5章 汇编语言程序设计
⑵ 从程序的执行时间来分析,每调用一次子程序 都要保护和恢复返回地址(断点)及寄存器内容(现场) 等,要消耗较多的时间。宏指令调用时不需要这个过程, 执行时间较短。因此,从执行时间来分析,宏指令又优 于子程序。 综上所述,当某一需多次访问的程序段较长,访 问次数又不是太多时,选用子程序结构较好。当某一需 多次访问的程序段较短,访问次数又很频繁时,选用宏 指令结构显然要更好些。
DAA
ENDM 显而易见,这是一个无形式参数的宏定义。
第5章 汇编语言程序设计
如果对分别存放在任意8位寄存器或存储单元中 的两个压缩型的BCD数进行加法运算,则可将上例宏 定义改写为 DECADD1 MACRO OPR1,OPR2 MOV AL,OPR1 ADD AL,OPR2 DAA MOV OPR1,AL ENDM 这是一个带有两个形式参数的宏定义。宏指令为 DECADD1。例如有以下宏调用:
第5章 汇编语言程序设计
5.5.2 用汇编程序将.ASM文件汇编成目标程序文件.OBJ
在对汇编语言源程序文件(简称ASM文件) 汇编时,汇编程序将对ASM文件进行二遍扫描。 若程序文件中有语法错误,则在结束汇编后将 指出源程序中的错误语句及错误类型。否则将 在汇编后生成目标程序文件(即OBJ文件) 完成汇编功能的是小汇编程序ASM或宏汇 编程序MASM。 汇编过程如下表所示:
Source listing[NUL.LST]: (源列表文件名)
列表文件名(缺省:无列 表文件)
Cross reference[NUL.CRF]: 交叉参考文件用的文件名 (缺省:无交叉参考文件) (交叉参考文件名)
第5章 汇编语言程序设计
5.2.3 用连接程序生成可执行程序文件(EXE 文件) 经汇编后产生的目标程序文件(OBJ文件)并不 是可执行程序文件,必须经连接后才能成为可执行文件 (EXE文件)。连接程序并不是专门为汇编语言程序设 计的,如果一个程序是由若干个模块组成的,也可以通 过连接程序把它们连接在一起。这些模块可以是汇编程 序产生的目标程序文件,也可以是高级语言编译程序产 生的目标程序文件。 完成连接功能的程序是LINK程序。连接过程如下 表所示:
第5章 汇编语言程序设计
由此可见,使用宏的过程共有三步:首先进行宏 定义;然后可以进行宏调用;最后,汇编时由MASM进 行宏展开。 [例] 若源程序中多处需要将AL和CL寄存器中的两 位压缩型的BCD数相加,并将和送回BL寄存器,则可 象下述这样定义宏指令,然后在需要的地方进行调用。
DECADD MACRO ADD AL,CL