宏汇编汇编语言PPT学习教案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
宏汇编汇编语言
会计学
1
一、宏汇编
内容 宏定义 宏调用 宏展开
第1页/共33页
1、宏定义
宏名
macro [形参表]

;宏指令体(宏体)
endm
(1)宏名(宏指令名) :给出该宏定义的名称(第一个符号必 须是字母) 。
(2)macro/ endm 系统提供的定义宏的伪指令。 (3)形参表 :给出宏定义中所用到的形式参数,参数可以没 有,或带有一个或是多个,当是多个参数时,每个形参之间需用 逗号隔开。具体参数可以是常数、变量、指令或它们的一部分, 也可以是表达式。 (4)宏指令体 :一组有独立功能的汇编程序代码。其中可以 包括指令、伪指令及宏指令等。
第2页/共33页
1、宏定义(续)
举例:
fillseg Dsegname
用参数
macro Dsegname
;带有形参
mov ax, Dsegname
;宏定义中使
mov ds,ax endm
;宏定义结束
思考: 此处的形参Dsegname是什么?
Dsegnam用
第26页共33页伪指令含义exp若数值表达式exp的值不为0则语句组1包含在目标文件ifeexp若数值表达式exp的值为0则语句组1包含在目标文件中ifdeflabel若标号label有定义或被说明为extrn则语句组1包含在目标文件中ifndeflabel若标号label没有定义也没被说明为extrn则语句组1包含在目标文件中ifb参数在宏引用时若该形参没有相应的实参相对应则语句组1包含在目标文件中ifnb参数在宏引用时若该形参没有相应的实参相对应则语句组1包含在目标文件中ifidn参数1参数2若参数1参数2则语句组1包含在目标文件中ifdif参数1参数2若参数1参数2则语句组1包含在目标文件中if1若汇编程序在第一遍扫描时则语句组1包含在目标文件if2若汇编程序在第二遍扫描时则语句组1包含在目标文件if和和ifeife格式
第7页/共33页
思考:
宏——具有宏名的一段汇编 语句序列
——宏定义时书写 宏指令——这段汇编语句序 列的缩写
——宏调用时书写 宏展开——宏指令处用这段 宏代替的过程
—第8页—/共3宏3页 汇编时实现
在什么情况下使用宏?为什么要使用宏?
在汇编语言程序设计过程 中,可以将具有一定功能, 需多次重复使用,且比较短 的程序段定义成一条宏指令。
重复汇编伪指令有3条(REPT、IRP、IRPC),3条伪指令区 别在于如何规定重复次数。
第17页/共33页
1、按参数值重复
伪指令- REPT 格式:
重复次数确定
REPT 数值表达式 ;重复次数
重复的语句组
ENDM
例1:定义100个初值为32的字节单元,该存储单元的起始 符号地址为Table。
方法1:用伪指令REPT来实现 Table LABEL byte
【例2】 将A~Z这26个字母数据填入数组CHAR中。
CHAR
LABEL BYTE
CHR='A'
汇编后产生:
REPT 26
DB CHR
1
DB
41H
CHR=CHR+1
ENDM
1
DB
42H
1
DB
5AH
2

第19页/共33页
例3:计算1+2+ … +100,并把其值存入寄存器AX。
方法1:用伪指令REPT来实现 … xor AX, ax COUNT = 1 REPT 100 ADc AX, COUNT COUNT = COUNT+1 ENDM …
code segment assume ds:data,cs:code
start: mov ax,data mov ds,ax mov ah,4ch int 21h
code ends end start
第14页/共33页
表 达 符 操 作 %示例
第15页/共33页
演 示 P152 例 5 - 2 0
(2)取代后,所得到的语句应该是有效的,否则汇编程序将会 指示出错。
(3)每调用一次就把宏定义体展开一次,因而它占有的存储空间 与调用次数有关。
第4页/共33页
3、宏展开
宏调用的实质是在汇编过程中进行宏展开 宏展开的具体过程是:当汇编程序扫描源程序遇到已有定 义的宏调用时,即用相应的宏定义体取代源程序的宏指令,同 时用位置匹配的实参对形参进行取代。
表达符操作&示
例。
DA MACRO
SS
DB
‘Exam:&ss’,0ah,0
dh,’$’
ENDM
如果宏调用为:
则相应D的A宏b展oo开k 为:
1 DB ‘Exam:book’,0ah,0dh,’$’
第16页/共33页
二、重复汇编
在编写源程序时,有时会出现连续相同或相似的语句(组)。 当出现这种情况时,可利用重复汇编伪指令来重复语句(组) ,从而达到简化程序的目的。 重复汇编伪指令所定义的重复块是宏的一种特殊形式: (1)由伪指令ENDM来结束重复块; (2)重复块可带有参数,并在汇编过程中参数被实参代替, 重复块不会被命名,不能在程序的其它地方引用; (3)重复汇编伪指令与宏指令的不同之处在于不必预先进行 定义,常在宏体内使用,但也可以在宏体外使用; (4)重复汇编没有名字,不能被调用。

方法1与方法2的比较,不难
操作演示
看出:伪指令REPT与循环指
令起作用的时期和方式是截然
不同的。它们之间的主要差异
如下表所列
第21页/共33页
伪指令REPT与循环指令LOOP之间的主要差异
伪指令REPT 循环指令LOOP
起作用的时期
起作用的方式
重复次数对目标文 件的影响
汇编程序把源文件 翻译成目标文件时 期
宏与子程序具有各自的特点,程序员应该根据具体问题选 择使用那种方法
通常,当程序段较短或要求较快执行时,应选用宏;当程序 段较长或为减小目标代码时,要选用子程序
第11页/共33页
4、宏调用中的参数(宏运算)
宏的参数形式灵活多变,可以是常数、变量、存储单元、指 令操作码或它们的一部分,也可以是表达式,使用灵活多变 的参数,同一个宏定义甚至可以执行不同的操作。
DA X+2, 5,
X+Y, Y-5
表 达 符 操 作 %示例
dat1 macro a,b,c,d dw a,b,c db d dup(0) endm
data segment x=10 y=20 dat1 %x+2, 5,%x+y, %y-5 dat1 x+2, 5, x+y, y-5 data ends
code segment assume ds:data,cs:code
start: mov ax,data mov ds,ax
disp macro m lea dx,m mov ah,9 int 21h endm disp buf1 disp buf2 mov ah,4ch int 21h
code ends end start
条件汇编伪指令的一般格式是:
IF×× 表达式或参数
语句1 ;成立时汇编这一段语句
[ELSE
语句2 ]
条件语句块)
;条件不成立时汇编这一段语句(称为反
ENDIF
;条件汇编结束命令
第25页/共33页
其中,条件伪指令IF中的”××”可以是1、2、
E、DEF、NDEF、B、NB、IDN和DIF等,用来规定
宏名 [实参表] ;调用时,只需使用宏指令名来调用该宏定
义 例如:对上面的宏定义的调用形式为:

FILLSEG DATA
; DATA为数据段的段名

说明:(1)汇编时,汇编程序对每个宏调用作宏展开 ––– 用
宏定义体取代源程序中的宏指令名,用实参代替宏定义中的形参。 取代时,实参和形参是一一对应的。 若实参个数>形参个数,则 多余实参不考虑 , 若实参个数 <形参个数,则多余形参作“空” 处理。
IRP REG, <BX, CX, DX, SP, BP, SI, DI> ADD AX, REG ENDM
第24页/共33页
三、条 件 汇 编
条件汇编允许用户在编制汇编语言程序时根据某些
条件是否成立(为真)来决定是否汇编某一段语句。条件
汇编指令提供有10个,分为互补的5对,分别用来测试表
达式扫描遍数、符号定义、参数和两个字符串是否相同等。
使用宏指令语句可以减少 程序书写错误,缩短源程序 长度,使源第程9页/序共33页编写像高级 语言一样清晰、简洁。特别


较 子程序
➢ 仅是源程序 级的简化:宏 调用在汇编时 进行程序语句
➢ 还是目标程序级的简 化:子程序调用在执 行时由CALL指令转向 、RET指令返回;形 成的目标代码较短, 执行速度减慢
几个宏操作符的使用
%:表达式操作符:将其后面跟的表达式的值作为 实参,而不是将表达式本身作为参数,用在实参中 。 &:替换操作符:用于将参数与其他字符分开。用 在宏体中。如果参数紧跟在其他字符之前或之后, 或者参数出现在带引号的字符串中,就必须使用该 伪操作符。
第12页/共33页
表达符操
作%示例。
2 、 伪 指 令 IRP
重 复 次 数 不 确定
格式:
IRP 形参,< 实参[ ,…] > ;重复的语句
ENDM
其中,① 实参数必须写在尖括号内,可以有
多个,参数之间用逗号分隔开。② 重复时,第一次
重复将用第一个实参数替换语句块中的形参所在位置,
第二次重复用第二个实参数,依此类推。如果没有实
参数,那么这个块只处理一次,并且被一个空参数所
DA
MACRO
则相应的宏展开为:
A, B, C, D DW A,
1 DW 12, 5, 30
B, C
1 DB 15 DUP(0)
DB D
DUP(0)
1 DW X+2, 5, X+Y
ENDM
1 DB Y-5 DUP (0
如果宏调

用为:
X=10
Y=20
DA %X+2,
5,%X+Y第, 13页/共33页 %Y-5
替换。
第23页/共33页
扩展后为
【例4】 产生将AX、BX、CX和DX压 T入A堆BE栈L的指令LA。BEL
TABEL
LABEL NEAR
NEAR
IRP REG, < AX,BX,1CX ,DPXU>SH AX
PUSH REG ENDM
1 1
PUSH BX PUSH CX
1 PUSH DX
例5: 把8个16位通用寄存器之值相加,并把结果存入寄存器 AX中。 解答:由于16位通用寄存器名是一些不同的符号,不能用计数 的方法来依次访问它们,所以,我们需要用伪指令IRP来实现 。
db 200 dup(0)
stack ends
例5-17 P148
code segment assume
ds:data,cs:code,ss:stack start: mov ax,data
mov ds,ax mov cl,2 mov bx,0 multiply cl,a,b[bx] ; 宏调用 mov dx,b[bx] add dl,30h mov ah,2 int 21h mov ah,4ch int 21h code ends end start
的展开,不需
要返回;不减 ➢ 需要利用寄存器、存
小目标程序,
储单元或堆栈等传递
执行速度没有
参数
第10页/共33页
改变



结 子程序
论 相同点:简化源程序的设计和结构
不同点:
※ 对目标程序的长度影响不同。
※ 对目标程序执行速度的影响不同。
※ 传递参数的方式不同;传递参数过程中如出现错误,错 误的性质不同。(宏:语法;子程序:逻辑)
汇编结果与下面程序段相一致:
xor AX, 0 ADc AX, 1 ADc AX, 2
… ADc AX, 100

比较:右边语句的执行能完成所指定的功能,但是用100条 加法指令来直接计算,这无疑会大大增加目标代码的长度。
第20页/共33页
方法2:用循环指令LOOP来实现 …
xor ax,ax mov cx, 100 again: adc ax, cx loop again
把被重复的指令 (组)直接重复写入 目标文件
由于重复次数决定 着被重复指令(组) 写入目标文件的次 数,所以,改变重 复次数一定会改变 目标文件的字节数
程序的执行时期
通过反复执行同一 指令(组)来实现重 复 由于重复的指令数 与重复次数无关, 所以,改变重复次 数不会改变目标文 件的字节数
第22页/共33页
第6页/共33页
宏汇编应用举例
multiply macro opr1,opr2,result
; 定义宏
push dx
push ax
mov al,opr1
imul opr2
mov result,ax
pop ax
pop dx
endm
data segment
a db 3
b dw ?
data ends
stack segment stack
例如:上面的宏调用,其展开形式为:
1
MOV AX,
DATA
1
MOV DS,AX
第5页/共33页
宏汇编应用举例 例5-9
data segment buf1 db 0dh,0ah,'what are your name?$' buf2 db 0dh,0ah,'my name is liyang!$' data ends
rept 100 db 32 endm
本汇例编用结伪果指为令:REPT重复 定Ta义bl的e 存L储A单BE元L可以用重 复by操te作符DUP来代替,但 前大者。的功d能b┆更32灵活、更强
db 32
上述字节定义重复100次
方法2:用DUP来实现: Table DB 100 DUP(32)
第18页/共33页
条件,表达式或参数指明被测试的条件表达式或参数。
当被测试的表达式或参数符合条件(成立)时,IF××
和ELSE之间的条件语句块才被汇编。ELSE是一个可
相关文档
最新文档