子程序与宏指令设计.ppt

上传人:壹****1 文档编号:569777228 上传时间:2024-07-31 格式:PPT 页数:129 大小:822.36KB
返回 下载 相关 举报
子程序与宏指令设计.ppt_第1页
第1页 / 共129页
子程序与宏指令设计.ppt_第2页
第2页 / 共129页
子程序与宏指令设计.ppt_第3页
第3页 / 共129页
子程序与宏指令设计.ppt_第4页
第4页 / 共129页
子程序与宏指令设计.ppt_第5页
第5页 / 共129页
点击查看更多>>
资源描述

《子程序与宏指令设计.ppt》由会员分享,可在线阅读,更多相关《子程序与宏指令设计.ppt(129页珍藏版)》请在金锄头文库上搜索。

1、汇编语言程序设计汇编语言程序设计第第第第六六六六章章章章 子程序与宏指令设计子程序与宏指令设计子程序与宏指令设计子程序与宏指令设计 为了程序共享或模块化设计的需要,为了程序共享或模块化设计的需要,可以把一段公共语句序列设计成子程序或可以把一段公共语句序列设计成子程序或宏指令的形式。宏指令的形式。6.1 6.1 子程序结构及设计方法子程序结构及设计方法6.2 6.2 子程序参数传递子程序参数传递6.3 6.3 嵌套与递归子程序嵌套与递归子程序6.4 6.4 宏宏 指指 令令6.5 6.5 宏指令库宏指令库6.6 6.6 重复伪指令重复伪指令6.7 6.7 条件伪指令条件伪指令6.1 6.1 子程

2、序结构及设计方法子程序结构及设计方法6.1.1 6.1.1 含有子程序的程序结构含有子程序的程序结构在汇编语言中用过程定义伪指令定在汇编语言中用过程定义伪指令定义子程序。过程定义伪指令义子程序。过程定义伪指令格式:格式:过程名过程名PROC PROC 属型属型过程名过程名ENDPENDP1 1调调用用程程序序和和子子程程序序在在同同一一个个代代码码段段的的程程序序结结构构(子子程程序序类类型型可可缺缺省省,注注意意ENDEND后后必必须须跟主程序名)跟主程序名)CODE CODE CODE CODE SEGMENTSEGMENTSEGMENTSEGMENTMAINMAINMAINMAINPRO

3、C PROC PROC PROC FARFARFARFARCALLCALLCALLCALLSUB1SUB1SUB1SUB1RETRETRETRETMAINMAINMAINMAINENDPENDPENDPENDPSUB1SUB1SUB1SUB1PROCPROCPROCPROCRETRETRETRETSUB1SUB1SUB1SUB1ENDPENDPENDPENDPCODECODECODECODEENDSENDSENDSENDSENDENDENDENDMAINMAINMAINMAIN2 2 2 2调用程序和子程序在不同段的程序结构调用程序和子程序在不同段的程序结构调用程序和子程序在不同段的程序结构调

4、用程序和子程序在不同段的程序结构( ( ( (SUB2SUB2SUB2SUB2既既既既被被被被段段段段间间间间调调调调用用用用又又又又被被被被段段段段内内内内调调调调用用用用, , , ,必必必必须须须须是是是是FARFARFARFAR属属属属性性性性。CALLCALLCALLCALL要显式说明是要显式说明是要显式说明是要显式说明是FARFARFARFAR属性)属性)属性)属性)CODE1CODE1CODE1CODE1SEGMENTSEGMENTSEGMENTSEGMENTMAINMAINMAINMAINPROC PROC PROC PROC FARFARFARFARCALLCALLCALLC

5、ALLFAR PTR SUB2FAR PTR SUB2FAR PTR SUB2FAR PTR SUB2RETRETRETRETMAINMAINMAINMAINENDPENDPENDPENDPCODE1CODE1CODE1CODE1ENDSENDSENDSENDSCODE2CODE2CODE2CODE2SEGMENTSEGMENTSEGMENTSEGMENTSUB1SUB1SUB1SUB1PROCPROCPROCPROCFARFARFARFARCALL CALL CALL CALL FAR PTR SUB2FAR PTR SUB2FAR PTR SUB2FAR PTR SUB2RETRETRET

6、RETSUB1SUB1SUB1SUB1ENDPENDPENDPENDPSUB2SUB2SUB2SUB2PROCPROCPROCPROCFARFARFARFARRETRETRETRETSUB2SUB2SUB2SUB2ENDPENDPENDPENDPCODE2CODE2CODE2CODE2ENDSENDSENDSENDSENDENDENDENDMAINMAINMAINMAIN6.1.2 6.1.2 设计子程序时应注意的问题设计子程序时应注意的问题1 1子程序说明子程序说明2 2寄存器的保存与恢复寄存器的保存与恢复3 3密切注意堆栈状态密切注意堆栈状态 6.2 6.2 子程序参数传递子程序参数传递可

7、以通过给子程序传递参数使其更可以通过给子程序传递参数使其更通用。常用的参数传递方法如下:通过通用。常用的参数传递方法如下:通过寄存器传递;若调用程序和子程序在同寄存器传递;若调用程序和子程序在同模块(源程序)中,子程序可以直接访模块(源程序)中,子程序可以直接访问模块中的变量;通过地址表传递参数问模块中的变量;通过地址表传递参数地址;通过堆栈传递参数或参数地址。地址;通过堆栈传递参数或参数地址。6.2.1 6.2.1 通过寄存器传递通过寄存器传递 这种传递方式使用方便,适用于参数较少的这种传递方式使用方便,适用于参数较少的这种传递方式使用方便,适用于参数较少的这种传递方式使用方便,适用于参数较

8、少的情况。情况。情况。情况。例例1 1把把BXBX中的中的1616位二进制数转换成位二进制数转换成十进制并显示在屏幕上。十进制并显示在屏幕上。 STASGSTASGSEGMENTSEGMENTDW 32 DUP(?)DW 32 DUP(?)STASG STASG ENDSENDSCODE CODE SEGMENTSEGMENTASSUME CS:CODEASSUME CS:CODEMAIN MAIN PROC FARPROC FARMOV BX,162EHMOV BX,162EHCALL TERN CALL TERN MOV AX,4C00HMOV AX,4C00H INT 21HINT 21

9、HMAIN MAIN ENDPENDP程序程序6.36.3TERN TERN TERN TERN PROCPROCPROCPROC; ; ; ;二二二二十并显示。十并显示。十并显示。十并显示。 MOV CX,10000MOV CX,10000MOV CX,10000MOV CX,10000CALL DEC_DIVCALL DEC_DIVCALL DEC_DIVCALL DEC_DIV; ; ; ;转换万位数转换万位数转换万位数转换万位数 MOV CX,1000MOV CX,1000MOV CX,1000MOV CX,1000CALL DEC_DIVCALL DEC_DIVCALL DEC_DI

10、VCALL DEC_DIV; ; ; ;转换千位数转换千位数转换千位数转换千位数 MOV CX,100MOV CX,100MOV CX,100MOV CX,100CALL DEC_DIVCALL DEC_DIVCALL DEC_DIVCALL DEC_DIV; ; ; ;转换百位数转换百位数转换百位数转换百位数 MOV CX,10MOV CX,10MOV CX,10MOV CX,10CALL DEC_DIVCALL DEC_DIVCALL DEC_DIVCALL DEC_DIV; ; ; ;转换十位数转换十位数转换十位数转换十位数 MOV CX,1MOV CX,1MOV CX,1MOV CX,

11、1CALL DEC_DIVCALL DEC_DIVCALL DEC_DIVCALL DEC_DIV; ; ; ;转换个位数转换个位数转换个位数转换个位数RETRETRETRETTERN TERN TERN TERN ENDPENDPENDPENDPDEC_DIVDEC_DIVDEC_DIVDEC_DIVPROCPROCPROCPROC;CX;CX;CX;CX中为十进制的位权中为十进制的位权中为十进制的位权中为十进制的位权MOV AX,BXMOV AX,BXMOV AX,BXMOV AX,BXMOV DX,0MOV DX,0MOV DX,0MOV DX,0 DIV CXDIV CXDIV CXD

12、IV CX; ; ; ;商为转换后的一位十进制数商为转换后的一位十进制数商为转换后的一位十进制数商为转换后的一位十进制数MOV BX,DXMOV BX,DXMOV BX,DXMOV BX,DXMOV DL,ALMOV DL,ALMOV DL,ALMOV DL,AL ADD DL,30HADD DL,30HADD DL,30HADD DL,30H; ; ; ;转换成转换成转换成转换成ASCIIASCIIASCIIASCII码码码码 MOV AH,2MOV AH,2MOV AH,2MOV AH,2; ; ; ;显示显示显示显示INT 21HINT 21HINT 21HINT 21H RETRETR

13、ETRETDEC_DIVDEC_DIVDEC_DIVDEC_DIVENDPENDPENDPENDPCODE CODE CODE CODE ENDSENDSENDSENDS END MAINEND MAINEND MAINEND MAIN6.2.2 6.2.2 6.2.2 6.2.2 同模块中的子程序可直接访问模块中的变量同模块中的子程序可直接访问模块中的变量同模块中的子程序可直接访问模块中的变量同模块中的子程序可直接访问模块中的变量 若若调调用用程程序序和和子子程程序序在在同同模模块块中中,子子程程序序可以直接访问模块中的变量。可以直接访问模块中的变量。例例2 2实实现现数数组组求求和和功功能

14、能。要要求求数数组组求求和和(不不考考虑虑溢溢出出情情况况)由由子子程程序序实实现现,其其数数组元素及结果均为字型数据。见程序组元素及结果均为字型数据。见程序6.46.4。STACKSGSTACKSGSEGMENT STACK STKSEGMENT STACK STKDW 32 DUP(S)DW 32 DUP(S)STACKSG STACKSG ENDSENDSDATA DATA SEGMENTSEGMENTARY ARY DW 1,2,3,4,5,6,7,8,9,10DW 1,2,3,4,5,6,7,8,9,10COUNT COUNT DW ($-ARY)/2DW ($-ARY)/2; ;

15、; ;数组元素个数数组元素个数数组元素个数数组元素个数SUM SUM DW ?DW ?; ; ; ;数组和的地址数组和的地址数组和的地址数组和的地址DATA DATA ENDSENDS程序程序6.46.4CODE1 CODE1 CODE1 CODE1 SEGMENTSEGMENTSEGMENTSEGMENTMAIN MAIN MAIN MAIN PROC FARPROC FARPROC FARPROC FAR ASSUME CS:CODE1,DS:DATAASSUME CS:CODE1,DS:DATAASSUME CS:CODE1,DS:DATAASSUME CS:CODE1,DS:DATA

16、PUSH DSPUSH DSPUSH DSPUSH DS XOR AX,AXXOR AX,AXXOR AX,AXXOR AX,AX PUSH AXPUSH AXPUSH AXPUSH AX MOV AX,DATAMOV AX,DATAMOV AX,DATAMOV AX,DATA MOV DS,AXMOV DS,AXMOV DS,AXMOV DS,AX CALL FAR PTR ARY_SUMCALL FAR PTR ARY_SUMCALL FAR PTR ARY_SUMCALL FAR PTR ARY_SUM RETRETRETRETMAIN MAIN MAIN MAIN ENDPENDPEN

17、DPENDPCODE1 CODE1 CODE1 CODE1 ENDSENDSENDSENDSCODE2 CODE2 CODE2 CODE2 SEGMENTSEGMENTSEGMENTSEGMENT ASSUME CS:CODE2ASSUME CS:CODE2ASSUME CS:CODE2ASSUME CS:CODE2ARY_SUM ARY_SUM ARY_SUM ARY_SUM PROC FARPROC FARPROC FARPROC FAR; ; ; ;数组求和子程序数组求和子程序数组求和子程序数组求和子程序 PUSH AXPUSH AXPUSH AXPUSH AX; ; ; ;保存寄存器保

18、存寄存器保存寄存器保存寄存器 PUSH CXPUSH CXPUSH CXPUSH CX PUSH SIPUSH SIPUSH SIPUSH SI LEA SI,ARYLEA SI,ARYLEA SI,ARYLEA SI,ARY; ; ; ;取数组起始地址取数组起始地址取数组起始地址取数组起始地址 MOV CX,COUNTMOV CX,COUNTMOV CX,COUNTMOV CX,COUNT; ; ; ;取元素个数取元素个数取元素个数取元素个数 XOR AX,AXXOR AX,AXXOR AX,AXXOR AX,AX; ; ; ;清清清清0 0 0 0累加器累加器累加器累加器NEXT: NEX

19、T: NEXT: NEXT: ADD AX,SIADD AX,SIADD AX,SIADD AX,SI; ; ; ;累加和累加和累加和累加和 ADD SI,TYPE ARYADD SI,TYPE ARYADD SI,TYPE ARYADD SI,TYPE ARY; ; ; ;修改地址指针修改地址指针修改地址指针修改地址指针 LOOP NEXTLOOP NEXTLOOP NEXTLOOP NEXT MOV SUM,AXMOV SUM,AXMOV SUM,AXMOV SUM,AX; ; ; ;存和存和存和存和 POP SIPOP SIPOP SIPOP SI; ; ; ;恢复寄存器恢复寄存器恢复寄

20、存器恢复寄存器 POP CXPOP CXPOP CXPOP CX POP AXPOP AXPOP AXPOP AX RET RET RET RET ARY_SUM ARY_SUM ARY_SUM ARY_SUM ENDPENDPENDPENDPCODE2 CODE2 CODE2 CODE2 ENDSENDSENDSENDS END MAINEND MAINEND MAINEND MAIN6.2.3 6.2.3 通过地址表传递参数地址通过地址表传递参数地址适用于参数较多的情况。具体方法是先建立一个适用于参数较多的情况。具体方法是先建立一个适用于参数较多的情况。具体方法是先建立一个适用于参数较多的

21、情况。具体方法是先建立一个地址表,该表由参数地址构成。然后把表的首地址通过地址表,该表由参数地址构成。然后把表的首地址通过地址表,该表由参数地址构成。然后把表的首地址通过地址表,该表由参数地址构成。然后把表的首地址通过寄存器或堆栈传递给子程序。寄存器或堆栈传递给子程序。寄存器或堆栈传递给子程序。寄存器或堆栈传递给子程序。例例3 3编编写写一一个个数数组组求求和和子子程程序序,其其数数组组元元素素及及结结果果均均为为字字型型数数据据。另另定定义义两两个个数数组组,并并编编写写一一个个主主程程序序,通通过过调调用用数数组组求求和和子子程程序序分分别别求求出出两两个数组的和。个数组的和。见程序见程序

22、6.56.5。程序程序6.56.5STACKSG STACKSG STACKSG STACKSG SEGMENT STACK STKSEGMENT STACK STKSEGMENT STACK STKSEGMENT STACK STK DW 32 DUP(S)DW 32 DUP(S)DW 32 DUP(S)DW 32 DUP(S)STACKSG STACKSG STACKSG STACKSG ENDSENDSENDSENDSDATA DATA DATA DATA SEGMENTSEGMENTSEGMENTSEGMENTARY ARY ARY ARY DW 1,2,3,4,5,6,7,8,9,1

23、0DW 1,2,3,4,5,6,7,8,9,10DW 1,2,3,4,5,6,7,8,9,10DW 1,2,3,4,5,6,7,8,9,10; ; ; ;数组数组数组数组1 1 1 1COUNT COUNT COUNT COUNT DW ($-ARY)/2DW ($-ARY)/2DW ($-ARY)/2DW ($-ARY)/2; ; ; ;数组数组数组数组1 1 1 1的元素个数的元素个数的元素个数的元素个数SUM SUM SUM SUM DW ?DW ?DW ?DW ?; ; ; ;数组数组数组数组1 1 1 1的和地址的和地址的和地址的和地址NUM NUM NUM NUM DW 10,20

24、,30,40,50DW 10,20,30,40,50DW 10,20,30,40,50DW 10,20,30,40,50; ; ; ;数组数组数组数组2 2 2 2CT CT CT CT DW ($-NUM)/2DW ($-NUM)/2DW ($-NUM)/2DW ($-NUM)/2; ; ; ;数组数组数组数组2 2 2 2的元素个数的元素个数的元素个数的元素个数TOTAL TOTAL TOTAL TOTAL DW ?DW ?DW ?DW ?; ; ; ;数组数组数组数组2 2 2 2的和地址的和地址的和地址的和地址TABLE TABLE TABLE TABLE DW 3 DUP(?)DW

25、3 DUP(?)DW 3 DUP(?)DW 3 DUP(?); ; ; ;地址表地址表地址表地址表DATA DATA DATA DATA ENDSENDSENDSENDSCODE1CODE1CODE1CODE1SEGMENTSEGMENTSEGMENTSEGMENTMAINMAINMAINMAINPROC FARPROC FARPROC FARPROC FAR ASSUME CS:CODE1,DS:DATAASSUME CS:CODE1,DS:DATAASSUME CS:CODE1,DS:DATAASSUME CS:CODE1,DS:DATA PUSH DSPUSH DSPUSH DSPUSH

26、 DS XOR AX,AXXOR AX,AXXOR AX,AXXOR AX,AX PUSH AXPUSH AXPUSH AXPUSH AX MOV AX,DATAMOV AX,DATAMOV AX,DATAMOV AX,DATA MOV DS,AXMOV DS,AXMOV DS,AXMOV DS,AX; ; ; ;构造数组构造数组构造数组构造数组1 1 1 1的地址表的地址表的地址表的地址表 MOV TABLE,OFFSET ARYMOV TABLE,OFFSET ARYMOV TABLE,OFFSET ARYMOV TABLE,OFFSET ARY MOV TABLE+2,OFFSET CO

27、UNTMOV TABLE+2,OFFSET COUNTMOV TABLE+2,OFFSET COUNTMOV TABLE+2,OFFSET COUNT MOV TABLE+4,OFFSET SUMMOV TABLE+4,OFFSET SUMMOV TABLE+4,OFFSET SUMMOV TABLE+4,OFFSET SUM LEA BX,TABLELEA BX,TABLELEA BX,TABLELEA BX,TABLE; ; ; ;传递地址表首地址传递地址表首地址传递地址表首地址传递地址表首地址 CALL FAR PTR ARY_SUMCALL FAR PTR ARY_SUMCALL FA

28、R PTR ARY_SUMCALL FAR PTR ARY_SUM; ; ; ;构造数组构造数组构造数组构造数组2 2 2 2的地址表的地址表的地址表的地址表 MOV TABLE,OFFSET NUMMOV TABLE,OFFSET NUM MOV TABLE+2,OFFSET CTMOV TABLE+2,OFFSET CT MOV TABLE+4,OFFSET TOTALMOV TABLE+4,OFFSET TOTAL LEA BX,TABLELEA BX,TABLE; ; ; ;传递地址表的首地址传递地址表的首地址传递地址表的首地址传递地址表的首地址 CALL FAR PTR ARY_SU

29、MCALL FAR PTR ARY_SUM; ; ; ;段间调用调用数组求和子程序段间调用调用数组求和子程序段间调用调用数组求和子程序段间调用调用数组求和子程序 RETRETMAIN MAIN ENDPENDPCODE1 CODE1 ENDSENDSCODE2 CODE2 CODE2 CODE2 SEGMENTSEGMENTSEGMENTSEGMENT ASSUME CS:CODE2ASSUME CS:CODE2ASSUME CS:CODE2ASSUME CS:CODE2ARY_SUM ARY_SUM ARY_SUM ARY_SUM PROC FARPROC FARPROC FARPROC F

30、AR; ; ; ;数组求和子程序数组求和子程序数组求和子程序数组求和子程序 PUSH AXPUSH AXPUSH AXPUSH AX; ; ; ;保存寄存器保存寄存器保存寄存器保存寄存器 PUSH CXPUSH CXPUSH CXPUSH CX PUSH SIPUSH SIPUSH SIPUSH SI PUSH DI PUSH DI PUSH DI PUSH DI MOV SI,BXMOV SI,BXMOV SI,BXMOV SI,BX; ; ; ;取数组起始地址取数组起始地址取数组起始地址取数组起始地址 MOV DI,BX+2MOV DI,BX+2MOV DI,BX+2MOV DI,BX+2

31、; ; ; ;取元素个数地址取元素个数地址取元素个数地址取元素个数地址 MOV CX,DIMOV CX,DIMOV CX,DIMOV CX,DI; ; ; ;取元素个数取元素个数取元素个数取元素个数 MOV DI,BX+4MOV DI,BX+4MOV DI,BX+4MOV DI,BX+4; ; ; ;取结果地址取结果地址取结果地址取结果地址 XOR AX,AXXOR AX,AXXOR AX,AXXOR AX,AX; ; ; ;清清清清0 0 0 0累加器累加器累加器累加器NEXT: NEXT: NEXT: NEXT: ADD AX,SIADD AX,SIADD AX,SIADD AX,SI;

32、; ; ;累加和累加和累加和累加和 ADD SI,TYPE ARYADD SI,TYPE ARYADD SI,TYPE ARYADD SI,TYPE ARY; ; ; ;修改地址指针修改地址指针修改地址指针修改地址指针 LOOP NEXTLOOP NEXTLOOP NEXTLOOP NEXT MOV DI,AXMOV DI,AXMOV DI,AXMOV DI,AX; ; ; ;存和存和存和存和 POP DIPOP DIPOP DIPOP DI; ; ; ;恢复寄存器恢复寄存器恢复寄存器恢复寄存器 POP SIPOP SIPOP SIPOP SI POP CXPOP CXPOP CXPOP CX

33、 POP AXPOP AXPOP AXPOP AX RET RET RET RET ARY_SUM ARY_SUM ARY_SUM ARY_SUM ENDPENDPENDPENDPCODE2 CODE2 CODE2 CODE2 ENDSENDSENDSENDS END MAINEND MAINEND MAINEND MAIN6.2.4 6.2.4 通过堆栈传递参数或参数地址通过堆栈传递参数或参数地址这这种种方方式式适适用用于于参参数数较较多多,或或子子程程序序有有多多层层嵌套、递归调用的情况。嵌套、递归调用的情况。步骤:步骤:步骤:步骤:l l主程序把参数或参数地址压入堆栈;主程序把参数或参数

34、地址压入堆栈;主程序把参数或参数地址压入堆栈;主程序把参数或参数地址压入堆栈;l l子程序使用堆栈中的参数或通过栈中参数地址取到参数;子程序使用堆栈中的参数或通过栈中参数地址取到参数;子程序使用堆栈中的参数或通过栈中参数地址取到参数;子程序使用堆栈中的参数或通过栈中参数地址取到参数;l l子程序返回时使用子程序返回时使用子程序返回时使用子程序返回时使用RET nRET nRET nRET n指令调整指令调整指令调整指令调整SPSPSPSP指针,以便删除堆栈中已用过指针,以便删除堆栈中已用过指针,以便删除堆栈中已用过指针,以便删除堆栈中已用过 的参数,保持堆栈平衡,保证程序的正确返回。的参数,保

35、持堆栈平衡,保证程序的正确返回。的参数,保持堆栈平衡,保证程序的正确返回。的参数,保持堆栈平衡,保证程序的正确返回。例例4 4完完成成数数组组求求和和功功能能,求求和和由由子子程程序序实实现,要求通过堆栈传递参数地址。现,要求通过堆栈传递参数地址。STACKSG STACKSG STACKSG STACKSG SEGMENT STACK SEGMENT STACK SEGMENT STACK SEGMENT STACK STKSTKSTKSTK DW 16 DUP(DW 16 DUP(DW 16 DUP(DW 16 DUP(?) ) ) )STACKSG STACKSG STACKSG STA

36、CKSG ENDSENDSENDSENDSDATA DATA DATA DATA SEGMENTSEGMENTSEGMENTSEGMENTARY ARY ARY ARY DW 1,2,3,4,5,6,7,8,9,10DW 1,2,3,4,5,6,7,8,9,10DW 1,2,3,4,5,6,7,8,9,10DW 1,2,3,4,5,6,7,8,9,10COUNT COUNT COUNT COUNT DW ($-ARY)/2DW ($-ARY)/2DW ($-ARY)/2DW ($-ARY)/2SUM SUM SUM SUM DW ?DW ?DW ?DW ?DATA DATA DATA DATA

37、 ENDSENDSENDSENDS程序程序6.66.6CODE1 CODE1 SEGMENTSEGMENTMAIN MAIN PROC FARPROC FAR ASSUME CS:CODE1,DS:DATAASSUME CS:CODE1,DS:DATA PUSH DSPUSH DS; ; XOR AX,AXXOR AX,AX PUSH AXPUSH AX; ; MOV AX,DATAMOV AX,DATA MOV DS,AXMOV DS,AXLEA BX,ARYLEA BX,ARYLEA BX,ARYLEA BX,ARY PUSH BXPUSH BXPUSH BXPUSH BX; ; ; ;压

38、入数组起始地址压入数组起始地址压入数组起始地址压入数组起始地址 LEA BX,COUNTLEA BX,COUNTLEA BX,COUNTLEA BX,COUNT PUSH BXPUSH BXPUSH BXPUSH BX; ; ; ;压入元素个数地址压入元素个数地址压入元素个数地址压入元素个数地址 LEA BX,SUMLEA BX,SUMLEA BX,SUMLEA BX,SUM PUSH BXPUSH BXPUSH BXPUSH BX; ; ; ;压入和地址压入和地址压入和地址压入和地址 CALL FAR PTR ARY_SUMCALL FAR PTR ARY_SUMCALL FAR PTR A

39、RY_SUMCALL FAR PTR ARY_SUM; ; ; ;调用求和子程序调用求和子程序调用求和子程序调用求和子程序 RETRETRETRET; ; ; ;MAIN MAIN MAIN MAIN ENDPENDPENDPENDPCODE1 CODE1 CODE1 CODE1 ENDSENDSENDSENDSCODE2 CODE2 CODE2 CODE2 SEGMENTSEGMENTSEGMENTSEGMENT ASSUME CS:CODE2ASSUME CS:CODE2ASSUME CS:CODE2ASSUME CS:CODE2ARY_SUM ARY_SUM ARY_SUM ARY_SU

40、M PROC FARPROC FARPROC FARPROC FAR; ; ; ;数组求和子程序数组求和子程序数组求和子程序数组求和子程序 PUSH BPPUSH BPPUSH BPPUSH BP; ; ; ;保存保存保存保存BPBPBPBP值值值值 MOV BP,SPMOV BP,SPMOV BP,SPMOV BP,SP;BP;BP;BP;BP是是是是堆栈数据的地址指针堆栈数据的地址指针堆栈数据的地址指针堆栈数据的地址指针 PUSH AXPUSH AXPUSH AXPUSH AX; ; ; ;保存寄存器内容保存寄存器内容保存寄存器内容保存寄存器内容 PUSH CXPUSH CXPUSH CX

41、PUSH CX; ; ; ; PUSH SIPUSH SIPUSH SIPUSH SI; ; ; ; PUSH DIPUSH DIPUSH DIPUSH DI; ; ; ; MOV SI,BP+10MOV SI,BP+10MOV SI,BP+10MOV SI,BP+10; ; ; ;得到数组起始地址得到数组起始地址得到数组起始地址得到数组起始地址 MOV DI,BP+8MOV DI,BP+8MOV DI,BP+8MOV DI,BP+8; ; ; ;得到元素个数地址得到元素个数地址得到元素个数地址得到元素个数地址 MOV CX,DIMOV CX,DIMOV CX,DIMOV CX,DI; ; ;

42、 ;得到元素个数得到元素个数得到元素个数得到元素个数 MOV DI,BP+6MOV DI,BP+6MOV DI,BP+6MOV DI,BP+6; ; ; ;得到和地址得到和地址得到和地址得到和地址 XOR AX,AXXOR AX,AXXOR AX,AXXOR AX,AXNEXT: NEXT: NEXT: NEXT: ADD AX,SIADD AX,SIADD AX,SIADD AX,SI; ; ; ;累加累加累加累加 ADD SI,TYPE ARYADD SI,TYPE ARYADD SI,TYPE ARYADD SI,TYPE ARY; ; ; ;修改地址指针修改地址指针修改地址指针修改地址

43、指针 LOOP NEXTLOOP NEXTLOOP NEXTLOOP NEXT MOV DI,AXMOV DI,AXMOV DI,AXMOV DI,AX; ; ; ;存和存和存和存和 POP DIPOP DIPOP DIPOP DI; ; ; ;恢复寄存器内容恢复寄存器内容恢复寄存器内容恢复寄存器内容 POP SIPOP SIPOP SIPOP SI; ; ; ; POP CXPOP CXPOP CXPOP CX; ; ; ; POP AXPOP AXPOP AXPOP AX; ; ; ; POP BPPOP BPPOP BPPOP BP; ; ; ; RET 6RET 6RET 6RET 6

44、; ; ; ;返回并调整返回并调整返回并调整返回并调整SPSPSPSP指针指针指针指针ARY_SUM ARY_SUM ARY_SUM ARY_SUM ENDPENDPENDPENDPCODE2 CODE2 CODE2 CODE2 ENDSENDSENDSENDS END MAINEND MAINEND MAINEND MAIN例例5 5完完成成数数组组求求和和功功能能,其其中中求求和和由由子子程程序序实实现现,要要求求使使用用结结构构访问堆栈中的参数。访问堆栈中的参数。编码见编码见程序程序6.76.7。程序程序6.76.7STACKSG STACKSG SEGMENT STACK STKSEG

45、MENT STACK STK DW 16 DUP(S)DW 16 DUP(S)STACKSG STACKSG ENDSENDSDATA DATA SEGMENTSEGMENTARY ARY DW 1,2,3,4,5,6,7,8,9,10DW 1,2,3,4,5,6,7,8,9,10COUNT COUNT DW ($-ARY)/2DW ($-ARY)/2SUM SUM DW ?DW ?DATA DATA ENDSENDSCODE1 CODE1 SEGMENTSEGMENTMAIN MAIN PROC FARPROC FAR ASSUME CS:CODE1,DS:DATAASSUME CS:COD

46、E1,DS:DATA PUSH DSPUSH DS XOR AX,AXXOR AX,AX PUSH AXPUSH AX MOV AX,DATAMOV AX,DATA MOV DS,AXMOV DS,AXLEA BX,ARYLEA BX,ARY PUSH BXPUSH BX; ; ; ;压入数组起始地址压入数组起始地址压入数组起始地址压入数组起始地址 LEA BX,COUNTLEA BX,COUNT PUSH BXPUSH BX; ; ; ;压入元素个数地址压入元素个数地址压入元素个数地址压入元素个数地址 LEA BX,SUMLEA BX,SUM PUSH BXPUSH BX; ; ; ;压入和

47、地址压入和地址压入和地址压入和地址 CALL FAR PTR ARY_SUMCALL FAR PTR ARY_SUMRETRETMAIN MAIN ENDPENDPCODE1 CODE1 ENDSENDSCODE2 CODE2 SEGMENTSEGMENT ASSUME CS:CODE2ASSUME CS:CODE2STACK_STRC STACK_STRC STRUCSTRUC; ; ; ;定义结构定义结构定义结构定义结构SAVE_BP SAVE_BP DW ?DW ?SAVE_CS_IP SAVE_CS_IP DW 2 DUP(?)DW 2 DUP(?)SUM_ADDR SUM_ADDR

48、DW ?DW ?COUNT_ADDR COUNT_ADDR DW ?DW ?ARY_ADDR ARY_ADDR DW ?DW ?STACK_STRC STACK_STRC ENDSENDSARY_SUMARY_SUMPROC FARPROC FAR; ; ; ;数组求和子程序数组求和子程序数组求和子程序数组求和子程序 PUSH BPPUSH BP; ; ; ;保存保存保存保存BPBPBPBP值值值值 MOV BP,SPMOV BP,SPPUSH AXPUSH AX PUSH CXPUSH CX PUSH SIPUSH SI PUSH DIPUSH DI MOV SI,BP.ARY_ADDRMO

49、V SI,BP.ARY_ADDR; ; ; ;数组始地址数组始地址数组始地址数组始地址 MOV DI,BP.COUNT_ADDRMOV DI,BP.COUNT_ADDR MOV CX,DIMOV CX,DI MOV DI,BP.SUM_ADDRMOV DI,BP.SUM_ADDR; ; ; ;得到和地址得到和地址得到和地址得到和地址 XOR AX,AXXOR AX,AXNEXT: NEXT: ADD AX,SIADD AX,SI; ; ; ;累加累加累加累加 ADD SI,TYPE ARYADD SI,TYPE ARY; ; ; ;修改地址指针修改地址指针修改地址指针修改地址指针 LOOP N

50、EXTLOOP NEXT MOV DI,AXMOV DI,AX; ; ; ;存和存和存和存和 POP DIPOP DI POP SIPOP SI POP CXPOP CX POP AXPOP AX POP BPPOP BP RET 6RET 6; ; ; ;返回并调整返回并调整返回并调整返回并调整SPSPSPSP指针指针指针指针ARY_SUM ARY_SUM ENDPENDPCODE2 CODE2 ENDSENDS END MAINEND MAIN 以以下下是是求求N N!递递归归过过程程的的描描述述。编编码码见见程程序序6.86.8。2.2.递归子程序递归子程序BEGINBEGINFACT(

51、N,RESULT)FACT(N,RESULT)SAVESAVE REGISTER ON STACKREGISTER ON STACKIF IF N=0N=0RESULT1RESULT1ELSEELSEPUSH ADDRESS OF RESULT ONTO STACKPUSH ADDRESS OF RESULT ONTO STACKPUSH N-1 ONTO STACKPUSH N-1 ONTO STACKCALL FACT(N-1,RESULT)CALL FACT(N-1,RESULT)RESULTN*RESULTRESULTN*RESULTENDIFENDIFRESTORE REGISTER

52、S FROM STACKRESTORE REGISTERS FROM STACKDELETE PARAMETERS FROM STACKDELETE PARAMETERS FROM STACK程序程序6.86.8STACKSG STACKSG SEGMENTSEGMENTSTACK S STACK S ; ; ; ;定义堆栈定义堆栈定义堆栈定义堆栈DW 128 DUP(ST)DW 128 DUP(ST)STACKSG STACKSG ENDSENDSDATA DATA SEGMENTSEGMENTN_VAL N_VAL DWDW3 3; ; ; ;定义定义定义定义N N N N值值值值RESU

53、LT RESULT DWDW? ?; ; ; ;结果结果结果结果DATA DATA ENDSENDSCODE SEGMENTCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSG ASSUME CS:CODE,DS:DATA,SS:STACKSGFRAMEFRAMESTRUCSTRUC; ; ; ;定义帧结构定义帧结构定义帧结构定义帧结构SAV_BPSAV_BPDWDW? ?; ; ; ;保存保存保存保存BPBPBPBP值值值值SAV_CS_IPSAV_CS_IP DW 2 DUP(?)DW 2 DUP(?); ; ; ;保存返回地址保存返回地址保存返回地

54、址保存返回地址N NDWDW? ?; ; ; ;当前当前当前当前N N N N值值值值RESULT_ADDRRESULT_ADDRDWDW? ?; ; ; ;结果地址结果地址结果地址结果地址FRAMEFRAMEENDSENDSMAIN MAIN PROCPROCFARFAR MOVMOVAX,DATAAX,DATA MOVMOVDS,AXDS,AX LEALEABX,RESULTBX,RESULT PUSHPUSHBXBX ; ; ; ;结果地址入栈结果地址入栈结果地址入栈结果地址入栈 PUSHPUSHN_VAL N_VAL ;N;N;N;N值入栈值入栈值入栈值入栈 CALLCALLFARFA

55、RPTRPTRFACTFACT ; ; ; ;调用递归子程序调用递归子程序调用递归子程序调用递归子程序R1:R1:MOVMOVAX,4C00HAX,4C00H INTINT21H21HMAIN MAIN ENDPENDPFACTFACTPROC FARPROC FAR;N;N;N;N!递归子程序递归子程序递归子程序递归子程序 PUSH BPPUSH BP; ; ; ;保存保存保存保存BPBPBPBP值值值值 MOV BP,SPMOV BP,SP;BP;BP;BP;BP指向帧基地址指向帧基地址指向帧基地址指向帧基地址 PUSH BXPUSH BX PUSH AXPUSH AX MOV BX,BP

56、.RESULT_ADDRMOV BX,BP.RESULT_ADDRMOV AX,BP.NMOV AX,BP.N; ; ; ;取帧中取帧中取帧中取帧中N N N N值值值值 CMP AX,0CMP AX,0 JE DONE JE DONE ;N;N;N;N0 0 0 0时退出子程序嵌套时退出子程序嵌套时退出子程序嵌套时退出子程序嵌套 PUSH BXPUSH BX; ; ; ;为下一次调用压入结果地址为下一次调用压入结果地址为下一次调用压入结果地址为下一次调用压入结果地址 DEC AXDEC AX PUSH AXPUSH AX; ; ; ;为下一次调用压入为下一次调用压入为下一次调用压入为下一次调

57、用压入( ( ( (N N N N1)1)1)1)值值值值 CALL FAR PTR FACTCALL FAR PTR FACTR2:R2: MOVMOVBX,BP.RESULT_ADDRBX,BP.RESULT_ADDR MOVMOVAX,BXAX,BX ; ; ; ;取中间结果取中间结果取中间结果取中间结果( ( ( (N N N N1)!1)!1)!1)! MULMULBP.NBP.N ;N* ;N* ;N* ;N*(N N N N1 1 1 1)! ! ! ! JMPJMPSHORT RETURNSHORT RETURNDONE: DONE: MOVMOVAX,1 AX,1 ;0!;0

58、!;0!;0!1 1 1 1RETURN: RETURN: MOVMOVBX,AXBX,AX ; ; ; ;存中间结果存中间结果存中间结果存中间结果 POP AXPOP AX POP BXPOP BX POP BPPOP BP RET 4RET 4FACT FACT ENDPENDPCODE CODE ENDSENDS END MAINEND MAIN程序程序6.86.8的运行情况:的运行情况:主主程程序序把把结结果果地地址址和和N N的的初初始始值值压压入堆栈,然后调用入堆栈,然后调用FACTFACT子程序。子程序。在在FACTFACT中中,它它不不断断调调用用自自身身,每每调调用用一一次次

59、都都要要在在堆堆栈栈中中形形成成一一帧帧,该该帧帧由由以以下下信信息息组组成成:子子程程序序中中要要用用到到的的寄寄存存器器内内容容、中中间间结结果果地地址址、(N N1 1)的的值值、子子程程序返回地址,自身调用直到序返回地址,自身调用直到N N0 0为止。为止。当当N N0 0时开始返回。时开始返回。通通过过 BP.RESULT_ADDRBP.RESULT_ADDR和和 BP.NBP.N取取出出堆堆栈栈中中本本次次使使用用的的参参数数,计计算算N*(N-N*(N-1)!1)!的的值值,保保存存中中间间结结果果,恢恢复复寄寄存存器器的的值值,用用RET RET 4 4返返回回并并废废除除已已

60、用用过过的的N N和和中中间结果地址。间结果地址。重重复复第第步步,逐逐层层返返回回直直到到N N等等于初始值为止。于初始值为止。6.4 6.4 宏宏 指指 令令在高级汇编语言技术中,一段共用语在高级汇编语言技术中,一段共用语句序列除了可以设计成子程序外,还可以句序列除了可以设计成子程序外,还可以设计成宏指令的形式。设计成宏指令的形式。6.4.1 6.4.1 宏定义、宏调用、宏扩展宏定义、宏调用、宏扩展宏宏指指令令是是源源程程序序中中一一段段有有独独立立功功能能的的程程序序代代码码。宏宏指指令令由由宏宏定定义义伪伪指指令令定定义义,它它只只需需在在源源程程序序中中定定义义一一次次,便可以多次被

61、调用。便可以多次被调用。宏指令名宏指令名 MACRO MACRO 形式参数表形式参数表 ; ;宏指令体宏指令体ENDMENDM 宏定义伪指令格式:宏定义伪指令格式:宏调用宏调用宏宏宏宏指指指指令令令令一一一一经经经经定定定定义义义义,就就就就可可可可以以以以在在在在程程程程序序序序中中中中调调调调用用用用它它它它,这这这这被称为宏调用。被称为宏调用。被称为宏调用。被称为宏调用。宏调用格式:宏调用格式:宏指令名宏指令名 实参数表实参数表 宏扩展宏扩展宏宏扩扩展展就就是是用用宏宏定定义义体体替替换换宏宏指指令令名名,并并用用实参数替换形式参数。实参数替换形式参数。例例1 1输入一个字符的宏定义输入

62、一个字符的宏定义、宏调用宏调用、宏扩展宏扩展; ;宏定义宏定义INCHARINCHARMACROMACROMOVMOVAH,1AH,1 INT INT21H21H; ;输入的字符在输入的字符在ALALENDMENDM; ;宏调用宏调用 INCHARINCHAR当当汇汇编编程程序序汇汇编编到到宏宏指指令令INCHARINCHAR时时,则则对对其其扩扩展如下:展如下:1 1 MOVMOV AH,1 AH,11 INT1 INT 21H 21H指指令令前前的的“1”“1”表表示示该该语语句句是是扩扩展展时时替替换得到的。换得到的。 设计宏指令时应注意的问题设计宏指令时应注意的问题由由于于宏宏指指令令

63、也也像像子子程程序序那那样样可可以以被被多多次次调调用用或或被被多多个个程程序序共共享享,所所以以在在设设计计时时需需要要注意以下问题:注意以下问题:1 1宏指令说明宏指令说明 2 2寄存器的保存与恢复寄存器的保存与恢复 3 3宏指令中的符号说明宏指令中的符号说明 6.4.2 6.4.2 LOCALLOCAL伪指令伪指令格式:格式:LOCAL LOCAL 局部符号表局部符号表功功能能:对对局局部部符符号号表表中中的的每每个个符符号号,在在汇汇编编时时每每扩扩展展一一次次便便建建立立一一个个惟惟一一的的符符号号,形形如如?xxxxxxxx(xxxxxxxxxxxxxxxx的的的的值值值值在在在在

64、0000000000000000 FFFFFFFFFFFFFFFF之之之之间间间间)。以以保保证证汇汇编编时时生生成成名名字字的的惟一性。惟一性。例例2 2以下是定义一个延时程序的宏指令以下是定义一个延时程序的宏指令delaydelay, ,并且在同并且在同一个程序中两次被调用的扩展情况。一个程序中两次被调用的扩展情况。; ;宏定义宏定义DELAYDELAYMACROMACROLOCALLOCALLOPLOPMOVMOVCX,2801CX,2801LOP:LOP:LOOPLOOPLOPLOPENDMENDM宏调用:宏调用:DELAYDELAYDELAYDELAY汇编时宏扩展如下:汇编时宏扩展如

65、下: DELAYDELAY0009 B9 0AF10009 B9 0AF11 1 MOV CX,2801 MOV CX,2801 000C E2 FE000C E2 FE1 ?0000: LOOP ?0000 1 ?0000: LOOP ?0000 DELAY DELAY000E B9 0AF1000E B9 0AF11 1 MOV CX,2801 MOV CX,2801 0011 E2 FE0011 E2 FE1 ?0001: LOOP ?0001 1 ?0001: LOOP ?0001 宏指令中参数的使用宏指令中参数的使用在在宏宏定定义义时时可可以以带带有有形形式式参参数数,而而在在宏宏调

66、用时给出调用时给出实参数实参数即可。即可。 宏宏指指令令的的参参数数可可以以是是常常数数、寄寄存存器器、变变量量、表表达达式式、操操作作码码或或操操作作码码的的一一部部分分、指指令或伪指令助记符令或伪指令助记符等。等。例例3 3定义在两个字型内存变量之间传送数据的宏定义在两个字型内存变量之间传送数据的宏指令,并调用它,然后观察其扩展情况。指令,并调用它,然后观察其扩展情况。MOVEMOVEMOCROMOCROX,YX,YPUSHPUSHAXAXMOVMOVAX,XAX,XMOVMOVY,AXY,AXPOPPOPAXAXENDMENDMDATA SEGMENTDATA SEGMENTVAR1 D

67、W 6543HVAR1 DW 6543HVAR2 DWVAR2 DW ?DATA ENDSDATA ENDS ;宏调用宏调用;宏扩展;宏扩展 MOVE VAR1,VAR2 MOVE VAR1,VAR2 1 PUSH1 PUSHAXAX1 MOV AX,VAR11 MOV AX,VAR11 MOV VAR2,AX1 MOV VAR2,AX1 POP AX1 POP AX6.4.3 宏指令嵌套宏指令嵌套宏指令嵌套有两种情况:宏指令嵌套有两种情况:l l宏定义体中含有宏调用宏定义体中含有宏调用; ;l l宏定义体中含有宏定义。宏定义体中含有宏定义。DMACDMACMACROMACROMNAME,OP

68、ERMNAME,OPER; ; ; ;外层宏定义外层宏定义外层宏定义外层宏定义MNAMEMNAMEMACRO X,Y,ZMACRO X,Y,Z; ; ; ;内层宏定义内层宏定义内层宏定义内层宏定义PUSH AXPUSH AXMOV AX,XMOV AX,XOPER AX,YOPER AX,YMOV Z,AXMOV Z,AXPOP AXPOP AXENDMENDMENDMENDM例例4 4宏定义体中嵌套宏定义的宏指令、宏调用及宏扩展示例。宏定义体中嵌套宏定义的宏指令、宏调用及宏扩展示例。A ADWDW2525B BDWDW1212C CDWDW? ?DMAC ADDITION,ADDDMAC A

69、DDITION,ADD; ; ; ;外层宏调用外层宏调用外层宏调用外层宏调用1 1ADDITION MACRO X,Y,ZADDITION MACRO X,Y,Z1 1 PUSH AX PUSH AX1 1 MOV AX,X MOV AX,X1 1 ADD AX,Y ADD AX,Y1 1 MOV Z,AX MOV Z,AX1 1 POP AX POP AX1 1 ENDM ENDMADDITION A,B,CADDITION A,B,C; ; ; ;内层宏调用内层宏调用内层宏调用内层宏调用1 1 PUSH AXPUSH AX1 1 MOV AX,A MOV AX,A1 1 ADD AX,B

70、ADD AX,B1 1 MOV C,AX MOV C,AX1 1 POP AX POP AXDMAC LOGIC_AND,ANDDMAC LOGIC_AND,AND ; ; ; ;外层宏调用外层宏调用外层宏调用外层宏调用1 1LOGIC_AND MACROLOGIC_AND MACROX,Y,ZX,Y,Z1 1 PUSH PUSHAXAX1 1 MOV MOVAX,XAX,X1 1 AND ANDAX,YAX,Y1 1 MOV MOVZ,AXZ,AX1 1 POP POPAXAX1 1 ENDM ENDMLOGIC_AND A,B,CLOGIC_AND A,B,C; ; ; ;内层宏调用内层宏

71、调用内层宏调用内层宏调用1 1 PUSH AXPUSH AX1 1 MOV AX,A MOV AX,A1 1 AND AX,B AND AX,B1 1 MOV C,AX MOV C,AX1 1 POP AX POP AX 使使用用适适当当的的实实参参数数,通通过过调调用用DMACDMAC宏宏指指令令可可以以生生成成另另一一条条新新的的宏宏指指令令,再再调调用用新新宏宏指指令令可可以以实实现现任任何何双双操操作作数数指指令令的的操操作作,而而且且两两个个操操作作数数可可以以同同时时为为存存储储器器操操作作数数。这这种种方方法法使使得得宏的功能更强大。宏的功能更强大。PURGEPURGE伪指令伪指

72、令格式:格式:PURGE PURGE 宏指令名宏指令名,功能:功能:从内存中删除指定的宏指令。从内存中删除指定的宏指令。例:例: PURGE INCHARPURGE INCHAR6.4.4 6.4.4 宏操作符宏操作符这这些些操操作作符符不不仅仅适适用用于于宏宏指指令令,也也适适用用于于重复汇编伪指令。重复汇编伪指令。宏操作符格式宏操作符格式名称名称 & &参数参数文本替换操作符文本替换操作符 文本原样传递操作符文本原样传递操作符 ! !字符字符字符原意操作符字符原意操作符 % %表达式表达式 表达式操作符表达式操作符 ;注释注释 宏注释宏注释 6.4.5 6.4.5 列表伪指令列表伪指令 格

73、式格式 功能功能 . .LALLLALL 在列表文件中列出全部宏文本内容在列表文件中列出全部宏文本内容 (以双分号开头的注释除外)(以双分号开头的注释除外) . .SALLSALL 在列表文件中不显示任何宏文本内容在列表文件中不显示任何宏文本内容 . .XALLXALL (缺省)在列表文件中只列出可产生缺省)在列表文件中只列出可产生 目标代码的宏文本内容目标代码的宏文本内容注注意意:这这些些列列表表伪伪指指令令只只影影响响列列表表文文件件,并并不不影响目标码的生成。影响目标码的生成。6.5 6.5 宏指令库宏指令库为为了了使使宏宏指指令令能能让让多多个个程程序序共共享享,可可以以把把它它们们组

74、组织织到到一一个个文文件件中中,并并存存放放在在磁磁盘盘上上,把把这这种种文文件件称称为宏指令库。为宏指令库。1.1.建立宏指令库建立宏指令库可以把一些常用的宏指令集中在一个文件中形可以把一些常用的宏指令集中在一个文件中形成宏指令库,用成宏指令库,用EDITEDIT等任何文本编辑程序创建宏指令等任何文本编辑程序创建宏指令库,库名由用户自己起,而且对库的扩展名没有特殊库,库名由用户自己起,而且对库的扩展名没有特殊要求。库中的宏指令以源代码形式出现。要求。库中的宏指令以源代码形式出现。 假假设设MACRO.LIBMACRO.LIB中中包包含含以以下下宏宏指指令令(详详细细内内容容见教材见教材P17

75、4P174):):SETMODESETMODE; ;设置设置80802525彩色显示模式彩色显示模式INCHARINCHAR; ;接收一个字符,并返回在接收一个字符,并返回在ALAL中中OUTCHAR XOUTCHAR X; ;输出输出X X字符字符PUSHREG PUSHREG ; ;保存寄存器保存寄存器DXDX、CXCX、BXBX、AXAX、DIDI、SISI、BPBPPOPREG POPREG ; ;恢复寄存器恢复寄存器BPBP、SISI、DIDI、AXAX、BXBX、CXCX、DXDXWINDOW WINDOW MACROMACROCollorCollor, ,WleftTopRowW

76、leftTopRow, ,WLeftTopCulWLeftTopCul, ,WRightBottomRowWRightBottomRow, ,WRightBottomCulWRightBottomCul; ;功能:开窗口功能:开窗口MOVE MOCRO X,YMOVE MOCRO X,Y ; ;字型数据字型数据X X送送Y Y变量变量CLRSCRNCLRSCRN ; ;清屏清屏CURSORCURSOR; ;置光标置光标, ,入口参数入口参数: : DH:DLDH:DL行行, ,列号列号RETURNRETURN ; ;返回操作系统返回操作系统BIN_DECBIN_DECMACROMACROASC

77、,BIN ASC,BIN ; ;功能:把功能:把1616位二进制数转换为十进制数的位二进制数转换为十进制数的; ;ASCIIASCII值值, ,ASCASC为为5 5个字节的十进制数缓冲区个字节的十进制数缓冲区, ,; ;BINBIN为要转换的二进制数。为要转换的二进制数。 DISP MACRO ASCDISP MACRO ASC; ;显示首址为显示首址为ASCASC的字符串的字符串2 2把宏指令库包含到应用程序中把宏指令库包含到应用程序中格式:格式:INCLUDE INCLUDE 源文件名源文件名功能:功能:把另一个源文件包含到当前把另一个源文件包含到当前 源文件中。源文件中。3 3使用宏指

78、令库中的宏指令使用宏指令库中的宏指令 例例9 9实实现现3232位位二二进进制制数数除除以以1616位位二二进进制制数数,并把结果用十进制数形式显示在屏幕上。并把结果用十进制数形式显示在屏幕上。编码见编码见程序程序6.96.9。程序程序6.96.9INCLUDEINCLUDEINCLUDEINCLUDEMACRO.LIBMACRO.LIBMACRO.LIBMACRO.LIBPURGEPURGEPURGEPURGESETMODE,INCHAR,OUTCHAR,SETMODE,INCHAR,OUTCHAR,SETMODE,INCHAR,OUTCHAR,SETMODE,INCHAR,OUTCHAR,

79、WINDOW,MOVE,MULWINDOW,MOVE,MULWINDOW,MOVE,MULWINDOW,MOVE,MULSTACKSGSTACKSGSTACKSGSTACKSGSEGMENTSEGMENTSEGMENTSEGMENTSTACK SSTACK SSTACK SSTACK SDWDWDWDW16161616DUP(?)DUP(?)DUP(?)DUP(?)STACKSGSTACKSGSTACKSGSTACKSGENDSENDSENDSENDSDATADATADATADATASEGMENTSEGMENTSEGMENTSEGMENTA A A ADDDDDDDD7006652700665

80、270066527006652; ; ; ;被除数被除数被除数被除数B B B BDWDWDWDW1234123412341234; ; ; ;除数除数除数除数C C C CDWDWDWDW? ? ? ?; ; ; ;商商商商PROMPTPROMPTPROMPTPROMPTDBDBDBDBThe result is: $The result is: $The result is: $The result is: $ASCIIASCIIASCIIASCIIDBDBDBDB5 5 5 5DUP(?),$DUP(?),$DUP(?),$DUP(?),$; ; ; ;转换结果转换结果转换结果转换结果D

81、ATADATADATADATAENDSENDSENDSENDSCODECODESEGMENTSEGMENTASSUMEASSUMECS:CODE,DS:DATA,SS:STACKSGCS:CODE,DS:DATA,SS:STACKSGMAINMAINPROCPROCFARFARMOVMOVAX,DATAAX,DATAMOVMOVDS,AXDS,AXMOVMOVDX,WORD PTR A+2DX,WORD PTR A+2MOVMOVAX,WORD PTR AAX,WORD PTR ADIVDIVB BBIN_DECBIN_DECASCII,AXASCII,AXCLRSCRNCLRSCRNDISP

82、DISPPROMPTPROMPTDISPDISPASCIIASCIIRETURNRETURNMAINMAINENDPENDPCODECODEENDSENDSENDENDMAINMAIN4. 4. 宏指令与子程序的区别宏指令与子程序的区别采采用用宏宏和和子子程程序序均均能能达达到到代代码码共共享享、简简化化源源程程序序的的目目的的,但但它它们们的的区区别别也也是是显显而而易易见见的的。区区别别主主要要有有以以下下几几点:点:(1 1) 工作方式的区别工作方式的区别(2 2) 参数传递的方便性参数传递的方便性(3 3) 参数的多样性及灵活性参数的多样性及灵活性 通常:通常:l l宏指令被用在代码较

83、短且参数宏指令被用在代码较短且参数 较多的场合;较多的场合;l l子程序被用在代码较长的场合。子程序被用在代码较长的场合。6.6 6.6 重复伪指令重复伪指令当当程程序序中中需需要要重重复复书书写写相相同同或或几几乎乎相相同同的的语语句句时时,可可以以用用重重复复伪伪指指令令定定义义重重复复块块,以以简简化化程程序序和和减减轻轻程程序序设设计计人人员员的的工工作作量量。绝绝大大部部分分MASMMASM版版本本提提供供了了REPTREPT、IRPIRP和和IRPCIRPC重重复复伪伪指指令令,而而在在MASM6.XMASM6.X中中还还提提供供了其它重复伪指令。了其它重复伪指令。6.6.1 6.

84、6.1 重复伪指令重复伪指令REPTREPT格式:格式:REPT REPT 数值表达式数值表达式; ;重复块重复块ENDMENDM功功能能:汇汇编编程程序序使使重重复复块块的的内内容容重重复复多多次,重复次数由表达式给出。次,重复次数由表达式给出。说说明明:重重复复块块中中可可以以出出现现任任何何有有效效的的汇汇编编语语句句,数数值值表表达达式式的的计计算算结结果果应应该该是是无无符符号常数。号常数。DATADATASEGMENTSEGMENTTABLETABLELABELLABELWORDWORDX=5X=5REPT 6REPT 6; ;重复重复6 6次次DW X*X*XDW X*X*X;

85、;定义立方值定义立方值X=X+1X=X+1ENDMENDMDATADATAENDSENDS汇编后的情况如下:汇编后的情况如下:(1) 0000(1) 0000 DATADATA SEGMENT SEGMENT(2) 0000(2) 0000 TABLE TABLELABEL WORDLABEL WORD(3) =0005(3) =0005 X=5 X=5(4)(4) REPT 6 REPT 6(5)(5) DW X*X*X DW X*X*X(6)(6) X=X+1 X=X+1(7)(7) ENDM ENDM (8)0000(8)0000007007D D1 1DWDWX*X*XX*X*X (9

86、)0002 (9)000200D800D81 1DWDWX*X*XX*X*X(10)0004(10)0004015701571 1DWDWX*X*XX*X*X(11)0006(11)0006020002001 1DWDWX*X*XX*X*X(12)0008(12)000802D902D91 1DWDWX*X*XX*X*X(13)000A(13)000A03E803E81 1DWDWX*X*XX*X*X(14)000C(14)000CDATA ENDSDATA ENDS第第( (8)8)到到第第( (13)13)行行是是汇汇编编后后的的情情况况。在在代码段中可以通过代码段中可以通过TABLETA

87、BLE名来引用这些值。名来引用这些值。MOV BX,10MOV BX,10REPT 2REPT 2 DEC BX DEC BXENDMENDM汇编后产生如下语句:汇编后产生如下语句:MOV BX,10MOV BX,101 1DEC BXDEC BX1 1DEC BXDEC BX CHARS CHARSMACROMACRONUMNUMMOVMOVAH,2AH,2CHAR=ACHAR=AREPT REPT NUMNUMMOV DL,CHARMOV DL,CHARINT 21HINT 21HCHAR=CHAR+1CHAR=CHAR+1ENDMENDMENDMENDMCODECODESEGMENTSE

88、GMENTASSUMEASSUMECS:CODECS:CODEMAINMAINPROCPROCFARFARCHARSCHARS2626MOVMOVAX,4C00HAX,4C00HINTINT21H21HMAINMAINENDPENDPCODECODEENDSENDSENDENDMAINMAIN从从本本例例可可以以看看出出,重重复复伪伪指指令令可可以出现在宏指令中。以出现在宏指令中。CHARSCHARSMACROMACRONUMNUMMOVMOVAH,2AH,2CHAR=A CHAR=A REPTREPTNUMNUMMOV DL,CHARMOV DL,CHARINT 21HINT 21HCHAR

89、=CHAR+1CHAR=CHAR+1ENDMENDMENDMENDM00000000CODECODE SEGMENT SEGMENT ASSUME CS:CODE ASSUME CS:CODE00000000MAINMAINPROC FARPROC FAR CHARS 26 CHARS 260000 B4 020000 B4 021 1MOV AH,2MOV AH,20002 B2 410002 B2 412 2MOV DL,CHAR MOV DL,CHAR ; ; ; ;字符字符字符字符A A A A0004 CD 210004 CD 212 2INT 21HINT 21H0006 B2 4

90、20006 B2 422 2MOV DL,CHAR MOV DL,CHAR ; ; ; ;字符字符字符字符B B B B0008 CD 210008 CD 212 2INT 21HINT 21H0066 0066 B2 5AB2 5A2 2MOV DL,CHAR MOV DL,CHAR ; ; ; ;字符字符字符字符Z Z Z Z0068 CD 210068 CD 212 2INT 21HINT 21H006A B8 4C00006A B8 4C00MOV AX,4C00HMOV AX,4C00H006D CD 21006D CD 21INT 21HINT 21H006F006FMAINMAI

91、NENDPENDP006F006FCODECODEENDSENDSENDENDMAINMAIN6.6.2 6.6.2 不定重复伪指令不定重复伪指令1 1IRPIRP伪指令伪指令格式:格式:IRPIRP 形式参数,实参数形式参数,实参数 ; ;重复块重复块ENDMENDM功功能能:汇汇编编程程序序使使重重复复块块的的内内容容重重复复多多次次,重重复复次次数数由由实实参参数数个个数数决决定定。每每次次重重复复都都用用尖尖括括号号中中的的一一个个实实参参数数替替代代形形式式参参数数,依次使用实参数,直到用完为止。依次使用实参数,直到用完为止。例例1 1实参数可以是符号。实参数可以是符号。 IRP R

92、EG,IRP REG, PUSH REG PUSH REG ENDM ENDM汇编后产生以下指令:汇编后产生以下指令: 1 1 PUSHPUSH AX AX 1 1 PUSH PUSH BX BX 1 1 PUSH CX PUSH CX 1 1 PUSH DX PUSH DXIRPIRP X, X, DB X DB X ENDM ENDM汇编后产生的汇编后产生的. .LSTLST文件:文件:0000 010000 011 1 DB 1DB 1; ; ; ;数字数字数字数字0001 020001 021 1 DB 2DB 2; ; ; ;数字数字数字数字0002 080002 081 1 DB

93、3+5DB 3+5; ; ; ;常数表达式常数表达式常数表达式常数表达式0003 45 44 49 54 0003 45 44 49 54 1 1 DB DB EDITEDIT;ASCII;ASCII;ASCII;ASCII值值值值从从目目标标码码部部分分可可以以看看出出,数数字字1 1、2 2生生成成0101、0202,3+53+5计计算算后后其其值值为为8 8, EDITEDIT生生成成相相应应的的ASCIIASCII值值4545、4444、4949、5454。2 2IRPCIRPC伪指令伪指令格式:格式:IRPCIRPC形式参数,数字串形式参数,数字串 ; ;重复块重复块ENDMENDM

94、功功能能:汇汇编编程程序序使使重重复复块块的的内内容容重重复复多多次次,重重复复次次数数由由数数字字串串中中数数字字位位数数决决定定。每每次次重重复复都都用用数数字字串串中中一一个个数数字字替替代代形形参参,依依次使用串中的数字,直到用完为止。次使用串中的数字,直到用完为止。说说明明:重重复复块块中中可可以以出出现现任任何何有有效效的的汇汇编语句。编语句。例例2 2定义一串数字。定义一串数字。IRPCIRPC Z,1235 Z,1235 DB Z DB Z ENDM ENDM汇编后生成的汇编后生成的. .LSTLST文件如下:文件如下:0001 010001 01 1 1DBDB1 10002

95、 020002 02 1 1DBDB2 20003 030003 03 1 1DBDB3 30004 050004 05 1 1DBDB5 5 可可以以看看出出,目目标标代代码码列列生生成成数数字字0101、0202、0303、0505。注注意意形形参参的的位位置置只只能能是是数数字字串串,若若为为字字符符串串则则其中的字符必须是符号其中的字符必须是符号,否则汇编出错。否则汇编出错。IRPCIRPC K,ABCD K,ABCD PUSH PUSHK&XK&X ENDM ENDM 汇编后生成的汇编后生成的. .LSTLST文件如下:文件如下:0000 500000 50 1 1PUSH AXPU

96、SH AX0001 530001 53 1 1PUSH BXPUSH BX0002 510002 51 1 1PUSH CXPUSH CX0003 520003 52 1 1PUSH DXPUSH DX6.7 6.7 条件伪指令条件伪指令一般一般格式:格式:IFxx IFxx 自变量自变量 ELSEELSE ENDMENDM注注意意:自自变变量量必必须须在在汇汇编编程程序序第第一一遍遍扫扫描后成为确定的数值。描后成为确定的数值。条件伪指令格式条件伪指令格式功功 能能IF IF 表达式表达式若汇编程序求出的表达式值非零,条件为真若汇编程序求出的表达式值非零,条件为真IFE IFE 表达式表达式若

97、汇编程序求出的表达式值为零,条件为真若汇编程序求出的表达式值为零,条件为真IFB IFB 若自变量为空,条件为真若自变量为空,条件为真IFNB IFNB 若自变量非空,条件为真若自变量非空,条件为真IFDEF IFDEF 符号符号若符号在程序中有定义或已用若符号在程序中有定义或已用EXTRNEXTRN伪指令伪指令说明,条件为真说明,条件为真IFNDEF IFNDEF 符号符号若符号在程序中无定义或未用若符号在程序中无定义或未用EXTRNEXTRN伪指令伪指令说明,条件为真说明,条件为真IFDIF IFDIF 1, 2若字符串若字符串1 1和字符串和字符串2 2不相等,条件为真不相等,条件为真I

98、FDIFI IFDIFI 1, 2若字符串若字符串1 1和字符串和字符串2 2忽略大小写时不相等,忽略大小写时不相等,条件为真条件为真IFIDN IFIDN 1, 2若字符串若字符串1 1和字符串和字符串2 2相等,条件为真相等,条件为真IFIDNI IFIDNI 1, 2若字符串若字符串1 1和字符串和字符串2 2忽略大小写时相等,忽略大小写时相等,条件为真条件为真 条件伪指令条件伪指令后后四四条条伪伪指指令令IFxxxIFxxx和和IFxxxI IFxxxI 的的区区别别是是:IFxxxIIFxxxI 在比较字符时忽略大小写。在比较字符时忽略大小写。 ALL_LT_50ALL_LT_50A

99、LL_LT_50ALL_LT_50MACRO LENTHMACRO LENTHMACRO LENTHMACRO LENTHVALUE=0VALUE=0VALUE=0VALUE=0IFIFIFIFLNGTH GE 50LNGTH GE 50LNGTH GE 50LNGTH GE 50EXITMEXITMEXITMEXITMENDIFENDIFENDIFENDIFREPTREPTREPTREPTLNGTHLNGTHLNGTHLNGTHVALUE=VALUE+1VALUE=VALUE+1VALUE=VALUE+1VALUE=VALUE+1DB VALUEDB VALUEDB VALUEDB VALU

100、EENDMENDMENDMENDMENDMENDMENDMENDM这这个个宏宏定定义义仅仅当当LNGTHLNGTH小小于于5050时时才才分分配配表表空空间间。在在宏宏扩扩展展过过程程中中, ,若若汇汇编编程程序序遇遇到到EXITMEXITM,则则终止宏扩展终止宏扩展, ,并在并在ENDMENDM伪指令后重新开始。伪指令后重新开始。.386.386PROCESSOR = 80386 PROCESSOR = 80386 IF PROCESSOR EQ 80386IF PROCESSOR EQ 80386 SHL AX,4 SHL AX,4 ELSE ELSE MOV CL,4 MOV CL,4

101、SHL AX,CL SHL AX,CL ENDIFENDIF汇编生成的列表文件如下:汇编生成的列表文件如下:.386 .386 =00013=00013A02A02PROCESSOR=80386PROCESSOR=80386IF PROCESSOR EQ 80386 IF PROCESSOR EQ 80386 0000 66| C1 E0 040000 66| C1 E0 04SHL AX,4 SHL AX,4 ENDIF ENDIFDISPLAYDISPLAYDISPLAYDISPLAYMACROMACROMACROMACROFUNCTION,ADDRESS,CHARFUNCTION,ADD

102、RESS,CHARFUNCTION,ADDRESS,CHARFUNCTION,ADDRESS,CHARMOVMOVMOVMOVAH,FUNCTIONAH,FUNCTIONAH,FUNCTIONAH,FUNCTIONIFBIFBIFBIFBMOVMOVMOVMOVDL,&CHARDL,&CHARDL,&CHARDL,&CHARELSEELSEELSEELSELEALEALEALEADX,ADDRESSDX,ADDRESSDX,ADDRESSDX,ADDRESSENDIFENDIFENDIFENDIFINT 21HINT 21HINT 21HINT 21HENDMENDMENDMENDM CODE

103、CODECODECODE SEGMENT SEGMENT SEGMENT SEGMENT MAIN MAIN MAIN MAIN PROC PROC PROC PROC FAR FAR FAR FAR ASSUME ASSUME ASSUME ASSUME CS:CODE,DS:CODE CS:CODE,DS:CODE CS:CODE,DS:CODE CS:CODE,DS:CODE MOV MOV MOV MOV AX,CODE AX,CODE AX,CODE AX,CODE MOV MOV MOV MOV DS,AX DS,AX DS,AX DS,AX DISPLAY 9,OP3 DISPL

104、AY 9,OP3 DISPLAY 9,OP3 DISPLAY 9,OP3 ; ; ; ;参数参数参数参数2 2 2 2不空不空不空不空, , , ,调用调用调用调用21212121H H H H中断中断中断中断9 9 9 9号功能号功能号功能号功能 DISPLAYDISPLAYDISPLAYDISPLAY 2,E 2,E 2,E 2,E ; ; ; ;参数参数参数参数2 2 2 2为空为空为空为空, , , ,调用调用调用调用21212121H H H H中断中断中断中断2 2 2 2号功能号功能号功能号功能 MOVMOVMOVMOV AX,4C00H AX,4C00H AX,4C00H AX

105、,4C00H INT INT INT INT 21H 21H 21H 21H OP3 OP3 OP3 OP3 DB DB DB DB ABC$ ABC$ ABC$ ABC$ MAIN MAIN MAIN MAIN ENDP ENDP ENDP ENDP CODE ENDS CODE ENDS CODE ENDS CODE ENDS END END END END MAIN MAIN MAIN MAINIDTIDTIDTIDTMACRO OPDMACRO OPDMACRO OPDMACRO OPD ; ; ; ;定义宏定义宏定义宏定义宏IFIDNIFIDNIFIDNIFIDN,ADD AX,1A

106、DD AX,1ADD AX,1ADD AX,1 ;1 ;1 ;1 ;1若若若若 OPDOPDOPD则汇编则汇编则汇编则汇编ENDIFENDIFENDIFENDIFIFIDNIIFIDNIIFIDNIIFIDNI,ADD AX,2ADD AX,2ADD AX,2ADD AX,2 ;2 ;2 ;2 ;2忽略大小写时忽略大小写时忽略大小写时忽略大小写时 ; ; ; ;若若若若 OPDOPDOPD则汇编则汇编则汇编则汇编ENDIFENDIFENDIFENDIFIFDIFIFDIF,ADD AX,3ADD AX,3 ;3 ;3 若若 OPD则汇编则汇编ENDIFENDIFIFDIFIIFDIFI,ADD AX,4ADD AX,4 ;4 ;4 忽略大小写时忽略大小写时 ; ;若若 OPD则汇编则汇编ENDIFENDIFENDMENDM

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号