汇编语言——宏

合集下载

51单片机(宏汇编)指令集5

51单片机(宏汇编)指令集5
常量有多种表示形式:二、十、十六进制数和 字符串等
常量及其表示
数据形式 格 式 取值范围 备注
2进制 ********B
0,1
0进制 ******
0, 1,2...9
****H 0,1...E,F
0CDE3H
符应是0--9
ASCII '**' ASCII 'AD' 使用
示例
10110011B 32768 16进制 最前面一个字
LAB+3: MOV A,30H LAB USB: MOV A,30H SUBB: MOV A,30H LAB: MOV A,MEN+3 R7: MOV A,30H MOV R7,A+3
SJMP $
常量及其表示
常量,就是在汇编时已经确定的值。 在汇编 语言中,常量主要用作指令性语句中的直接操 作数 ,也可用于存储器操作的组成部分(如位移 量,或者为伪指令中的变量输初值。 )
ASM51汇编语言格式
【label:】指令助记符 【操作数1】【 ,操作数2】【,操作数3】【注 释】
1. Label: 标号,冒号结尾,表示程序入口。 字母开头,通常少于8个字符。
2. 指令助记符:也可以是伪指令,后面如果有 操作数的话必须有“空格”或“TAB-键” 将其与操作数分开
ASM51汇编语言格式
意义:主程序从地址0000开始,实际又跳转到 0030H开始的主程序。INT0发生中断时,程序从 0003H开始执行,并跳转到INT0SAV程序执行。 T0发生溢出中断时,从000BH开始执行。

汇编语言宏指令

汇编语言宏指令
ABSOL MACRO OPER LOCAL NEXT CMP OPER , 0 JGE NEXT NEG OPER
NEXT: ENDM
宏调用 ABSOL VAR ABSOL BX
时,宏展开: … ;主程序中的代码段 … CMP VAR , 0 JGE ??0000 NEG VAR
??0000: CMP BX , 0 JGE ??0001 NEG BX
4. 两个特殊的宏运算符 (1)强迫替换运算符 & 在宏定义中,若参数在其它字符的紧前或紧后,或者参数出现 在带引号的字符串中时,就必须使用该运算符,以区分参数。 例:在下面宏指令JUMP中,参数CON作为操作码一部分。 JUMP MACRO CON , LAB
J&CON LAB ENDM 则调用时,JUMP NZ HEAR -> JNZ HEAR JUMP Z , THERE -> JZ THERE
MANDM MACRO OPR , X , Y MOV AX , X OPR AX , Y MOV X , AX
ENDM 该宏定义的意思是?????
改宏被调用和展开的时候,意义就明确了。如: MANDM MOV , [BX] , [SI] MANDM ADD , [BX] , ES:[1234H]
MOV AX , X
SUB AX , Y
ENDM
DIFSQR MACRO OPR1 , OPR2 , RESULT; ( X – Y)2 送 AX

大连理工大学22春“计算机科学与技术”《汇编语言程序设计》作业考核题库高频考点版(参考答案)试题号1

大连理工大学22春“计算机科学与技术”《汇编语言程序设计》作业考核题库高频考点版(参考答案)试题号1

大连理工大学22春“计算机科学与技术”《汇编语言程序设计》作业考核

题库高频考点版(参考答案)

一.综合考核(共50题)

1.

MACRO和ENDM一对伪操作中间就是宏定义体,是一组有独立功能的程序代码。()

A.正确

B.错误

参考答案:A

2.

设某数据段:(1)DATA SEGMENT (2)ORG 20H (3)NUM1=8 (4)NUM2=NUM1+10H (5)DA1 DB ‘COMPUTER’ (6)DB 0AH,0DH (7)COUNT EQU $-DA1 (8)DA2 DW ‘CO’,‘MP’,‘UT ’,‘ER’ (9)DATA ENDS 请回答:COUNT的值是()。

A.18H

B.0AH

C.09H

D.21H

参考答案:B

3.

假设(EAX)=00001000H,(EBX)=00002000H,(DS)=0010H,试问MOV ECX,[EAX+EBX]指令访问内存的物理地址是()。

A.00003100H

B.10003100H

C.00003200H

D.00005100H

参考答案:A

4.

以下五个指令(1)MOV AL,55H (2)MOV CL,2 (3)ROL AL,CL (4)OR AL,1 (5)RCL AL,CL顺序执行完后,(AL)=多少?()

A.54H

B.53H

参考答案:A

5.

当执行指令ADD AX,BX后,若AX的内容为2BA0H,设置的奇偶标志位PF=1,下面的叙述正确的是()。

A.表示结果中含2的个数为偶数

B.表示结果中含1的个数为奇数

C.表示该数为偶数

D.表示结果中低八位含1的个数为偶数

机器语言、汇编语言、高级语言的特点

机器语言、汇编语言、高级语言的特点

机器语言、汇编语言、高级语言的特点

随着计算机技术的发展,不同层次的编程语言应运而生。在一定程度上,它们代表了

人们对于编程语言的不同需求和对计算机在不同领域的应用的不同期望。从最底层的机器

语言,到中层的汇编语言,再到高层的高级语言,每一种编程语言在特点和使用场景上都

有着不同的优势和限制。本文将分别介绍机器语言、汇编语言和高级语言的特点。

一、机器语言

机器语言也被称为二进制代码或指令集,它是计算机指令的最低层次的表示形式。机

器语言使用二进制数码来表示指令的操作码和操作数,它们在计算机中被识别为电子开关(0或1)。机器语言是计算机硬件可以直接识别并执行的语言,它是计算机的内部语言,以二进制编码的形式编写,需要极高的技术水平,通常只有硬件设计师和系统程序员才能

编写。

机器语言的特点是最接近计算机底层,执行效率极高,能够直接访问计算机的硬件资源,也精细控制硬件的操作。它能够保证计算机的稳定性和可靠性,也可以根据硬件调整

程序的性能。但是,由于机器语言难以理解和编写,程序员需要掌握一些高度抽象的知识,所以编写程序的效率非常低,因此难以开发复杂的应用程序。此外,不同的计算机硬件使

用的机器语言有所不同,在程序移植和开发的过程中也会遇到一些困难。

二、汇编语言

汇编语言是机器语言的文本表示形式。与机器语言相比,汇编语言对程序员更加友好,使用人类可以理解的符号来代替机器代码的混乱二进制串。程序员可以使用一些助记符和

符号来表示指令和操作数,如MOV(数据传送指令)、ADD(加法指令)等等。每个助记符都被赋予了一个不同的二进制码,通过汇编器将汇编代码转换为机器码后,计算机硬件就

什么是宏

什么是宏

什么是宏

计算机科学里的宏是一种抽象,它根据一系列预定义的规则替换一定的文本模式。E xc e l 办公软件自动集成了“VBA”高级程序语言,用此语言编制出的程序就叫“宏”。使用“VBA”需要有一定的编程基础和耗费大量的时间,因此,绝大多数的使用者仅使用了E xcel的一般制表功能,很少使用到“VBA”。

解释器或编译器在遇到宏时会自动进行这一模式替换。对于编译语言,宏展开在编译时发生,进行宏展开的工具常被称为宏展开器。宏这一术语也常常被用于许多类似的环境中,它们是源自宏展开的概念,这包括键盘宏和宏语言。绝大多数情况下,使用“宏”这个词的使用暗示着将小命令或动作转化为一系列指令。

宏的用途在于自动化频繁使用的序列或者是获得一种更强大的抽

象能力--但这常常是一回事。

计算机语言如C或汇编语言有简单的宏系统,由编译器或汇编器的预处理器实现。C的宏预处理器的工作只是简单的文本搜索和替换,使用附加的文本处理语言如M4,C程序员可以获得更精巧的宏。

Lis p类语言如Commo n Lisp和Sc he me有更精巧的宏系统: 宏的行为如同是函数对自身程序文本的变形,并且可以应用全部语言来表达这种变形。一个C宏可以定义一段语法的替换,然而一个Lisp的宏却可以控制一节代码的计算。

获得了控制代码的执行顺序(见惰性计算和非限制函数)的能力,使得新创建的语法结构与语言内建的语法结构不可区分。例:一种Lisp 方言有c o nd而没有i f ,就可以使用宏由前者定义后者。Lisp 语法的去部主要扩展,比如面向对象的CLOS 系统,可以由宏来定义。宏的典型应用1、加速日常编辑和格式设置2、组合多个命令3、使对话框中的选项更易于访问4、使一系列复杂的任务自动执行

汇编语言程序设计实验指导及习题解答-第五章

汇编语言程序设计实验指导及习题解答-第五章
SUB1 PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX POP POP POP POP ENDP DX CX BX AX
SUB1
在子程序设计时,应仔细考虑哪些寄存器是必须保存的,哪些寄存器是不必要或不应 保存的。一般说来,子程序中用到的寄存器是应该保存的。但是,如果使用的寄存器在主 程序和子程序之间传送参数的话,则这种寄存器就不一定需要保存,特别是用来向主程序 传送结果的寄存器,就更不应该因保存和恢复寄存器而破坏了应该向主程序传送的信息。
.MODEL .STACK .DATA SMALL
96
BCDBUF BINBUF .CODE START: MOV MOV MOV
DB DB
65H ?
AX,@DATA DS,AX AL,BCDBUF
;将要传递的参数放在寄存器 AL 中 ;返回结果在 AL 中
CALL TRAN MOV BINBUF,AL MOV AX,4C00H INT 21H PROC NEAR PUSHF PUSH BX PUSH CX MOV AH,AL AND AH,OFH MOV AND BL,AH AL,0F0H
CODE1 MAIN SEGMENT PROC FAR CALL CALL MAIN CODE1 CODE2 SUB1 RET ENDP ENDS SEGMENT PROC FAR CALL SUB1 SUB2 RET ENDP PROC FAR RET ENDP ENDS END MAIN SUB2 FAR PTR SUB2 FAR PTR SUB1

第一讲_伪操作、宏指令与伪指令

第一讲_伪操作、宏指令与伪指令

伪操作
语法格式
作用
ASSERT ASSERT logical expression
对汇编程序的第二遍扫描中,如果其中ASSERT中条件 不成立,ASSERT伪操作将报告该错误信息。
INFO OPT
INFO numeric-expression, 在汇编处理过程的第一遍扫描或者第二遍扫描时INFO伪
string-expression
声明一个全局的算术变量,并将其初始化成0。
GBLL
GBLL Variable
声明一个全局的逻辑变量,并将其初始化成{FALSE}。
GBLS
GBLS Variable
声明一个全局的字符串变量,并将其初始化成空串“”。
LCLA
LCLA Variable
声明一个局部的算术变量,并将其初始化成0。
LCLL
LCLL Variable
IF logical expression … {ELSE …} ENDIF
WHILE 及 WEND
WHILE logical expression … WEND
能够根据条件把一段源代码包括在汇编 语言程序内或者将其排除在程序之外。
能够根据条件重复汇编相同的一段源代 码。
MACRO 、 MEND 及
宏指令是一段独立的程序代码,它通过伪操作 来定义。通过宏名来调用宏,并可以设置相应 的参数。宏定义本身不会产生代码,只是在调 用它时把宏体插入到源程序中。

汇编语言程序设计

汇编语言程序设计

表5-2 运算符的优先级别
优先级别
0

1
2
3
4
5
6
7

8
9
10
运算符 括号中的表达式 LENGTH , SIZE , WIDTH , MASK PTR , OFFSET , SEG , TYPE , THIS , 段前缀 (段寄存器名) HIGH , LOW * , / , MOD , SHL , SHR + 、EQ , NE , LT , LE , GT , GE NOT AND OR , XOR SHORT
精选课件
变量
●变量通常是存放在某些存储单元的数据,这些数据在程序运行期 间可以修改。变量使用数据定义伪指令DB、DW、DD等定义的。
经过定义的变量,每个变量均有三个属性:
1. 段属性(SEGMENT): ●表示变量存放在哪一个逻辑段中(即变量所在段的段地址)。
2. 偏移属性(OFFSET): ●表示变量的偏移地址,即在逻辑段中距段的起始点的字节数。
精选课件
; CONT =60 ; CONT =7 ; CONT =1 ; AL = 84H
逻辑运算符
●包括按位操作的与(AND)、或(OR)、异或(XOR)、和 非(NOT)四种运算符。它们只适用于对常数进行逻辑运算。
注意: ● AND、OR、XOR和NOT也是指令助记符。

华中科技大学8086汇编讲义第三章宏汇编语言

华中科技大学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)。

汇编语言——宏

汇编语言——宏

可以看到,两次调用宏sum,展开后的结果中标号分别 是??0000和??0001,是不同的。如果宏定义中没有LOCAL伪 操作,展开结果中将在两个地方定义标号next,是重复定义。 汇编语言还规定,LOCAL伪操作必须出现在宏体的第1 行上,在“宏名 MACRO”与LOCAL伪操作之间不允许有任 何内容,包括空行、注释。
因此,对这一类错误提示,程序员只能自己按规则进行宏展 开,并判断展开后的结果是如何出的错。对于MASM汇编程 序比较熟悉的人,还可以借助于MASM处理源程序时产生的 一个.LST文件(只要在MASM提问“Source listing[NUL.LST]” 时输入一个合适的文件名即可产生清单文件),判断程序中 的错误,以及查看宏展开的结果。 另外,宏调用的优先级高于其它伪指令和指令,所以如 果用伪指令或指令助记符等内部保留字作为宏的名字,则汇 编程序会把这样的标识符当作宏进行处理,而使得源程序中 无法使用其原有的功能。汇编语言中还提供了一个PURGE伪 指令,用于在源程序适当的位置取消某个宏。比如:
add MACRO x,y ENDM ADD AX,BX
M
PURGE add ADD AX,BX
这样的源程序中,前一个ADD被当作宏调用处理(汇编 语言是不分大小写的),进行宏展开;后一个ADD由于已用 PURGE伪指令取消了作为宏的add宏调用,使得该标识符恢 复原功能,因此是ADD指令。

汇编语言——宏

汇编语言——宏

【例7.16】设有如下宏定义: sum MACRO a,b LOCAL next MOV CX,a LEA BX,b XOR AX,AX next:ADD AX,[BX] ADD ENDM 并已知buf1和buf2是已定义的两个变量,展开下面的宏调用: sum 5,buf1 sum 7,buf2 BX,2 LOOP next
code
ENDS END main
【解】宏展开后的结果是: + + + + + + MOV MOV INT MOV MOV INT MOV INT AH,2 DL, '*' 21H AH,2 DL, '*' 21H AH,4CH 21H
由于宏展开是汇编程序翻译的一个步骤,宏展后的结果 并不是源程序,所以展开后不再写出完整的程序格式,只列 出有效指令部分。 可以看到,汇编程序对宏调用与已定义的常量及符号的 引用的处理是很类似的,定义部分在汇编处理结束后就已完 成它的作用。汇编程序翻译后得到的机器代码中没有宏、常 量等的定义,只是调用或引用部分被代换成宏体或定义的内 容。宏与常量定义及符号定义的差别在于,常量及符号定义 都必须在一行写完,对常量和符号的引用只能代换指令中的 操作数,或者操作数的一部分,宏调用则可以代换一段程序。 不仅如此,宏还允许代换的内容有个别地方不同,这是通过 带参数的宏实现的。
【解】宏展开结果是: + + + + + + + + + + MOV CX,5 LEA BX,buf1 XOR AX,AX ADD BX,2

9.1.1 宏定义、宏调用和宏展开_汇编语言程序设计(第2版)_[共3页]

9.1.1 宏定义、宏调用和宏展开_汇编语言程序设计(第2版)_[共3页]

第9章

宏汇编及其他高级伪操作

早期的汇编语言(ASM)还只是具备一些基本功能,程序员对描述任务、编程设计仍感不便,

于是进一步产生了更加灵活的宏汇编语言(MASM)。宏汇编语言提供了类似于高级语言的某些

复杂功能,如宏汇编、重复汇编与条件汇编。

9.1 宏汇编

汇编语言中的宏与子程序类似,可以作为一个独立的功能程序供其他程序多次调用。子程

序的设计方法可以实现程序复用,节省存储空间,优化程序结构。但宏和子程序的调用方式不

同。调用子程序的不便之处是参数的传递,传参时要占用寄存器或者存储器,特别是参数比较

多时,增加了程序的复杂性。另外,调用子程序还需要为保存断点实现转移及返回到调用程序

增加消耗的时间。而宏汇编语言提供的宏功能既可以实现程序复用,又能方便地传递多个参数。

若程序中重复部分只是一组较简单的语句序列,且要传送的参数又比较多时,更适合使用宏汇

编功能。

9.1.1 宏定义、宏调用和宏展开

宏是源程序中一段有独立功能的程序代码。宏的使用需要三个步骤:宏定义、宏调用和宏展

开,因此程序设计中使用宏功能的步骤是:首先进行宏定义(类似写一个子程序),然后在需要时

进行宏调用(类似调用子程序),最后在汇编阶段对宏指令进行展开。

1.宏定义

宏定义用一对伪指令MACRO和ENDM来定义。格式为:

宏指令名 MACRO [形参1, 形参2, …]

<宏定义体>

ENDM

宏指令名给出宏定义的名称,第一个符号必须是字符。

宏定义体由一系列指令语句和伪指令语句组成,也可以是其他非语句形式。

宏定义的指令名可用伪指令PURGE来取消,然后重新定义。

(第4章 汇编语言程序设计) 17 18

(第4章 汇编语言程序设计) 17 18

(3)例如
• AREA constdata,DATA,READONLY • INCBIN data1.dat ;源文件包含文件data1.dat • INCBIN E:\DATA\data2.bin
;源文件包含文件E:\DATA\data2.bin
• … • END
§4.1 汇编语言-其他伪指令 13、RN (1)、格式
CODE32 header ADR r0, start +1 ; BX r0 ;BX 位0=1 填写状态寄存器T(5)位 ;T=1 Thumb ;T=0 ARM CODE16 start MOV r0, #10 MOV r1, #3 BL doadd
§4.1 汇编语言-其他伪指令
stop MOV r0, #0x18 LDR r1, =0x20026 SWI 0xAB doadd ADD MOV END
§4.1 汇编语言-其他伪指令 11、GET/INCLUDE (1)、格式(变量) GET 文件名
说明: GET为定义符
(2)功能
GET :引用一个源文件,编译时,在引用位置展开 INCLUDE与GET同
§4.1 汇编语言-其他伪指令
(3)例如
• AREA mycode,DATA,READONLY • GET E:\code\prog1.s ;通知编译器在 当前源文件包含源文件E:\code\ prog1.s • GET prog2.s ;通知编译器当 前源文件包含可搜索目录下的prog2.s • … • END

6 汇编语言高级编程

6 汇编语言高级编程
PURGE MSTRING,ABS
20
6.1.6 条件汇编
汇编的编译程序在对汇编源程序代码进行编译时,能够 根据条件把一段源程序包括在汇编源程序内或把它排除在 外,这就是条件伪操作,即条件汇编。
条件汇编伪指令的格式为: IF <条件> <语句块1>
[ELSE <语句块2>] ENDIF
说明:IF和ENDIF必须成对出现,ELSE为可选项。汇编 程序检测IF伪指令给定的条件,如果条件为真则汇编语句 块1,否则汇编语句块2。条件汇编伪指令可出现在源程序 的任意位置上,但主要用于宏指令中,并允许任意次嵌套。
ENDM
当有宏调用:
ABS CX
MOV BX,AX
ABS DX
经宏展开后的指令为:
+
CMP CX,O
+
JGE ??0000
+
NEG CX
+??0000:MOV AX,CX
MOV BX,AX
+
CMP DX,O
+
JGE ??0001
+
NEG DX
+??0001: MOV AX,DX
19
6.1.5 取消宏定义伪指令PURGE
例题6.6 DATA1
某宏定义如下: MACRO A,B,C,D DW A,B,C DB D DUP(0) ENDM

汇编语言复习题带答案

汇编语言复习题带答案

汇编语言复习题带答案

汇编语言期末复习题

第1章:基础知识

1、在汇编语言程序的开发过程中使用宏功能的顺序是(C)。DX

A、宏定义,宏调用

B、宏定义,宏展开

C、宏定义,宏调用,宏展开

D、宏定义,宏展开,宏调用

2、汇编语言源程序中,每个语句由四项组成,如语句要完成一定功能,那么该语句中不可省略的项是(B)。DX

A、名字项

B、操作项

C、操作数项

D、注释项

3、可屏蔽中断就是它的请求是否被CPU响应要受(IF)的控制。DX

4、使用LINK连接命令,执行后可生成文件的扩展名为(EXE)。DX

5、在寄存器间接寻址中,如果指令中指定的寄存器为BP,则操作数在堆栈段中,段地址在SS寄存器中。TK

6、注释项用于说明程序段或是一条和几条指令的功能,一般用;(或分号)表示注释的开始。TK

7、DOS系统功能调用方式为:(1)置入口参数;(2)中断程序编号送AH寄存器后执行INT 21H。TK

8、通常主程序和子程序间参数传送的方法有三种:用寄存器传递、用存储单元传递、用堆栈传递(顺序可调换)。TK

9、中断是CPU暂停当前程序的执行,转而执行处理紧急事务的程序,并在该事务处理完后能自动恢复执行原先程序的过程。在此,称引起紧急事务的事件为中断源。TK

10、在字符串操作指令中,DS∶SI指向源串,ES∶DI指向目的串。TK

11、计算机系统通过接口与外围设备通信。TK

12、键盘I/O、显示I/O和打印I/O分别对应16H、10H和17H

号中断。TK

13、字符显示模式缓冲区中的一个字对应于屏幕上的一个字符。每个字的第一个字节为显示字符的ASCII码,第二个字节为显示字符的属性。TK

汇编语言入门教程PPT-第七章宏定义

汇编语言入门教程PPT-第七章宏定义

mov ds,ax
ENDM
MACRO message
mov dx,offset message
mov ah,09h
int 21h
ENDM
例题
mainend
MACRO retnum
;;返回DOS,可不带参数
ifb <retnum>
mov ah,4ch
;;没有参数
else
mov ax,4c00h+(retnum AND 0ffh)
mainbegin @data
;建立DS内容
dispmsg msg1
;显示msg1字符串
dispmsg msg2
;显示msg2字符串
mainend
;返回DOS
end start
汇编系统中有些以圆点起始的 伪指令(如.startup、.exit等) 实际上是一种宏结构
例题
dstring mainbegin dispmsg
MACRO string
ຫໍສະໝຸດ Baidu
;;定义字符串
db '&string&',0dh,0ah,'$'
ENDM
MACRO dsseg
;;设置数据段地址
mov ax,dsseg
第七章第一高章级汇基编础语知言识技术
第七章第一高章级汇基编础语知言识技术
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

是有限制的,所以源程序中在不同位置调用这样的宏,那些
离标号定义处较近的可以不超过范围因而没有语法错误,但 那些离标号定义处远的就不保证了。
【格式】LOCAL 标号1, 标号2, … 【功能】用于告诉汇编程序,在宏展开时,对宏体中出
现的“标号1”、“标号2”等标号定义,代换为特殊的各不相
同的标号。汇编程序在遇到用LOCAL说明的标号时,会代 以??0000、??0001、?0002、……等特殊的标识符,以保证宏
宏展开的结果是: + var1 DB 'HELLO, John'
+ var2
DB
'HELLO, Henrry'
*7.3.4 宏操作中形参与实参的对应关系
由于宏是伪操作,形参与实参的对应方法是由汇编程序 决定的,与高级语言中形参与实参的对应方式有很大的不同。
汇编语言规定:
(1)形参表中的多个参数项之间必须用逗号分隔,但实 参表的各个参数项可以用逗号也可以用空格分隔。 (2)如果形参的数目与实参的数目相等,则按照形参表 与实参表中各参数项的次序一一对应。
7.3.2 宏调用 定义后的宏名又称为宏指令。经宏定义后,就可以在 源程序中调用宏了。宏调用的方式是在源程序中需要复制
宏体的地方写宏的名字。宏名单独占一行,当源程序被汇
编时,汇编程序将对宏调用进行宏体复制,并取代宏名, 这种复制操作称为宏展开。为了与源程序的其它部分相区
别,后面的叙述中,对由宏调用而展开后得到的指令,都
(3)如果形参数目少于实参数目,多余的实参被忽略,
汇编程序不做任何提示。
(4)如果形参数目多于实参数目,不足的实参作空串处 理,汇编程序也不做提示。 (5)如果实参中包含逗号、空格等分隔符作有效符号, 必须用尖括号“< >”括起来,避免混淆。
【例7.15】设有宏定义如下:
data MACRO p,q v&p DB q
(3)宏定义仅仅用来告诉汇编程序,将来宏调用时复制
的对象是什么,宏定义中的程序段并不是程序的一部分,也 就是说,如果程序中定义了一个宏而没有调用它,汇编程序 将忽略宏定义。 (4)宏定义可以写在程序的任何地方,但习惯上总是把
宏定义写在程序的最前面。
宏定义与编辑器中的文字块的定义有相似之处,也有一 些差别。两者都需要以特定的方式说明开始和结束的位置。 文字块是文件的一部分,而宏体中的程序段必须经过宏调用 才能复制到源程序中正确的位置,没有被调用的宏体在汇编 程序翻译时会被忽略。
ENDM
以及下面的宏调用: x x data + v1 = = %x,%x DB 1 1 x+1 data %x,%x
其宏展开结果是:
+ v2
DB
2
符号“%”的作用体现在宏展开中是用常量标识符x的值
(第1次宏调用时是1,第2次宏调用时是2),而不是符号x本 身,去替换宏展开时的形参。 需要注意的是,宏操作与源程序的其它部分一样,都要 经过汇编程序的处理。汇编程序在处理带有宏调用的程序时,
是先进行宏展开,再进行语法检查及翻译。宏体在定义时,
由于可以带有一些形式参数,在没有进行代换之前很可能是 不符合语法规则的,但宏调用并展开后是否符合语法规则,
需要由汇编程序来判定。如果展开后的指令或伪指令有错,
汇编程序只能指出宏调用有错,并指出宏调用所在行的号码, 却无法指出究竟是展开后的哪一行不符合语法。
7.3.5 宏体中的标号
宏体中出现标号分为两种情况:一是在带有跳转功能的
指令中,标号作为跳转的目的地,也就是对标号的引用;另
一种是宏体中某条指令的前面出现标号,即标号定义。如果 宏体中引用标号,由于汇编语言允许从程序的不同地方用跳
转指令跳转到同一位置,所以即使源程序中对这样的宏多次
调用,展开后的结果并不违反语法规则。但是需要注意,如 果标号的引用出现在条件跳转指令中,由于条件跳转的距离
在前面标以加号“+”以示区别。
【例7.10】参照汇编程序的处理方法,对下面程序中的宏进
行展开。 back = 4CH 21H
dosint EQU dispch MACRO MOV MOV INT ENDM
AH,2 DL, '* ' 21H
code
Βιβλιοθήκη Baidu
SEGMENT ASSUME CS:code
main:
由于宏展开是汇编程序翻译的一个步骤,宏展后的结果
并不是源程序,所以展开后不再写出完整的程序格式,只列 出有效指令部分。
可以看到,汇编程序对宏调用与已定义的常量及符号的
引用的处理是很类似的,定义部分在汇编处理结束后就已完 成它的作用。汇编程序翻译后得到的机器代码中没有宏、常 量等的定义,只是调用或引用部分被代换成宏体或定义的内 容。宏与常量定义及符号定义的差别在于,常量及符号定义
cc
JG,n1
JBE,n2
cc
JNZ,n3
【例7.13】宏的形式参数可以作为一个标识符的一部分。这 时,必须用符号“&”把形式参数与标识符的其余部分分开。 例7.12中的宏定义还可以写成下面的形式: cc1 MACRO CMP J&cmd ENDM cmd,lab AX,BX lab
宏体中第2行的J&cmd就是在一个标识符中(例7.13中表
dispch dispch MOV INT AH,back dosint
code
ENDS
END main
【解】宏展开后的结果是: + + + + + + MOV MOV INT MOV MOV INT MOV INT AH,2 DL, '*' 21H AH,2 DL, '*' 21H AH,4CH 21H
【解】宏展开结果是:
+ + MOV CX,5 LEA BX,buf1


XOR AX,AX
ADD BX,2
+ ??0000:ADD AX,[BX]

+ +
LOOP ??0000
MOV CX,7 LEA BX,buf2

+ +
XOR AX,AX
ADD BX,2
+ ??0001:ADD AX,[BX] LOOP ??0001
7.3 宏
程序中使用宏分为定义和调用两个部分。宏定义用来说
明哪些指令或伪指令是将在程序中重复出现的程序段;宏调
用是用来告诉汇编程序,在翻译前先把宏定义中的程序段复 制一遍。可见,宏定义和宏调用都是告诉汇编程序如何处理,
属于伪操作。
7.3.1 宏定义
【格式】 宏名 MACRO
宏体 ENDM 【说明】 (1)“宏名”是一个标识符,一个程序中可以定义多个 宏,对每一个宏必须以不同的标识符命名,且宏名不能与变 量、标号、段名等标识符同名。 (2)汇编语言规定,宏定义的起始标记MACRO前面必须 写宏的名字,而结束标记ENDM的前面却不允许写任何内容, 写在起止标记之间的部分称为宏体,宏体部分通常是一段程 序中需要重复使用的指令序列。
【例7.11】普通用法,形式参数出现在操作数的位置。
dch MACRO MOV AH,2 x
MOV
INT ENDM
DL,x
21H
源程序中调用宏dch时,应该在宏名字的后面跟一个实际 参数,从例7.11的宏体可以看出,这个实际参数应该是用于屏 幕显示的一个ASCII字符。因而,源程序中用下面的写法连续 两次调用上述宏,就可以实现回车换行操作。宏展开时,对每 一次宏调用,将分别以相应的实际参数代换宏体中的形式参数。
7.3.7 宏与子程序的比较
(1)处理的时间不同。宏调用是在源程序被汇编时由汇
编程序处理的;而子程序调用是在程序执行期间由 CPU直接
执行的。 (2)处理的方式不同。宏必须先定义后调用,宏调用是 用宏体替换宏调用伪指令,实参代替形参,源程序被翻译成 目标代码后宏定义随之消失;而子程序的调用没有这样的替 换操作,是以CALL指令将控制权由调用者转给子程序
因此,对这一类错误提示,程序员只能自己按规则进行宏展 开,并判断展开后的结果是如何出的错。对于MASM汇编程 序比较熟悉的人,还可以借助于MASM处理源程序时产生的 一个.LST文件(只要在MASM提问“Source listing[NUL.LST]” 时输入一个合适的文件名即可产生清单文件),判断程序中 的错误,以及查看宏展开的结果。 另外,宏调用的优先级高于其它伪指令和指令,所以如 果用伪指令或指令助记符等内部保留字作为宏的名字,则汇
dch 13
dch 10
【例7.12】形式参数可以出现在助记符的位置。 cc MACRO CMP cmd ENDM cmd,lab AX,BX lab
上述宏在调用时可以用不同的实际参数代换形式参数 cmd,使得宏体中的第2行是不同的指令。比如下面是几个调 用的例子,请读者自己写出宏展开的结果。 cc
编程序会把这样的标识符当作宏进行处理,而使得源程序中
无法使用其原有的功能。汇编语言中还提供了一个PURGE伪 指令,用于在源程序适当的位置取消某个宏。比如:
add MACRO x,y
ENDM ADD AX,BX

PURGE add ADD AX,BX
这样的源程序中,前一个ADD被当作宏调用处理(汇编 语言是不分大小写的),进行宏展开;后一个ADD由于已用 PURGE伪指令取消了作为宏的add宏调用,使得该标识符恢 复原功能,因此是ADD指令。
体中的标号定义在每次宏展开时各不相同,避免重复定义的
情况。
【例7.16】设有如下宏定义:
sum MACRO a,b LOCAL next
MOV CX,a
LEA BX,b XOR AX,AX
next:ADD AX,[BX]
ADD BX,2 LOOP next
ENDM
并已知 buf1 和 buf2 是已定义的两个变量,展开下面的宏调用: sum 5,buf1 sum 7,buf2
现为指令助记符)含有形式参数,符号“&”用于把形参cmd 从标识符中分离出来。如果没有分隔符号“&”,汇编程序将 把Jcmd作为一个整体处理,而不知道其中的cmd是形参。 对例7.12后面的3个调用,调用例7.13中的宏可以达到同
样的效果,相应写法是:
cc1 cc1 cc1 G,n1 BE,n2 NZ,n3
何内容,包括空行、注释。
*7.3.6 宏的嵌套 类似于在子程序中可以调用另一个子程序,在一个宏体 中也允许再调用另一个已定义的宏。对这种宏中套宏的宏调
用,汇编程序将逐次展开,直到展开后的结果不再含有宏调
用为止。 【例7.17】设某程序中已定义了3个字型变量v1、v2、v3, 下面是源程序中的一段,试展开最后一行的宏调用。 mm1 MACRO x
MOV AX,x
MUL AX
ENDM
mm2 MACRO a,b,c mm1 a
MOV BX,AX
mm1 b
ADD AX,BX MOV c,AX ENDM

mm2 v1,v2,v3
【解】展开mm2后得到: + mm1 v1 + MOV BX,AX + mm1 v2 + ADD AX,BX + MOV v3,AX 其中还含有宏调用,再把两个mm1展开后可得到如下结果: + MOV AX,v1 + MUL AX + MOV BX,AX + MOV AX,v2 + MUL AX + ADD AX,BX + MOV v3,AX
都必须在一行写完,对常量和符号的引用只能代换指令中的
操作数,或者操作数的一部分,宏调用则可以代换一段程序。 不仅如此,宏还允许代换的内容有个别地方不同,这是通过
带参数的宏实现的。
7.3.3 带参数的宏
如果宏只能对完全相同的程序段进行复制,那就没有多 大的应用价值了,宏的好处主要体现在每次调用而展开的宏 体可以不同。这需要在宏定义时以形式参数指明宏体中的哪 些部分可以被不同的实际参数代替,每次调用时在宏名字的 后面附带实际参数。完整的宏定义格式是: 宏名 MACRO [形式参数表] 宏体 ENDM 形式参数可以出现在宏体中的任何位置,可以在操作数 中,可以在指令助记符的位置,甚至还可以是其中的一部分。 下面的几个例子用来说明参数的各种不同用法。
【例7.14】形式参数还可以出现在变量定义伪操作的初值表 中,甚至是以字符串形式出现的初值。
msg MACRO num,pname
var&num DB
ENDM
'HELLO, &pname'
汇编语言规定,字符串中的形参必须用分隔符“&”从其它 部分分离出来。对于下面两个宏调用, msg msg 1,John 2,Henrry
可以看到,两次调用宏 sum ,展开后的结果中标号分别 是??0000和??0001,是不同的。如果宏定义中没有LOCAL伪 操作,展开结果中将在两个地方定义标号 next,是重复定义。 汇编语言还规定,LOCAL伪操作必须出现在宏体的第1 行上,在“宏名 MACRO”与LOCAL伪操作之间不允许有任
相关文档
最新文档