160 likes | 314 Views
第四节 重复汇编. 第十三章 高级汇编语言技术及其使用简介. 第四节 重复汇编. 有时汇编语言程序需要连续地重复完全相同的或者几乎完全相同的一组代码,这时可使用重复汇编。 重复汇编 是指在汇编源程序时,对一些语句序列进行重复的汇编,而不是在程序运行期间执行重复操作。 重复汇编伪指令 用来实现重复汇编,它可用在宏定义中,也可出现源程序的任何位置上。 REPT 重复汇编伪指令有三条: IRP IRPC. 4.1 定重复伪操作 REPT 及使用举例. 定重复伪操作 REPT 的格式为:
E N D
第四节 重复汇编 • 第十三章 • 高级汇编语言技术及其使用简介
第四节 重复汇编 有时汇编语言程序需要连续地重复完全相同的或者几乎完全相同的一组代码,这时可使用重复汇编。 重复汇编是指在汇编源程序时,对一些语句序列进行重复的汇编,而不是在程序运行期间执行重复操作。 重复汇编伪指令用来实现重复汇编,它可用在宏定义中,也可出现源程序的任何位置上。 REPT 重复汇编伪指令有三条: IRP IRPC
4.1 定重复伪操作 REPT 及使用举例 定重复伪操作 REPT 的格式为: REPT 表达式 … … (重复块) … ENDM 其中表达式的值用来确定重复块的重复次数,表达式中如包含外部或未定义的项则汇编指示出错。 重复伪操作并不一定要在宏定义体内。下面举例说明重复伪操作的使用方法。
例13.4.1 现有下列语句: TABLE LABEL BYTE X=0 REPT 10 X=X+1 DB X ENDM 上述语句汇编后,将数据1、2、…、10分配给10个连续的字节单元。它们等效于以下语句: 重复块 DB 1,2,3,4,5,6,7,8,9,10 ?
例13.4.2 用重复汇编把字符A~Z的ASCII码填入数组TABLE中。编写的语句如下: CHAR=‘A’ TABLE LABEL BYTE REPT 26 DB CHAR CHAR=CHAR+1 ENDM 上述语句在汇编期间获得的结果等效于以下语句: TABLE DB ‘ABCDEFG…XYZ’
例13.4.3 用宏定义及重复伪操作把TAB,TAB+2,TAB+4,TAB+6,TAB+8的内容存入堆栈。宏定义: PUSH_TAB MACRO K PUSH TAB+K ENDM 宏调用: I=0 REPT 5 PUSH_TAB %I I=I+2 ENDM 宏展开: 2 PUSH TAB+0 2 PUSH TAB+2 2 PUSH TAB+4 2 PUSH TAB+6 2 PUSH TAB+8
4.2 不定重复伪操作 IRP 及使用举例 不定重复伪操作 IRP 的格式为: IRP 形式参数,<实际参数表> … … (重复块) … ENDM 汇编程序对重复块的代码进行重复,重复次数由实际参数的个数来确定。每一次重复是把重复块中的形式参数依次用实际参数表中的一项来取代,直到实际参数用完为止。其中,实际参数可以是变量、字符串或数字常数,其个数可以是任意的,各实际参数之间要用逗号分隔。实际参数表必须用尖括号括起。 如前面例13.4.1 可用不定重复伪操作: TABLE LABEL BYTE IRP X,<1,2,3,4,5,6,7,8,9,10> DB X ENDM
例13.4.4 某一源程序需要多次将AX、BX、CX、DX寄存器的内容压入堆栈,则可用一个宏定义:PUSHR MACRO IRP REG,<AX,BX,CX,DX> PUSH REG ENDM ENDM 在调用上述宏定义时,汇编后展开得: 2 PUSH AX 2 PUSH BX 2 PUSH CX 2 PUSH DX
4.3 不定重复字符伪操作 IRPC 及使用举例 不定重复字符伪操作 IRPC的格式为: IRPC 形式参数,字符串(或〈字符串〉) … … (重复块) … ENDM IRPC和IRP类似,但实际参数表必须是字符串。重复次数由字符串中的字符个数确定,重复汇编时,依次用字符串中的一个字符取代形式参数,直到字符串的字符用完为止。其中,字符串可以是任意的字母、数字和符号的组合。如果字符串中包括空格、逗号或其它分隔符,则必须用尖括号将字符串括起来。
如例13.4.1 可用不定重复字符伪操作: PUSHR MACRO IRPC REG,ABCD PUSH REG&X ENDM ENDM 例13.4.5 现有下列语句:IRPC CHAR,ABCDEFG DB ‘&CHAR’ ENDM 以上DB语句中的&连接符表示CHAR是形式参数。上述语句等效于以下语句: DB ‘ABCDEFG’
第五节 条件汇编 条件汇编的主要作用是可以有选择地对程序段汇编。条件汇编伪指令允许用户在编程时,规定汇编的条件。宏汇编程序在汇编期间,测试条件是否成立。当条件成立时,将指定程序段汇编成目标代码;否则,不进行汇编。 通常条件汇编伪指令语句可以出现在源程序的任何位置上,但多数条件汇编是出现在宏定义中。类似于重复汇编,条件汇编只在汇编期间按条件进行汇编或不汇编,而不是在程序执行时进行。 条件汇编语句的基本格式如下: IFXX 表达式 … }条件块1 [ELSE] … }条件块2 ENDIF IF后面的“XX”表示指定条件,条件的具体内容如表13-2所示。如果表达式满足指定的条件,宏汇编程序将汇编条件块1的语句序列;否则汇编条件块2的语句序列。ELSE是任选部分,若没有ELSE,当IFXX指定的条件满足时就汇编IF与ENDIF之间的语句序列;否则就不汇编。
表13-2给出了各种条件汇编伪指令。 “IF1”语句告诉宏汇编程序,在第一遍扫描时扫视条件块语句;在第二遍扫描时,就跳过条件块语句。“IF2”与“IF1”功能类似,这两条语句都可以提高汇编的速度。 表13-2 条件汇编伪指令
例13.5.4 宏指令 GOTO L,X,REL,Y(其中REL可以是Z,NZ,L,NL等)可以根据不同情况产生无条件转移指令或比较和条件转移指令。 宏定义: GOTO MACRO L,X,REL,Y IFB <REL> JMP L ELSE MOV AX,X CMP AX,Y J&REL L ENDIF ENDM 宏调用: … GOTO LOOP,SUM,NZ,15 … GOTO EXIT … 宏展开: … 1 MOV AX,SUM 1 CMP AX,15 1 JNZ LOOP … 1 JMP EXIT
习题 1. 结构与记录有何区别? 2. 什么叫宏指令、宏调用与宏展开? 3. 试说明宏与子程序的区别。 4. 宏定义如果有标号,在源程序中多次进行宏调用时,会出现什么情况?如何解决?
5. 现有一程序段如下: BLOCK STRUC FB1 DB ? FB2 DB ? FB3 DW 10H DUP(?) BLOCK ENDS DATA SEGMENT STRVAR BLOCK 20 DUP(< >) DATA ENDS … MOV DI,OFFSET STRVAR MOV AL,‘A’ MOV AH,‘Z’ MOV CX,LENGTH STRVAR LOP: MOV [DI].FB1,AL MOV [DI].FB2,AH INC AL DEC AH ADD DI,TYPE STRVAR LOOP LOP 上述程序段执行后,20个结构变量STRVAR的FB1、FB2字段中的内容为多少?
6. 现有记录定义和预置如下: RCO1 RECORD F1:3=110B,F2:6,F3:3 RCO2 RECORD FE1:2,FE2:3=2,FE3:1 … RVAR1 RCO1 <4,0AH,6> RVAR2 RCO1 < > RVAR3 RCO2 <3,> 试说明记录变量RVAR1、RVAR2、RVAR3预置后,在主存的内容是多少?