资源描述
第八章汇编语言,一、概述 1.高级语言与汇编语言比较,高级语言:语句 变量说明/定义 int y,a=25,b=43,c=76; 给变量赋值 y=2(a+b)-c,汇编语言:指令 分配寄存器 分配存储单元 数据传递,2.汇编程序结构 数据段 堆栈段 代码段,;设置数据段 DATA SEGMENT A DB 25 ;数据A B DB 43 ;数据B C DB 76 ;数据C Y DB ? ;存放结果 DATA ENDS ;设置堆栈段 STACK1 SEGMENT PARA STACK DW 20H DUP(0) STACK1 ENDS,示例:,y=2(a+b)-c,;设置代码段 COSEG SEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK1 START: MOV AX , DATA ;装填段寄存器DS MOV DS , AX MOV AL , A ;取数据A ADD AL , B ;计算(A+B) SAL AL , 1 ;计算 2(A+B) SUB AL , C ;计算 2(A+B)-C MOV Y , AL ;存结果 MOV AH,4CH ;结束用户程序,返回操作系统 INT 21H COSEG ENDS END START,示例:,y=2(a+b)-c,汇编语言: 是汇编格式指令,伪指令的集合及其表示,使用这些指令的一组规则。 机器语言: 用二进制编码的机器指令的集合及一组使用规则,它是CPU能直接识别的唯一语言。 MOV DS,AX 汇编语言 8E D8 机器语言(目标代码),汇编语言与机器语言,汇编语言与目标代码的对应,与机器语言相关 效率高 编写源程序繁琐 调试困难,汇编语言特点,对软件的执行时间或存储容量有较高要求的场合,如操 作系统的内核、工业控制领域、实时系统等。 在大型软件中某些影响系统性能的瓶颈程序或者频繁 使用的子程序可以采用汇编语言编程。 与硬件资源密切相关的软件程序,如设备驱动程序。 没有合适的高级语言去开发的程序。,汇编语言的用途,二、汇编语言语句种类,语句种类 指令语句: 又叫可执行语句,在汇编时产生一个目标代码, 对应机器的一种操作。 伪指令语句:又叫命令语句。用于指示汇编程序如何汇编源程序,除了数据定义语句之外,没有目标代码与之对应。 宏指令语句:由用户自定义的指令。(指令的扩展),格式: 名字 操作符 操作数 ; 注释 指令语句: 标号: 助记符 操作数,操作数;注释 伪指令语句:名字 定义符 参数,.,参数 ;注释 命名规则: 可以用 ?,_$,数字和英文字符。 名字的第一个字符不能是数字。 名字的长度不受限制,但只有前31个字符有效。 不允许用保留字作名字(指令、伪指令、寄存器名)。,二、汇编语言语句格式,MASM宏汇编保留字,MASM宏汇编保留字,三、符号定义语句,1. 等值语句 格式: 符号 EQU 表达式 表达式:常数或数值表达式 地址表达式 变量或标号 CONST EQU 10 ADR1 EQU DS:BP+14H ADR2 EQU CONST +10 COUN EQU VAR 为变量名VAR另定义一个别名 同一符号不能用EQU重新定义。 汇编时,作为替代符号用,不产生目标代码,不占 有存储单元。,2. 等号语句 格式: 符号 = 表达式 CONT=5 NUM=10H NUM=NUM+20H COUNT=VAR ;COUNT是变量VAR的别名 COUNT=NUM ;COUNT是常数NUM的别名 表达式形式同上,但可多次重新定义同一符号。,三、符号定义语句,四、数据定义语句,字节 BYTE 1 字 WORD 2 双字 DWORD 4 四字 QWORD 8 十字节 TBYTE 10,DB DW DD DQ DT,例: DATA SEGMENT DA1 DB 9AH DA2 DW 5678H DA3 DD 12345678H DATA ENDS,变量的属性: 段属性 偏移属性 类型属性,四、数据定义语句,格式: 变量名 DB/DW/DD 表达式1,表达式2,.,格式: 变量名 DB/DW/DD 表达式1,表达式2,. 表达式: (1)数值 DA_BYTE1 DB 50H DA_BYTE2 DB 10H,20H,30H,40H DA_WORD1 DW 0A34H DA_WORD2 DW 1234H,5678H,9ABCH DA_DWORD DD 12345678H,9ABCDEFH,四、数据定义语句,格式: 变量名 DB/DW/DD 表达式1,表达式2,. 表达式: (2)字符/字符串 字符串必须用引号括起来 DB时一个字符串可以连续书写小于255个字; DW、DD时每一个字符串表达式由12个字符构成; STRING1 DB STRING STRING2 DW ST,RI,NG STRING3 DD ST,RI,NG,四、数据定义语句,STRING1 DBSTRING STRING2 DWST,RI,NG STRING3 DD ST,RI,NG,字符串定义举例,格式: 变量名 DB/DW/DD 表达式1,表达式2,. 表达式: (3)?表达式:分配相应数量的存储单元,但不初始化。 DA_BYTE3 DB ?,? DA_WORD3 DW ?,?,四、数据定义语句,格式: 变量名 DB/DW/DD 表达式1,表达式2,. 表达式: (4)带DUP的表达式 DA_B1 DB 10H DUP(?) DA_B2 DB 20H DUP(ABCD) DA_W1 DW 10 DUP(4) DA_W2 DW 10 DUP(-1,1) 操作符DUP可以嵌套使用: DA_B3 DB 10H DUP(4 DUP(3),8),四、数据定义语句,1.常数 数值常数:二、八、十、十六进制 B,O,D,H 字符串常数 (1)在指令语句的原操作数中作立即数. MOV AL, 0A9H MOV BX, AB (2) 存储器操作数的寻址方式中作位移量。 MOV AL, DS: 340H (3)在数据定义语句中,对存储单元预置初值。 DB 12H, 34H,五、汇编语言数据与运算符,2. 变量 (1) 用数据定义语句定义并预置初值后,变量代表存储单元的数据,并作为该单元的符号地址。 例如在某数据段已定义一变量: DATA_VAR DB 40H DUP (?) 几种含有变量名的地址表达式为: 直接寻址: DATA_VAR+08H 基址变址寻址: DATA_VAR BX DI 地址表达式的值:存放操作数的存储单元偏移量。 地址表达式的类型:同变量名的类型。,五、汇编语言数据与运算符,2. 变量 (2)在用DW或DD的数据定义语句中,若操作数字段引用了变量名,则在分配的存储单元中,预置被引用的变量名的地址部分:偏移量、段基值 NUM1 DB 10H DUP (?) NUM2 DW 10H DUP (?) ARRAY DB 10H DUP (ABCD) ADR1 DW ARRAY ADR2 DD ARRAY,五、汇编语言数据与运算符,3. 标号:一条指令的符号地址。 段属性 偏移属性 类型属性 NEAR:段内转移,作为标号所在段的转移、调用指令的目标地址。 FAR:段间转移,作为其他段的转移、调用指令的目标地址。 类型属性设置: (1)隐含方式:NEXT:MOV AX, 3000,五、汇编语言数据与运算符,(2)用LABEL伪指令设置类型属性: 标号伪指令LABEL格式: 名字 LABEL 类型 与指令语句配合使用: 名字(新标号) LABEL 类型(NEAR/FAR) SUB1_FAR LABEL FAR SUB1: MOV AX,1234H 与数据定义语句配合使用: 名字(新变量名)LABEL 类型(DB/DW/DD) DATA _BYTE LABEL BYTE DATA _WORD DW 20H DUP(563H),五、汇编语言数据与运算符,(1)算术运算符,4. 运算符,只有减法运算可以用同一段内的两个变量相减,五、汇编语言数据与运算符,NUM = 15*5 ;NUM=75 NUM = NUM/8 ;NUM=9 NUM = NUM MOD 5 ;NUM=4 NUM = -NUM-6 ;NUM= -10 NUM = -NUM ;NUM= 10 ORG 30H ;下面定义数据的起始偏移是30H DA1 DB ABCDEFGH DA2 DB IBM PC COMPUTER COUNT EQU DA2 - DA1 ;38H-30H=8 DA3 EQU DA2+4,NUM=11011011B DATA1 DW NUM SHL 3 , NUM SHR 2 . MOV AX , NUM SHL 3 MOV BX , NUM SHR 2 MOV CX , NUM SHL 8 MOV CX , NUM SHL 16 MOV DX , NUM SHR 8 MOV DX , NUM SHR 16,DATA1 DW 6D8H , 36H . MOV AX , 011011011000B MOV BX , 00110110B MOV CX , 1101101100000000B MOV CX , 0 MOV DX , 0 MOV DX , 0,算术运算符,移位运算符和移位指令区别 移位运算符不能对寄存器或存储单元进行移位运算 MOV AX,CX SHL 5 MOV DX,DATA1 SHR 3,五、汇编语言数据与运算符,(2)逻辑运算符,五、汇编语言数据与运算符,4. 运算符,MOV AL , NOT 0F0H MOV DX , NOT 0F0H MOV BL , 55H OR 0F0H AND BH , 55H AND 0F0H XOR CX , 55H XOR 50H,MOV AL , 0FH MOV DX , 0FF0FH MOV BL , 0F5H AND BH , 50H XOR CX , 5,(3)关系运算符,全1为真,全0为假 比较时,若为常数按无符号数比较,如果是变量按偏移量比较,五、汇编语言数据与运算符,DATA SEGMENT ORG 10H NUM1=1234 NUM2=1234H DA_BYTE DB 10H DUP(0) DA_WORD DW 10H DUP(0) DA_VAR1 DW NUM2+DA_BYTE GT NUM1+DA_WORD DA_VAR2 DB NUM1 LE NUM2 DATA ENDS . MOV AX , NUM1 LT NUM2 MOV BL , NUM1 GE NUM2 MOV CX , DA_WORD GT DA_BYTE,. DA_VAR1 DW 0FFFFH DA_VAR2 DB 0FFH . MOV AX , 0FFFFH MOV BL , 0 MOV CX , 0FFFFH .,可以对两个常数进行比较,不能用常数与偏移量进行比较,格式: 运算对象是存储器操作数,由变量名或标号组成地址表达式 SEG : 返回变量所在的段值 OFFSET:返回变量所在偏移 TYPE:返回变量的类型 LENGTH:返回数组变量的元素个数 SIZE:返回数组变量所占的总字节数 SIZE= TYPE* LENGTH,(4)数值返回运算符,五、汇编语言数据与运算符,假设DATA的段基值是7A4EH DATA SEGMENT ORG 30H DA1 DB 20H DUP(12H) DA2 DW DA1 . DATA ENDS . MOV AX , SEG DA1 MOV BX , SEG DA2 MOV SI , OFFSET DA1 MOV CX , DA2 MOV DI , OFFSET DA2 MOV DX , OFFSET DA1+4,MOV AX , 7A4EH MOV BX , 7A4EH MOV SI , 30H MOV CX , DA2 MOV DI , 50H MOV DX , 34H,用数字形式表示变量和标号的类型属性,五、汇编语言数据与运算符,(4)数值返回运算符,DA_BYTE DB 12H DA_WORD DW 3456H DA_DWORD DD 789AH . MOV AL , TYPE DA_BYTE MOV BL , TYPE DA_WORD MOV CL , TYPE DA_DWORD . MOV AL , 1 MOV BL , 2 MOV CL , 4,LENGTH与SIZE运算符,LENGTH运算符 返回数组变量的元素个数 如果变量用DUP定义,Length为外层DUP的值 如果没有DUP定义,结果为1 SIZE运算符 数组变量所占的总字节数 SIZE是LENGTH和TYPE的乘积,五、汇编语言数据与运算符,(4)数值返回运算符,DATA SEGMENT VAR1 DB 10H DUP(0) VAR2 DB 10H, 20H, 30H, 40H VAR3 DW 10H DUP(A, 4 DUP(3) VAR4 DB COMPUTER DATA ENDS . MOV AL , LENGTH VAR1 ; MOV AH , SIZE VAR1 ; MOV BL , LENGTH VAR2 ; MOV BH , SIZE VAR2 ; MOV CL , LENGTH VAR3 ; MOV CH , SIZE VAR3 ; MOV DL , LENGTH VAR4 ; MOV DH , SIZE VAR4 ;,(AL)=10H (AH)=10H (BL)=1 (BH)=1 (CL)=10H (CH)=20H (DL)=1 (DH)=1,求数组ARRAY的各数据项的累加和,从数组最后一个数据项开始进行累加。 ARRAY DW 20H DUP(4) . XOR AX , AX MOV SI , OFFSET ARRAY ADD SI , SIZE ARRAY-TYPE ARRAY MOV CX , LENGTH ARRAY LOP: ADD AX , SI SUB SI , TYPE ARRAY LOOP LOP,例:,(5)属性运算符 PTR: 类型 PTR 地址表达式 类型可以是:BYTE ,WORD,DWORD 或NEAR FAR 仅在当前语句中有效,是一种临时设置。 DA_BYTE DB 20H DUP(0) DA_WORD DW 10H DUP(0) MOV WORD PTR DA_BYTE 10, AX ADD BYTE PTR DA_WORD DI, BL INC BYTE PTR SI SUB WORD PTRBX,30H JMP FAR PTR SUB1,五、汇编语言数据与运算符,THIS:THIS 类型 THIS常与等值语句EQU一起用,形成新变量名或标号,使它们具有THIS后所指的类型,而段基值和偏移量与紧接的变量名或标号相同。 例: DATA _BYTE EQU THIS BYTE DATA _WORD DW 20H DUP(0) JUMP_FAR EQU THIS FAR JUMP_NEAR : XOR AX, AX,五、汇编语言数据与运算符,(5)属性运算符,(6)分离字节运算符 HIGH 表达式 LOW 表达式 分离运算对象的高字节和低字节部分 表达式必须具有常量值,如常数、地址表达式, 不能是存储器操作数或寄存器内容,五、汇编语言数据与运算符,DATA SEGMENT ORG 20H CONST EQU 0ABCDH DATA1 DB 10H DUP(?) DATA2 DW 20H DUP(?) . DATA ENDS . MOV AH , HIGH CONST MOV AL , LOW CONST MOV BH , HIGH (OFFSET DATA1) MOV BL , LOW (OFFSET DATA2) MOV CL , LOW (CONST SHL 3),MOV AH , 0ABH MOV AL , 0CDH MOV BH , 0 MOV BL , 30H MOV CL , 68H,(7)运算符的优先级,五、汇编语言数据与运算符,六、段结构伪指令,1. 段定义伪指令 段名 SEGMENT 定位类型 组合类型 类别名 . 段名 ENDS 定位类型(Align Type): PAGE(页):本段从一个页的边界开始,起始地址能被 256整除。 PARA(节):本段从一个节的边界开始,起始地址能被 16整除。 WORD(字):本段从偶字节地址开始。 BYTE(字节):本段从任意地址开始。,组合类型(Combine Type): NONE:本段与其它段无连接关系,是独立的。 PUBLIC:本段与其它同段名同类型的段相连接在一起,然后为所有这些段指定一个共同的段基地址,形成一个新的逻辑段。 COMMON:本段与其它同段名同类型的段设置相同的段基址,共享相同的存储区,段长度由同名段中最大的段确定。(覆盖段),六、段结构伪指令,1. 段定义伪指令,组合类型(Combine Type):,STACK:与PUBLIC段相似,但此段为堆栈段,系统自动对SS寄存器和SP指针初始化。 AT表达式:本段的起始单元可以定位在表达式所示的节边界上。 MEMORY:本段定位在所有其它段的最高地址,有多个段,只把第一遇到的当作此段。 类别名(Class),六、段结构伪指令,1. 段定义伪指令,2. 段寻址伪指令 ASSUME 段寄存器名:段名,段寄存器名:段名,. DS_DATA SEGMENT VAR1 DB 12H DS_DATA ENDS ES_DATA SEGMENT VAR2 DB 34H ES_DATA ENDS CODE SEGMENT VAR3 DB 56H,六、段结构伪指令,ASSUME CS:CODE , DS:DS_DATA START: . INC VAR1 INC VAR2 INC VAR3 . CODE ENDS END START,可用关键字NOTHING取消前面的某些设置。 例: ASSUME DS:NOTHING;取消对DS的设置 ASSUME NOTHING; 取消全部4个段R的设置,接上篇,3.段寄存器的装入 DS,ES的装入 DATA_DS SEGMENT DB1 DB 10H DUP(?) DATA_DS ENDS CODE SEGMENT ASSUME CS:CODE , DS:DATA_DS , ES:DATA_ES START: MOV AX , DATA_DS ;设置DS MOV DS , AX MOV AX , DATA_ES ;设置ES MOV ES , AX . CODE ENDS,六、段结构伪指令,DATA_ES SEGMENT DB2 DB 20H DUP(?) DATA_ES ENDS,SS的装入 (1) STACK1 SEGMENT PARA STACK DW 20H DUP(?) STACK1 ENDS (2) STACK2 SEGMENT DW 30H DUP(?) TOP LABEL WORD STACK2 ENDS . CODE SEGMENT . MOV AX , STACK2 ;设置SS MOV SS , AX MOV SP , OFFSET TOP ;修改SP,六、段结构伪指令,CS的装入 . CODE SEGMENT ASSUME CS:CODE , . START: . CODE ENDS END START,六、段结构伪指令,过程名 PROC NEAR/FAR . RET 过程名 ENDP 有三个属性 一个过程内,至少有一条返回指令RET 调用过程使用CALL 过程名 段内返回与段间返回,七、过程定义伪指令,八、其它伪指令,1. ORG , $ ORG 表达式 将表达式的值赋给位置计数器 $ 存放位置计数器的当前值,ORG , $举例,DATA SEGMENT ORG 30H DB1 DB 12H , 34H ORG $+20H STRING DB STRING DATA ENDS,八、其它伪指令,1. ORG , $,ORG , $举例,DATA SEGMENT DA1 DB 10H DUP(?) DA2 DB 12H , 34H DA3 DW 56H , $+10H , 78H , $+20H . DATA ENDS,CODE SEGMENT . ORG 50H MOV AX , OFFSET $ MOV BX , OFFSET $ . CODE ENDS,MOV AX , 0050H MOV BX , 0053H,八、其它伪指令,1. ORG , $,ORG , $举例,八、其它伪指令,2. EVEN 伪指令 定位偶地址 3. INCLUDE伪指令 INCLUDE 文件名 例: INCLUDE FILE.MAC INCLUDE B:MASMABC.ASM,4. PUBLIC PUBLIC 符号1,符号2, ,5. EXTRN 伪指令 EXTRN 符号 1:类型 ,符号 2: 类型, .,PUBLIC NUM1 , STRING , SUB1 , LOOP1 DATA1 SEGMENT NUM1 EQU 1234H . STRING DB CHARACTER STRING . DATA1 ENDS . CODE1 SEGMENT . SUB1 PROC FAR . SUB1 ENDP,LOOP1: . . CODE1 ENDS END,EXTRN NUM1:ABS , STRING:BYTE EXTRN SUB1:FAR , LOOP1:NEAR : CODE2 SEGMENT : MOV AX , NUM1 LEA BX , STRING : CALL SUB1 : JMP FAR PTR LOOP1 : CODE2 ENDS END,八、其它伪指令,5. TITLE (标题)伪指令,指定一个标题 格式:TITLE 文本 字符不超过80个 例: TITLE EXAMPLE PROGRAM,九、宏指令,例: MULTAX10 MACRO PUSH BX SAL AX,1 MOV BX,AX SAL AX,1 SAL AX,1 ADD AX,BX POP BX ENDM,九、宏指令,EXCHANGE MACRO MEM1,MEM2,REG MOV REG,MEM1 XCHG REG,MEM2 MOV MEM1,REG ENDM,1. 宏定义 宏名 MACRO 形参1,形参2,. . ENDM,2. 宏调用 宏名 实参1,实参2,. EXCHANGE DA_BY1 , DA_BY2 , AL 3. 宏展开,九、宏指令,;宏定义 MULTAX10 MACRO PUSH BX SAL AX,1 MOV BX,AX SAL AX,1 SAL AX,1 ADD AX,BX POP BX ENDM ;- EXCHANGE MACRO MEM1,MEM2,REG MOV REG,MEM1 XCHG REG,MEM2 MOV MEM1,REG ENDM,;设置数据段 DATA SEGMENT DA_W01 DW 1234H DA_W02 DW 5678H DATA ENDS ;设置堆栈段 STACK1 SEGMENT PARA STACK DW 20H PUP(?) STACK1 ENDS ;设置代码段 COSEG SEGMENT ASSUME CS:COSEG,DS:DATA,SS:STACK1 START: MOV AX , DATA MOV DS , AX . MULTAX10 ;宏指令语句 + PUSH BX + SAL AX , 1,+ MOV BX , AX + SAL AX , 1 + SAL AX , 1 + ADD AX , BX + POP BX . EXCHANGE DA_W01 , DA_W02 , CX :宏指令语句 + MOV CX , DA_W01 + XCHG CX , DA_W02 + MOV DA_W01 , CX . COSEG ENDS END START,4. 宏操作符 连接操作符 & 定义:SHIFT_VAR MACRO R_M , DIRECT, COUNT MOV CL , COUNT S&DIRECT R_M , CL ENDM 调用:SHIFT_VAR AX,HL,2 SHL AX,CL SHIFT_VAR AX,HR,2 SHR AX,CL,SHIF0 MACRO CNT MOV CL , CNT ENDM SHIF1 MACRO REG , DIRECT , NUM COUNT=NUM SHIF0 %COUNT S宏调用 SHIF1 AX , HL , 2 SHIF1 BL , AR , 3,表达式操作符 % 格式:%表达式;获取表达式的值(出现在宏调用中),;宏展开 SHIF1 AX , HL , 2 + MOV CL , 2 + SHL AX , CL SHIF1 BL , AR , 3 + MOV CL , 3 + SAR BL , CL,文本操作符 EXCHANGE ,AL 宏展开 MOV AL , BYTE PTR DA_WORD1 XCHG AL , BYTE PTR DA_WORD2 MOV BYTE PTR WORD1 , AL 字符操作符 ! 格式: !字符 宏定义:PROMPT MACRO NUM , TEXT PROMP,5. LOCAL伪指令,LOCAL 在汇编过程中,宏定义中的内容会在每一次宏调用处展开。因此当多次调用一个宏时,宏定义中的标号会造成标号重复定义。 在宏定义中使用LOCAL伪指令可以使标号被局部化,从而避免重复定义。 LOCAL伪指令只能用在宏定义中,并且它必须是宏定义中紧跟在MACRO伪指令之后的第一个语句。,用连续相加的办法实现无符号数乘法运算 MULTIP MACRO MULT1 , MULT2 , MULT3 LOCAL LOP , EXIT0 MOV DX , MULT1 MOV CX , MULT2 XOR BX , BX XOR AX , AX JCXZ EXIT0 LOP: ADD BX , DX ADC AX , 0 LOOP LOP EXIT0: MOV MULT3 , BX MOV MULT3+2 , AX ENDM,设数据段有如下定义的变量: DA1 DW 1234H , 5678H DA2 DW 120H , 210H DA3 DW 4 DUP(?),宏展开: . MULTIP DA1 , DA2 , DA3 + MOV DX , DA1 + MOV CX , DA2 + XOR BX , BX + XOR AX , AX + JCXZ ?0001 +?0000:ADD BX , DX + ADC AX , 0 + LOOP ?0000 +?0001: MOV DA3 , BX,+ MOV DA3+2 , AX . MULTIP DA1+2 , DA2+2 , DA3+4 + MOV DX , DA1+2 + MOV CX , DA2+2 + XOR BX , BX + XOR AX , AX + JCXZ ?0003 +?0002:ADD BX , DX + ADC AX , 0 + LOOP ?0002 +?0003: MOV DA3+4 , BX + MOV DA3+6 , AX .,6. 宏嵌套 宏定义嵌套 嵌套的宏定义: JUMP MACRO COND J&COND&S MACRO DEST LOCAL NEXT , EXIT J&COND NEXT JMP EXIT NEXT: JMP DEST EXIT: ENDM ENDM,外层宏调用为: JUMP E JUMP NE JUMP G JUMP GE 内层宏调用为: : JES SUB1 ;等于0转移 : JGES SUB2 ;大于或等于转移 :,当宏汇编程序对内层宏展开后,可得到如下结果: JE ? 0000 JMP ? 0001 ? 0000: JMP SUB1 ? 0001: : JGE ? 0002 JMP ? 0003 ? 0002: JMP SUB2 ? 0003: :,两个宏定义: 对32位数左移一位 SHIFT MACRO NUM1 , NUM2 SAL NUM2 ,1 RCL NUM1 ,1 ENDM 对32位数乘以12 MULT12 MACRO M_R1 , M_R2 , REG1 , REG2 PUSHF PUSH REG1 PUSH REG2 SHIFT M_R1 , M_R2 SHIFT M_R1 , M_R2 MOV REG1 , M_R1 MOV REG2 , M_R2,宏定义内嵌套宏调用,SHIFT M_R1 , M_R2 ADD M_R2 , REG2 ADC M_R1 , REG1 POP REG2 POP REG1 POPF ENDM 某数据段已定义变量: 在程序中可以编写宏指令语句: : MULT12 DA_WORD+2,DA_WORD,AX,BX : MULT12 AX,BX,CX,DX : 7. 宏库的建立与使用,
展开阅读全文