好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

汇编语言源程序的框架结构.ppt

67页
  • 卖家[上传人]:博****1
  • 文档编号:576780859
  • 上传时间:2024-08-20
  • 文档格式:PPT
  • 文档大小:475.47KB
  • / 67 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • §5.1   汇编语言源程序的框架结构汇编语言源程序的框架结构     编编制制汇汇编编语语言言源源程程序序时时,,首首先先要要使使用用段段定定义义伪伪指指令令和和段段寻寻址址伪伪指指令令来来构构造造一一个个由由若若干干指指令令和和数数据据组组成成的的程序构造一个源程序的框架结构有如下两种格式:程序构造一个源程序的框架结构有如下两种格式:第一种格式:第一种格式:……MOVAH,4CH    ;返回;返回DOSINT21HCODEENDSENDBEGIN第第5 5章章 8086/8088 8086/8088汇编语言程序设计汇编语言程序设计 第二种格式:第二种格式:……RET;取程序段前缀首地址;取程序段前缀首地址MAINENDPCODEENDSENDBEGIN区别:两种格式的本质区别在于返回区别:两种格式的本质区别在于返回DOS的方法不同:的方法不同:对对于于第第一一种种格格式式,,采采用用了了调调用用DOS系系统统的的4CH功功能能,,返返回回DOS具具体方法是:在要返回体方法是:在要返回DOS处,安排如下两条指令:处,安排如下两条指令:MOVAH,4CHINT21H对于第二格式,对于第二格式,DOS返回方法是调用返回方法是调用20H类型的中断服务程序。

      类型的中断服务程序 §5.2  顺序结构程序设计顺序结构程序设计       顺序程序结构是指完全按照顺序逐条执行的顺序程序结构是指完全按照顺序逐条执行的指令序列,这种结构的流程图除了有一个开始框指令序列,这种结构的流程图除了有一个开始框和结束框外,就是若干处理框,没有判断框,如和结束框外,就是若干处理框,没有判断框,如图图5.1所示图图5.1 顺序程序的结构形式顺序程序的结构形式 例例5.1::试分别用汇编语言源程序的两种框架结构编制程序,求出表达试分别用汇编语言源程序的两种框架结构编制程序,求出表达式:式:(X×4--Y))/2的值,并保存到的值,并保存到RESULT存储单元中,其中存储单元中,其中X,,Y均为字节变量均为字节变量解:完成该功能的流程图解:完成该功能的流程图如图如图5.2所示:所示:图图5.2  例例5.1的功能实现流程图的功能实现流程图  参考程序参考程序1:DATASEGMENT;数据段;数据段XDB2YDB4ZDB?;定义变量;定义变量DATAENDSSTACK SEGMENT  PARA STACKDW20HDUP((0))STACK ENDSCODESEGMENT;代码段;代码段ASSUME  CS:CODE,DS:DATA,SS:STACK BEGIN::MOVAX,,DATAMOVDS,,AX;;DS赋初值赋初值MOVAL,,X;;AL←XMOVCL,,2SALAL,,CL;;AL←X×4SUBAL,,Y;;AL←X×4--YSARAL,,1;;AL←(X×4--Y)/2MOVZ,,AL;存结果;存结果MOVAH,,4CH;返回;返回DOSINT21HCODEENDSENDBEGIN 参考程序参考程序2:DATASEGMENTXDB2YDB4ZDB?DATAENDSSTACK SEGMENTPARASTACKDW20HDUP((0))STACK ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKPROC1 PROCFAR;使;使RET为远返回为远返回ENDBEGIN BEGIN: PUSHDS;入栈保存地址;入栈保存地址MOVAX,,0;程序段前缀的首地址;程序段前缀的首地址PUSHAXMOVAX,,DATAMOVDS,,AXMOVAL,,X;;AL←XMOVCL,,2SALAL,,CL;;AL←X×4SUBAL,,Y;;AL←X×4--YSARAL,,1;;AL←(X×4--Y)/2MOVZ,,AL;存结果;存结果RET;取程序段前缀首地址;取程序段前缀首地址 PROC1 ENDPCODE ENDS§5.3  分支结构程序设计分支结构程序设计       分支程序结构可以有两种形式,如图分支程序结构可以有两种形式,如图5.4所示,它们分所示,它们分别相当于高级语言程序中的别相当于高级语言程序中的IF-THEN-ELSE语句和语句和CASE语句,它们适用于要根据不同条件做不同处理的情况。

      语句,它们适用于要根据不同条件做不同处理的情况 §5.3.1  用比较用比较/测试的方法实现测试的方法实现IF-THEN-ELSE结构结构     实现方法:在产生分支之前,通常用比较、测试的办实现方法:在产生分支之前,通常用比较、测试的办法在标志寄存器中设置相应的标志位,然后再选用适当法在标志寄存器中设置相应的标志位,然后再选用适当的条件转移指令,以实现不同情况的分支转移的条件转移指令,以实现不同情况的分支转移1)进行比较,使用比较指令:)进行比较,使用比较指令:CMPDEST,,SRC该指令进行减法操作,而不保存结果,只设置标志位该指令进行减法操作,而不保存结果,只设置标志位2)进行测试,使用测试指令)进行测试,使用测试指令TESTDEST,,SRC该指令进行逻辑与操作,而不保存结果,只设置标志位该指令进行逻辑与操作,而不保存结果,只设置标志位 §5.3.2  用地址表法实现用地址表法实现CASE结构(即多路分支)结构(即多路分支)        用地址表法实现用地址表法实现CASE结构的基本思路是:将各结构的基本思路是:将各分支程序的入口地址依次罗列形成一个地址表,让分支程序的入口地址依次罗列形成一个地址表,让BX指向地址表的首地址,从键盘接收或其他方式获指向地址表的首地址,从键盘接收或其他方式获取要转到的分支号,再让取要转到的分支号,再让BX与分支号进行运算,使与分支号进行运算,使BX指向对应分支入口地址,最后即可使用指向对应分支入口地址,最后即可使用JMP  WORD  PTR  [BX] 或或JMP  DWORD  PTR  [BX] 指指令实现所要转到的分支;程序设计流程图如令实现所要转到的分支;程序设计流程图如图图5.6所所示:示: 图图5.6 用地址表法实现多路分支的结构框图用地址表法实现多路分支的结构框图 例例5.4:编程实现菜单选择,根据不同的选择做不同的事情。

      编程实现菜单选择,根据不同的选择做不同的事情 解:假设有解:假设有3路分支,在地址表中的入口地址分别:路分支,在地址表中的入口地址分别:A0、、A1、、A2;具体见图;具体见图5.7所示:所示: 参考程序:参考程序:DATASEGMENTMENUDB0DH,0AH,"0:Chinese!"DB0DH,0AH,"1:English!"DB0DH,0AH,"2: German!"DB0DH,0AH,"Please  choose  one  to  answer  the  following question:$"ERDB  0DH,0AH,"I am sorry,you choose the mistake!$" S0DB0DH,0AH,"OK,Please answer in  Chinese!$"S1DB0DH,0AH,"OK,Please answer in  English!$"S2DB0DH,0AH,"OK,Please answer in  German!$"TABDWA0,A1,A2;地址表;地址表DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART: MOVAX,DATAMOVDS,AXLEADX,MENU;显示菜单;显示菜单MOVAH,9INT21H MOVAH,1;;1号号DOS功能调用,接收分支号功能调用,接收分支号INT21HCMPAL,'0';进行合法判断;进行合法判断JBERRORCMPAL,'2'JAERRORLEABX,TAB;取地址表首址;取地址表首址SUBAL,30HSHLAL,1;段内转移乘以;段内转移乘以2,段间转移乘以,段间转移乘以4XORAH,AH;;AH清零清零ADDBX,AXJMPWORD  PTR  [BX];产生多分支转移;产生多分支转移  A0:LEADX,S0;各分支程序段;各分支程序段MOVAH,9INT21HJMPEXIT1A1:LEADX,S1MOVAH,9INT21HJMPEXIT1A2:LEADX,S2MOVAH,9INT21HJMPEXIT1 ERROR:MOVDX,OFFSET  ERMOVAH,9INT21HEXIT1: MOVAH,4CH;返回;返回DOSINT21HCODEENDSENDSTART§5.3.3  用转移表法实现用转移表法实现CASE结构(即多路分支)结构(即多路分支)      用转移表法实现用转移表法实现CASE结构的基本思路:将转到各分支程序的转结构的基本思路:将转到各分支程序的转移指令依次罗列形成一个转移表,让移指令依次罗列形成一个转移表,让BX指向转移表的首地址,从键指向转移表的首地址,从键盘接收或其他方式获取要转到的分支号,再让盘接收或其他方式获取要转到的分支号,再让BX与分支号进行运算,与分支号进行运算,使使BX指向对应转移表中转到该分支的转移指令处,最后即可使用指向对应转移表中转到该分支的转移指令处,最后即可使用JMP  BX指令实现所要转到的分支;具体见指令实现所要转到的分支;具体见图图5.8所示:所示: 图图5.8  用转移表法实现多路分支的结构框图用转移表法实现多路分支的结构框图例例5.5:编程实现菜单选择,根据不同的选择做不同的事情。

      编程实现菜单选择,根据不同的选择做不同的事情解解::假假设设有有3路路分分支支,,转转移移表表中中的的转转移移指指令令分分别别为为::JMP  SHORT  A0、、JMP  SHORT  A1、、JMP  SHORT  A2;具体见;具体见图图5.9所示:所示: 参考程序:参考程序:DATASEGMENTMENUDB0DH,0AH,"0:Chinese!"DB0DH,0AH,"1:English!"DB0DH,0AH,"2: German!"DB0DH,0AH,"Please  choose  one  to  answer  the  following question:$" ER DB  0DH,0AH,"I am sorry,you shoose the mistake!$"S0DB0DH,0AH,"OK,Please answer in  Chinese!$"S1DB0DH,0AH,"OK,Please answer in  English!$"S2DB0DH,0AH,"OK,Please answer in  German!$"DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART: MOVAX,DATAMOVDS,AXLEADX,MENU;显示菜单;显示菜单MOVAH,9INT21H MOVAH,1;;1号号DOS功能调用,接收分支号功能调用,接收分支号INT21HCMPAL,'0'JBERRORCMPAL,'2'JAERRORLEABX,TAB ;取地址表首址;取地址表首址SUBAL,30HSHLAL,1;短转移乘以;短转移乘以2,近转移乘以,近转移乘以3,远转移乘以,远转移乘以5XORAH,AH;;AH清零清零ADDBX,AX JMPBX;产生多分支转移;产生多分支转移TAB:JMPSHORT A0;转移表;转移表JMPSHORT A1JMPSHORT A2A0:LEADX,S0;各分支程序段;各分支程序段MOVAH,9INT21HJMPEXIT1A1:LEADX,S1MOVAH,9INT21H JMPEXIT1A2:LEA DX,S2MOVAH,9INT21HJMPEXIT1ERROR:MOVDX,OFFSET  ERMOVAH,9INT21HEXIT1: MOVAH,4CH;返回;返回DOSINT21HCODEENDSENDSTART §5.4  循环结构程序设计循环结构程序设计 §5.4.1  循环程序的组成循环程序的组成1.设置循环的初始状态设置循环的初始状态如置如置循环次数的计数值,以及为循环体正常工作的初始状态等;循环次数的计数值,以及为循环体正常工作的初始状态等;2.循环体循环体      这这是是循循环环的的工工作作主主体体,,它它由由循循环环的的工工作作部部分分及及修修改改部部分分组组成成。

      3.循环控制部分循环控制部分 它是循环程序设计的关键,每一个循环程序必须选择一个循环它是循环程序设计的关键,每一个循环程序必须选择一个循环控制条件来控制循环的运行和结束控制条件来控制循环的运行和结束,通常有两种方法控制循环:用通常有两种方法控制循环:用计数控制循环计数控制循环,用条件控制循环用条件控制循环 §5.4.2  循环程序的结构形式循环程序的结构形式      循循环环程程序序有有两两种种结结构构,,一一种种是是DO-WHILE结结构构形形式式,,另一种是另一种是DO-UNTIL结构结构形式具体见图形式具体见图5.10所示:所示:     DO-WHILE结结构构把把对对循循环环控控制制条条件件的的判判断断放放在在循循环环的的入入口,先判断条件,满足条件就执行循环体,否则退出循环口,先判断条件,满足条件就执行循环体,否则退出循环     DO-UNTIL结结构构是是先先执执行行循循环环体体然然后后再再判判断断控控制制条条件件,,不不满满足足条条件件则则继继续续执执行行循循环环操操作作,,一一旦旦满满足足条条件件则则退退出出循循环环一一般般讲讲,,如如果果循循环环次次数数等等于于0的的可可能能,,则则应应选选择择DO-WHILE结构,否则用结构,否则用DO-UNTIL结构。

      结构图图5.10 循环程序的结构形式循环程序的结构形式 §5.4.3  循环控制的方法循环控制的方法 1.用计数控制循环用计数控制循环      这这种种方方法法直直观观、、方方便便,,易易于于程程序序设设计计只只要要在在编编制制程程序序时时,,循循环环次次数数已已知知,,就就可可以以使使用用这这种种方方法法设设计计循循环环程程序序然然而而更更多多的的循循环环程程序序,,在在编编制制程程序序时时并并不不能能确确切切知知道道循循环环次次数数,,但但是是知知道道循循环次数是前面运算或操作的结果或者被存放在某内存单元中环次数是前面运算或操作的结果或者被存放在某内存单元中例例5.6::试编制程序统计字节变量试编制程序统计字节变量VAR中中1的个数,并将它的个数,并将它存入存入COUNT单元中 解解::要要测测试试出出VAR中中1的的个个数数就就应应该该逐逐位位进进行行测测试试,,可可根根据据最最低低位位是是否否为为1来来计计数数,,然然后后用用移移位位的的办办法法把把各各位位数数逐逐次次移移到到最最低低位位去去,,共需要测试共需要测试8次程序流程如次程序流程如图图5.11所示:所示: 图图5.11 例例5.6的功能实现流程图的功能实现流程图 参考程序:参考程序:DATASEGMENTVARDB  37HCOUNT DB  ?DATAENDSCODESEGMENTASSUME   CS:CODE,DS:DATABEGIN: MOVAX,DATAMOV  DS,AXMOVAL,VAR;;AL←VAR的值的值MOVCX,8;赋循环初值;赋循环初值XORBL,BL;赋计数器初值;赋计数器初值 LL:TESTAL,1;测试;测试AL的最低位的最低位JZLL1;最低位为;最低位为0转转LL1INCBL;计数器加;计数器加1LL1:SHRAL,1;逻辑右移;逻辑右移1位位LOOPLL;循环控制;循环控制MOVCOUNT,BL;;COUNT←计数器计数器BL的值的值MOVAH,4CH;返回;返回DOSINT21HCODEENDSENDBEGIN 2.用条件控制循环用条件控制循环     例例5.8::将正整数将正整数NUM插入到一个从小到大排列好顺序的正整数插入到一个从小到大排列好顺序的正整数字节数组序列中。

      字节数组序列中 分分析析::假假设设该该数数组组的的首首地地址址和和末末地地址址分分别别为为ARRAY_HEAD、、ARRAY_END,,显显然然在在这这里里需需要要插插入入的的是是一一个个数数,,所所以以不不一一定定要要扫扫描描整整个个数数组组同同时时为为了了插插入入这这个个数数据据,,必必须须要要空空出出位位置置,,即即凡凡是是比比它它大大的的数数据据都都应应该该向向地地址址增增大大的的方方向向移移动动一一个个字字节节,,故故应应该该从从数数组组的的尾尾部部向向头头部部查查找找,,可可逐逐字字节节取取出出比比较较值值得得注注意意的的是是,,应应该该考考虑虑正正整整数数NUM大大于于或或小小于于数数组组中中的的所所有有数数的的可可能能,,即即如如果果NUM大大于于数数组组中中所所有有数数,,则则第第一一次次比比较较就就可可以以结结束束查查找找;;如如果果NUM小小于于数数组组中中所所有有数数,,则则必必须须及及时时结结束束查查找找,,绝绝对对不不允允许许查查找找的的范范围围超超出出数数组组的的首首地地址址,,当当然然可可以以把把数数组组的的首首地地址址或或循循环环次次数数作作为为结结束束查查找找的的条条件件。

      根根据据上上述述分分析析,,可可以以得得出程序流程如出程序流程如图图5.13所示:所示: 图图5.13 例例5.8的功能实现流程图的功能实现流程图 参考程序:参考程序:NUMEQU36HDATASEGMENTARRAY DB12H,24H,48H,60H,72H,84HYDB?DATAENDSCODESEGMENTASSUME   CS:CODE,DS:DATABEGIN: MOVAX,DATAMOVDS,AXMOVCX,Y-ARRAY;循环次数初始化;循环次数初始化MOVAL,NUM;插入值送;插入值送AL LEASI,YDECSI    ;取得;取得ARRAY的最后元素的偏移地址的最后元素的偏移地址LOP:CMPARRAY[SI],AL;比较;比较JLEINSERTMOVAH,ARRAY[SI]MOVARRAY[SI+1],AH;数据交换;数据交换DECSI;修改偏移地址;修改偏移地址LOOPLOPINSERT:MOVARRAY[SI+1],AL;插入数据;插入数据MOVAH,4CH INT21HCODE  ENDS                ENDBEGIN§5.5  子程序设计子程序设计       §5.5.1  子程序的构造子程序的构造前前面面我我们们学学习习了了过过程程定定义义伪伪指指令令,,我我们们也也就就是是用用它它们们来来构构成成的的子子程程序序,,其格式为:其格式为:子程序名子程序名PROC((NEAR/FAR))保存信息保存信息……恢复信息恢复信息RET子程序名子程序名ENDP §5.5.2  子程序的调用与返回子程序的调用与返回     子子程程序序的的正正确确执执行行是是由由子子程程序序的的正正确确调调用用和和返返回回保保证证的的。

      IBM  PC机机的的CALL和和RET指指令令就就分分别别完完成成了了子子程程序序的的调调用用和返回功能和返回功能1.调用指令:调用指令:CALL   过程名过程名      执执行行CALL指指令令,,首首先先保保留留断断点点地地址址于于堆堆栈栈中中,,然然后后转转移到目标单元,它对移到目标单元,它对PSW无影响2.返回指令:返回指令:RET 一个子程序执行的最后一条指令必定是返回指令一个子程序执行的最后一条指令必定是返回指令RET,,用以返回到调用子程序的断点处但在位置上并不一定就用以返回到调用子程序的断点处但在位置上并不一定就是是最后一条指令它的位置灵活,并不是必须要在最后是是最后一条指令它的位置灵活,并不是必须要在最后只是习惯上我们通常将它置于子程序的最后只是习惯上我们通常将它置于子程序的最后 §5.5.3  编制子程序的要求编制子程序的要求1.子程序必须具有通用性子程序必须具有通用性2.注意保存信息和恢复信息注意保存信息和恢复信息      要要注注意意最最先先压压入入堆堆栈栈的的应应该该最最后后弹弹出出来来,,值值得得注注意意的的是是::必必须须搞搞清清楚楚那那些些寄寄存存器器是是必必须须保保存存的的,,那那些些又又是是不不必必要要或或不不应应该该保保存存的的。

      一一般般来来说说,,子子程程序序中中用用到到的的寄寄存存器器是是应应该该保保存存的的,,但但是是如如果果主主程程序序和和子子程程序序之之间间使使用用寄寄存存器器传传递递参参数数的的话话,,该该寄寄存存器器则则不不一一定定需需要要保保存存,,特特别别是是用用来来向向主主程程序序回回送送结结果果((即即出出口口参参数数))的的寄寄存存器器,,则则更更不不应应该该因因保保存存和和恢恢复复该该寄寄存存器的内容而破坏了应该向主程序传送的信息器的内容而破坏了应该向主程序传送的信息3.选用适当的方法在子程序和主程序之间的进行参数传递选用适当的方法在子程序和主程序之间的进行参数传递   这这种种主主程程序序与与子子程程序序之之间间的的信信息息传传送送称称为为参参数数传传递递,,它它可可以有以下三种:以有以下三种:①① 用寄存器传递参数用寄存器传递参数      这这是是最最常常用用的的一一种种方方式式,,通通常常在在参参量量不不多多的的时时候候使使用用这这种方法②② 用地址表传递参数用地址表传递参数     通通过过地地址址表表传传送送参参数数的的方方法法是是在在主主程程序序中中首首先先建建立立一一个个地地址址表表,,把把要要传传送送给给子子程程序序的的参参数数都都存存放放在在地地址址表表中中,,然然后后把把地地址址表表的的首首地地址址通通过过寄寄存存器器传传送送到到子子程程序序中中去去;;最最后后子程序通过地址表取得所需参数。

      子程序通过地址表取得所需参数 ③③ 用堆栈传递参数用堆栈传递参数 这这种种方方法法是是在在主主程程序序中中把把要要传传送送给给子子程程序序的的参参数数先先保保存存到到堆堆栈栈中中,,然然后后子子程程序序再再从从堆堆栈栈中中取取出出参参数数以以达达到到传传送送参参数的目的数的目的 §5.6  高级汇编语言技术高级汇编语言技术      §5.6.1  宏汇编宏汇编1.宏定义.宏定义宏在使用前必须先进行宏定义宏定义格式为:宏在使用前必须先进行宏定义宏定义格式为:宏指令名宏指令名MACRO形式参数,形式参数,形式参数,形式参数,…<宏体><宏体>ENDM其其中中,,宏宏指指令令名名::宏宏定定义义的的名名字字((即即给给宏宏体体中中程程序序段段指指定定一一个个符符号号名名)),,不不可可缺缺省省,,宏宏调调用用时时要要使使用用它它,,第第一一个个符符号号必必须须是是字字母母,,其后可以是字母或数字其后可以是字母或数字 MACRO…ENDM::宏宏定定义义伪伪指指令令助助记记符符,,不不可可缺缺省省它它们们成成对对出出现,表示宏定义的开始和结束,现,表示宏定义的开始和结束,ENDM前不带宏指令名。

      前不带宏指令名宏体:一段有独立功能的程序代码段宏体:一段有独立功能的程序代码段形式参数:又称哑元,各个哑元之间用逗号隔开,可以缺省形式参数:又称哑元,各个哑元之间用逗号隔开,可以缺省2.宏调用.宏调用经宏定义后的宏指令可以在源程序中调用,宏调用格式为:经宏定义后的宏指令可以在源程序中调用,宏调用格式为:宏指令名宏指令名实参,实参实参,实参…      宏宏调调用用只只需需要要有有宏宏指指令令名名,,若若宏宏定定义义中中有有形形参参,,那那么么宏宏调调用用时时必必须须带带有有实实际际参参数数来来替替代代形形参参,,实实际际参参数数的的个个数数,,顺顺序序,,类类型型与与形形参参一一一一对对应应,,各各个个实实参参之之间间用用逗逗号号分分开开原原则则上上实实参参的的个个数数与与形形参参的的个个数数相相等等,,但但汇汇编编程程序序不不要要求求它它们们必必须须相相等等,,若若实实参参个个数数大大于于形形参参个个数数,,则则多多余余的的实实参参不不予予考考虑虑,,若若实实参参个个数数小小于于形形参参个个数数,,则则多多余余的的形形参参作作“空空”处理  3.宏展开.宏展开      汇汇编编程程序序在在对对源源程程序序汇汇编编时时,,对对每每个个宏宏调调用用作作宏宏展展开开,每条插入的宏体指令前带上加号每条插入的宏体指令前带上加号“+”。

      例例5.11::不带参数的宏定义,用宏指令来实现回车换行不带参数的宏定义,用宏指令来实现回车换行宏定义:宏定义:CRLFMACROMOVDL,0DH;回车回车MOVAH,2INT21HMOVDL,0AH;换行换行MOVAH,2 INT21HENDM宏调用:宏调用:CRLF宏展开:将下述程序段替换宏调用语句宏展开:将下述程序段替换宏调用语句++MOV DL,0DH;回车回车++MOV AH,2++INT21H++MOV DL,0AH;换行换行++MOV AH,2++INT21H 4.宏调用中参数传递宏调用中参数传递     宏宏定定义义中中的的参参数数可可以以有有多多个个,,实实参参可可以以是是数数字字,,寄寄存存器器或或操操作作码码宏宏定定义义还还可可用用部部分分操操作作码码作作参参数数,,但但在在宏宏定定义义中中必必须须用用“&”作作分分隔隔符符,,&是是一一个个操操作作符符,,它它在在宏宏定定义义体体中中可可作作为为哑哑元的前缀,宏展开时,可以把元的前缀,宏展开时,可以把&前后两个符号合并成一个符号前后两个符号合并成一个符号例例5.12:宏定义带一个参数,用宏指令实现将:宏定义带一个参数,用宏指令实现将AX中内容右移任意次(小中内容右移任意次(小于于256)。

      宏定义:宏定义:SHIFTMACRONMOVCL,,NSALAX,,CLENDM宏调用宏调用1::SHIFT4 宏调用宏调用2::SHIFT8宏展开宏展开1::MOVCL,,4;;AX中内容算术左移中内容算术左移4次次SALAX,,CL宏展开宏展开2::MOVCL,,8;;AX中内容算术左移中内容算术左移8次次SALAX,,CL5.宏定义嵌套宏定义嵌套在宏定义中允许使用宏调用,但必须先定义后调用在宏定义中允许使用宏调用,但必须先定义后调用 例例5.14::宏定义:宏定义:AD1MACROM,,NMOVBX,,M ADDAX,,NENDMAD1MMACROR1,,R2,,R3PUSHAXPUSHBXAD1R1,,R2MOVX3,,AXPOPBXPOPAXENDM宏调用:宏调用:AD1MCX,,BX,,DX宏展开:宏展开:PUSHAX PUSHBXAD1R1,,R2 ;此语句不占内存;此语句不占内存MOVBX,,CX ;;AD1宏定义展开宏定义展开ADDAX,,BXMOVDX,,AXPOPBXPOPAX6.取消宏定义语句取消宏定义语句格式为:格式为:PURGE  宏指令名,宏指令名宏指令名,宏指令名…PURGE:伪指令助记符,不可缺省,因为经过定义的宏指令名,不允:伪指令助记符,不可缺省,因为经过定义的宏指令名,不允许重新定义,必须用许重新定义,必须用PURGE语句将其取消后,才能重新定义,此语句语句将其取消后,才能重新定义,此语句一次可以取消多个宏指令名。

      一次可以取消多个宏指令名 7.7.宏指令与子程序的区别宏指令与子程序的区别⑴⑴过过程程调调用用使使用用CALLCALL语语句句,,由由CPUCPU执执行行,,宏宏指指令令调调用用由由宏宏汇汇编编程程序序MASMMASM中宏处理程序来识别中宏处理程序来识别⑵⑵过过程程调调用用时时,,每每调调用用一一次次都都要要保保留留程程序序的的断断点点和和保保护护现现场场,,返返回回时时要要恢恢复复现现场场和和恢恢复复断断点点,,增增加加了了操操作作时时间间,,执执行行速速度度慢慢而而宏指令调用时,不需要这些入栈及出栈操作,执行速度较快宏指令调用时,不需要这些入栈及出栈操作,执行速度较快⑶⑶过过程程调调用用的的子子程程序序与与主主程程序序分分开开独独立立存存在在,,经经汇汇编编后后在在存存储储器器中中只只占占有有一一个个子子程程序序段段的的空空间间,,主主程程序序转转入入此此处处运运行行,,因因此此目目标标代代码码长长度度短短,,节节省省内内存存空空间间而而宏宏调调用用是是在在汇汇编编过过程程中中展展开开,,宏宏调调用用多多少少次次,,就就插插入入多多少少次次,,因因此此目目标标代代码码长长度度大大,,占占内内存存空空间间多;多;⑷⑷一一个个子子程程序序设设计计,,一一般般完完成成某某一一个个功功能能,,多多次次调调用用完完成成相相同同操操作作,,仅仅入入口口参参数数可可以以改改变变,,而而宏宏指指令令可可以以带带哑哑元元,,调调用用时时可可以以用用实元取代,使不同的调用完成不同的操作,增加使用的灵活性。

      实元取代,使不同的调用完成不同的操作,增加使用的灵活性       §5.6.2  重复汇编重复汇编重复汇编伪指令语句有以下三种:重复汇编伪指令语句有以下三种:1.定重复.定重复格式:格式:REPT表达式表达式宏体宏体ENDM其其中中,,REPT…ENDM::伪伪指指令令助助记记符符,,必必须须成成对对出出现现,,不不可可省省略略宏宏体体::表表示示需需要要重重复复的的语语句句序序列列表表达达式式::表表示示重重复次数 例例5.16::将将2、、4、、8、、16、、32分配给连续的分配给连续的5个存储单元个存储单元NUM=1REPT  5NUM=NUM*2DB  NUMENDM汇编后汇编后: ++DB  2++DB  4++DB  8++DB  16++DB  32 2.不定重复.不定重复格式:格式:IRP形参,<实参表>形参,<实参表>宏体宏体ENDM其其中中,,IRP…ENDM::伪伪指指令令助助记记符符,,必必须须成成对对出出现现,,不不可可省省略略宏宏体体::要要重重复复的的语语句句序序列列,,重重复复次次数数由由参参数数个个数数决决定定实实数数表表中中是是每每次次重重复复时时将将要要取取的的实实参参,,实实参参之之间间用用逗逗号号隔隔开开,,实实参参表表用用尖尖括括号号<<>>括括起起来来。

      每每次次重重复复,,依依次次取取实实参参表表中中一一项项,,代代入入语语句句序序列列中中哑哑元元前前面面将将2、、4、、8、、16、、32分分配配给给连连续续的的5个个存存储储单单元元的的例子也可以用如下不定重复伪指令:例子也可以用如下不定重复伪指令:IRPNUM,<,<2,,4,,8,,16,,32>>DBNUMENDM 例例5.17::若若要要把把AX,,BX,,CX,,DX的的内内容容压压入入堆堆栈栈,,则则可可以以用用如如下不定重复伪指令:下不定重复伪指令:IRPREG,<,<AX,,BX,,CX,,DX>>PUSHREGENDM汇编后展开为以下四汇编后展开为以下四条指令:条指令:++PUSH AX++PUSH BX++PUSH CX++PUSH DX           3.不定重复字符.不定重复字符              格式为:格式为:    IRPC 形式参数,字符串形式参数,字符串宏体宏体ENDM其其中中,,IRPC..ENDM::伪伪指指令令助助记记符符,,必必须须成成对对出出现现,,不不可可省省略略宏宏体体::重重复复执执行行的的语语句句序序列列,,每每次次重重复复时时依依次次用用字字符符串串中中字字符符代代替替形形式式参参数数,,重重复复次次数数取取决决于于字字符符串串中中字字符符的的个个数数。

      字字符符串串::可可用用尖尖括号也可不用尖括号括起来括号也可不用尖括号括起来例例5.18::若若要要从从堆堆栈栈中中弹弹出出4个个字字,,分分别别送送入入DX,,CX,,BX,,AX,,则可用如下不定重复字符伪指令:则可用如下不定重复字符伪指令:IRPCREG,,POPREG&XENDM 汇编后展开为以下四条指令:汇编后展开为以下四条指令:++POPDX++POPCX++POPBX++POPAX§5.6.3  条件汇编条件汇编      条条件件汇汇编编是是对对给给定定的的条条件件进进行行测测试试,,汇汇编编程程序序根根据据测测试试结结果果,,将一段程序嵌入源程序汇编或不进行汇编,它的一般格式为:将一段程序嵌入源程序汇编或不进行汇编,它的一般格式为:IF××表达式表达式指令体指令体1;条件为真汇编指令体;条件为真汇编指令体1ELSE指令体指令体2;条件为假汇编指令体;条件为假汇编指令体2ENDIF 其其中中,,IF××…ENDIF::条条件件汇汇编编伪伪指指令令助助记记符符,,必必须须成成对对出出现现,,不不可可省省略略IF语语句句后后的的“××”是是指指定定的的条条件件如如果果“IF××”指指定定的的条条件件为为真真时时则则宏宏汇汇编编程程序序将将指指令令体体1中中的的语语句句汇汇编编成成相相应应的的目目标标代代码码,,否否则就把指令体则就把指令体2中的语句汇编成相应的目标代码。

      中的语句汇编成相应的目标代码ELSE::是是任任选选部部分分,,如如果果没没有有ELSE,,那那么么“IF××”指指定定的的条条件件满满足就汇编,否则就不汇编足就汇编,否则就不汇编IF××”条件汇编的形式见条件汇编的形式见表表5.1所示:所示: 例例5.20::利利用用条条件件汇汇编编伪伪指指令令,,可可以以根根据据不不同同情情况况,,产产生生无无条条件件转转移指令如移指令如JMP,或产生条件转移指令如,或产生条件转移指令如JE、、JNE、、JB、、JNB等宏定义:宏定义:GOTOMACROLOP,,X,,REL,,YIFB<<REL>>JMPLOPELSEMOVAL,,XCMPAL,,YJ&REL LOPENDIFENDM 宏调用:宏调用:……GOTOLOP1,,VAR1,,E,,VAR2……GOTOEXIT1……宏展开:宏展开:……++MOV AL,,VAR1++CMP AL,,VAR2++JELOP1……++JMPEXIT1…… §5.7  DOS功能子程序的调用功能子程序的调用    为为了了了了解解程程序序运运行行过过程程中中的的情情况况,,应应设设法法将将运运算算结结果果显显示示到到显显示示器器上上,,最最简简单单的的方方法法就就是是调调用用操操作作系系统统的的I/O子子程程序序,,我我们们称称为为DOS功功能能调调用用。

      DOS为为程程序序设设计计人人员员提提供供了了许许多多可可直直接接调调用用的的功功能能子子程程序调用时需要使用软中断指令:序调用时需要使用软中断指令:INT    n其其中中::n为为中中断断调调用用类类型型号号,,其其值值为为00~~FFH在在使使用用INT指指令令前前,,应应将将调调用用的的功功能能号号送送入入AH,,有有关关入入口口参参量量送送入入指指定定寄寄存存器器中中若若有有出出口口参参量量,,中中断断调调用用返返回回后后,,结结果果在在指指定定的的寄寄存存器器或或存存储储单单元元中中DOS功功能能子子程程序序的的调调用用使使用用软软中中断断指指令令“INT  21H”DOS共共有有84个个功功能能子子程程序序这这些些子子程程序序的的主主要要功功能能是是::磁磁盘盘的的读读写写控控制制、、文文件件操操作作、、目目录录操操作作、、内内存存管管理理、、基基本本输输入入输输出出管管理理及及设设置置/读读出出系系统统日日期期、、时间等 下面例举部分常用的下面例举部分常用的DOS功能子程序功能子程序1.带显示的键盘输入(.带显示的键盘输入(1号功能)号功能)       该该功功能能子子程程序序等等待待键键盘盘输输入入,,直直接接按按下下一一个个键键((即即输输入入一一个个字字符符)),,把把字字符符的的ASCII码码送送入入AL,,并并在在屏屏幕幕上上显显示示该该字字符符。

      如如果果按按下下的的键键是是Ctrl-C组组合合键键,,则则停停止止程程序序运运行行如如果果按按下下TAB制制表表键键,,屏屏幕幕上上光光标标自自动动扩扩展展到到紧紧接接着着的的8个个字字符符位位置置后后面面1号号功功能能调调用用,,毋毋需入口参量,出口参量在需入口参量,出口参量在AL中如:MOVAH,,01HINT21H 2.不带显示的键盘输入(.不带显示的键盘输入(7号功能)号功能)      与与1号号功功能能类类似似,,它它仅仅等等待待键键盘盘输输入入一一个个字字符符,,并并将将字字符符的的ASCII码码送送入入AL中中但但按按下下Ctrl-C组组合合键键和和TAB制制表表键无反应调用方法如下:键无反应调用方法如下:MOVAH,,7INT21H       缓缓冲冲区区第第一一个个字字节节存存放放它它能能保保存存的的最最大大字字符符数数((1~~255,,不不能能为为‘0’!!)),,该该值值由由用用户户程程序序自自己己事事先先设设置置如如果果键键如如的的字字符符数数比比此此数数大大,,那那就就会会发发出出“嘟嘟嘟嘟”声声,,而而且光标不再向右移动且光标不再向右移动 缓缓冲冲区区第第二二个个字字节节存存放放用用户户本本次次调调用用时时实实际际输输入入的的字字符符数数((回回车车键键除除外外)),,这这个个数数由由DOS返返回回时时自自动动填填入入。

      用用户户从从键键盘盘输输入入的的字字符符从从第第三三个个字字节节开开始始存存放放,,直直到到用用户户输输入入回回车车键键为为止止,,并并将将回回车车键键码码((0DH))加加在在刚刚才才输输入入字字符符串串的的末尾上调调用用时时,,用用DS::DX寄寄存存器器指指向向输输入入缓缓冲冲区区的的段段基基值值::偏偏移移量例如在数据区定义的字符缓冲区如下:量例如在数据区定义的字符缓冲区如下:MAX__LENDB18ACT__LENDB??STRINGDB18DUP((0))      则输入串的指令如下:则输入串的指令如下:    MOV AX,,SEGMAX__LEN    MOV DS,,AX    MOV DX,,OFFSETMAX__LEN    MOV AH,,0AH    INT21H5.字符显示(.字符显示(2号功能)号功能)本本功功能能子子程程序序仅仅在在屏屏幕幕上上显显示示单单个个字字符符要要显显示示字字符符的的ASCII码码存存放放在在DL中中如如果果DL中中存存放放退退格格键键编编码码,,在在屏屏幕幕上上便便向向左左移移一一个个字字符符位位置置,,并并使使该该位位置置成成为为空空格格。

      移移动动后后光光标标停停留留在在那那里里如如要要显显示示字字符符‘A’,可用下列几条指令调用:,可用下列几条指令调用:MOVDL,,‘A’MOVAH,,2INT21H 6.字符打印(.字符打印(5号功能)号功能)5号号功功能能子子程程序序把把DL中中的的字字符符((ASCII码码))送送入入打打印印机机接接口口,,打打印印输输出出功能调用为:功能调用为:MOVDL,,‘A’MOVAH,,5INT21H7.字符串显示(.字符串显示(9号功能)号功能)       9号号功功能能子子程程序序能能在在屏屏幕幕上上显显示示多多于于一一个个的的字字符符串串要要显显示示的的字字符符串串必必须须先先放放在在内内存存一一数数据据区区中中,,且且字字符符串串以以美美元元符符号号‘$$’作作为为结结束束标标志志非非显显示示字字符符,,可可以以用用它它的的ASCII码码插插入入字字符符串串中中间间进进行行9号号功功能能调调用用时时,,先先把把待待显显示示的的字字符符串串首首地地址址的的段段基基值值和和偏偏移移量量分分别别存存入入DS和和DX中在数据段中定义一个待显示符号串如:在数据段中定义一个待显示符号串如:STRINGDB“THIS IS A PROGRAM”,,0AH,,0DH,,“$$” 则显示该符号串的指令为:则显示该符号串的指令为:LEADX,,STRINGMOVAH,,9INT21H8.取中断向量(.取中断向量(35H号功能)号功能)       35H号号功功能能把把由由AL指指定定的的中中断断类类型型号号的的中中断断向向量量从从中中断断向向量量表表中中取取到到ES::BX中中。

      即即必必须须把把要要取取出出的的中中断断类类型型号号N送送给给AL,,调调用用35H功功能能后后,,与与中中断断类类型型号号N对对应应的的中中断断向向量量则则保存在保存在ES::BX中其调用示例如下:中其调用示例如下:MOVAL,,NMOVAH,,35HINT21H 9.设置中断向量(.设置中断向量(25H号功能)号功能)       25H号号功功能能把把由由AL指指定定的的中中断断类类型型的的中中断断向向量量DS::DX放放置置在在中中断断向向量量表表中中具具体体设设置置过过程程为为::首首先先将将要要设设置置的的中中断断类类型型号号送送AL,,然然后后把把要要设设置置的的中中断断服服务务程程序序的的段段地地址址和和偏偏移移量量分分别别送送DS、、DX,,最最后后再再调调用用25H功功能能典典型型的的使使用用DOS功能调用存取中断向量的程序段如下:功能调用存取中断向量的程序段如下:……MOVAL,,N;取出并保存原中断向量;取出并保存原中断向量MOVAH,,35HINT21HPUSHBX PUSHESPUSHDSMOVAX,,SEG  INTERRUPTMOVDS,,AXMOVDX,,OFFSET  INTERRUPTMOVAL,,NMOVAH,,25HINT21HPOPDS……POPDS 恢复原中断向量恢复原中断向量POPDXMOVAL,,NMOVAH,,25HINT21HMOVAH,,4CH;返回;返回DOSINT21HINTERRUPT::……;中断服务程序;中断服务程序IRET…… 10.读出系统日期(.读出系统日期(2AH号功能)号功能)      本本功功能能子子程程序序的的执执行行,,将将系系统统的的年年、、月月、、日日、、星星期期的的数数据据读读出,并存入指定的寄存器中:出,并存入指定的寄存器中:CX ← 年年((1980~~2099))DH ← 月(月(1~~12))DL ← 日(日(1~~31))AL ← 星期(星期(0—星期日,星期日,1—星期一等)星期一等)11.设置系统日期(.设置系统日期(2BH功能)功能) 调用本功能子程序时,必须在调用本功能子程序时,必须在CX和和DX中设置有效日期,其中设置有效日期,其中,中,CX中存放年号(中存放年号(1980~~2099),),DH中存放月号(中存放月号(1~~12),),DL中存放日(中存放日(1~~31)。

      如果日期设置有效,待功能子)如果日期设置有效,待功能子程序返回时,(程序返回时,(AL))=0,否则(,否则(AL))=0FFH所以为了检查所以为了检查设置是否成功,通常在调用设置是否成功,通常在调用2BH号功能后检查号功能后检查AL中内容 12.读出系统时间(.读出系统时间(2CH功能)功能)      本本功功能能子子程程序序从从系系统统中中可可得得到到当当时时的的时时间间::时时、、分分、、秒秒和和百分秒,它们分别存放在百分秒,它们分别存放在CX和和DX寄存器中:寄存器中:CH ← 小时小时  ((0~~23))CL ← 分分    ((0~~59))DH ← 秒秒    ((0~~59))DL ← 百分秒(百分秒(0~~99))13.设置系统时间(.设置系统时间(2DH功能)功能) 调用本功能子程序时,必须在调用本功能子程序时,必须在CX和和DX中设置有效时间中设置有效时间(指定有关寄存器和数据范围与(指定有关寄存器和数据范围与2C号功能相同)如果设置号功能相同)如果设置时间有效,从功能子程序返回时,(时间有效,从功能子程序返回时,(AL))=0,否则,否则((AL))=0FFH。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.