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

ch09-程序设计方法.ppt

102页
  • 卖家[上传人]:新**
  • 文档编号:587061888
  • 上传时间:2024-09-05
  • 文档格式:PPT
  • 文档大小:618KB
  • / 102 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • HYPerHYPer 程序设计方法程序设计方法 主讲人:黄永平主讲人:黄永平 u概述概述u顺序程序设计顺序程序设计u分支程序设计分支程序设计u循环程序设计循环程序设计u子程序设计子程序设计u模块化程序设计模块化程序设计u高级汇编语言技术高级汇编语言技术HYPerHYPer目录目录 一一.概述概述•汇编语言程序设计的一般步骤汇编语言程序设计的一般步骤•流程图流程图HYPerHYPer 汇编语言程序设计的一般步骤汇编语言程序设计的一般步骤1.分析问题,确定算法.分析问题,确定算法2.绘制流程图.绘制流程图3.分配存储空间和工作单元.分配存储空间和工作单元4. 根据流程图编制程序根据流程图编制程序5.调试程序.调试程序HYPerHYPer 流程图流程图1.流程图的概念.流程图的概念流流程程图图是是由由特特定定的的几几何何图图形形、、指指向向线线、、文文字字说说明明来来表表示示数数据据处处理理的的步步骤骤,,形形象象描描述述逻逻辑辑控控制制结结构构以以及及数数据据流流程程的的示示意意图图流流程程图图具具有有简简洁洁、、明明了了、、直观的特点直观的特点2.流程图符号表示.流程图符号表示((1)起止框:表示程序)起止框:表示程序的开始和结束。

      的开始和结束•起止框起止框HYPerHYPer ((2)判断框)判断框 ((3)处理框)处理框 ((4)调用框)调用框 HYPerHYPer ((5)指向线)指向线 ((6)连接框)连接框 HYPerHYPer 二二.顺序程序设计顺序程序设计下面举例说明顺序程序的设计下面举例说明顺序程序的设计例例4.1】】试编写一程序计算以下表达式的值试编写一程序计算以下表达式的值ww=((v-((xx*yy+zz-540))))/x      式中式中x、、y、z、y、z、v均为有符号字数据均为有符号字数据设设xx、、yy、、zz、、vv的的值值存存放放在在字字变变量量XX、、YY、、ZZ、、V中中,,结结果果存存放放在在双双字字变变量量WW之之中中,,程程序序的的流流程程图图如如下下图图所所示HYPerHYPer 源程序如下:源程序如下:DATASEGMENTXDW200YDW100ZDW3000VDW10000W DW2 DUP(?)(?)DATAENDSSTACK SEGMENT STACK DB 200 DUP((0))STACK ENDSCODESEGMENTASSUME DS::DATA,,CS::CODE,,SS::STACK START::MOVAX,,DATAMOV DS,,AX ;;DATA→AXMOV AX,,X IMULY;(;(X))*((Y))→DX::AXMOV CX,,AXMOV BX,,DX ;(;(DX::AX))→((BX::CX))MOV AX,,ZCWD;(;(Z))符号扩展符号扩展ADD CX,,AXADC BX,,DX ;(;(BX::CX))+((DX::AX))→((BX::CX))SUB CX,,540SBB BX,,0;(;(BX::CX))-540→((BX::CX))MOV AX,,V CWD;(;(V))符号扩展符号扩展SUBAX,,CXSBBDX,,BX;;((DX::AX))-((BX::CX))→((DX::AX))IDIV X;(;(DX::AX))/XMOVW,,AX ;;商商→WMOVW+2,,DX;;余数余数DX→W+2MOVAH,,4CHINT 21HCODE ENDS;;退出退出DOS 状态状态ENDSTART 【【例例4.2】】【【例例4.2】】已已知知某某班班学学生生的的英英语语成成绩绩按按学学号号((从从1开开始始))从从小小到到大大的的顺顺序序排排列列在在TAB表表中中,,要要查查的的学学生生的的学学号号放放在在变变量量NO中中,,查查表表结结果果放放在变量在变量ENGLISH中。

      编写程序如下:中编写程序如下: STACK SEGMENT STACKDB 200 DUP((0))STACK ENDSDATASEGMENTTABDB 80,,85,,86,,71,,79,,96 DB 83,,56,,32,,66,,78, 84NO DB 10ENGLISHDB??DATAENDSCODE SEGMENT ASSUME DS::DATA,,SS::STACK,,CS::CODEBEGIN:: MOV AX,,DATAMOV DS ,,AXLEA BX,,TAB MOV AL,,NODEC ALXLATB ; al[bx+al]MOV ENGLISH,,ALMOV AH,,4CHINT21HCODEENDSEND BEGIN 4.3 分支程序设计分支程序设计4.3.1 用条件转移指令实现程序分支用条件转移指令实现程序分支4.3.2 用跳转表实现多路分支用跳转表实现多路分支返回本章首页返回本章首页 4.3.1 用条件转移指令实现程序分支用条件转移指令实现程序分支【【例例4.3】】编写计算下面函数值的程序:编写计算下面函数值的程序: 1X>>0Y= 0X=0 -1X设设输输入入数数据据为为X、、输输出出数数据据Y,,且且皆皆为为字字节节变变量量。

      程程序序流程图如图流程图如图4.2所示程序如下:程序如下: DATASEGMENTX DB -10Y DB ??DATAENDSSTACK SEGMENT STACK DB 200 DUP((0))STACK ENDSCODE SEGMENTASSUME DS::DATA,,SS::STACK,,CS::CODESTART::MOVAX,,DATA MOVDS,,AX CMPX,,0;;与与0进行比较进行比较 JGEA1;;X≥0转转A1 MOVY,,-1;;X <<0时,时,-1→Y JMPEXITA1:: JGA2;;X>>0转转A2 MOVY,,0;;X=0时,时,0→Y JMPEXITA2:: MOVY,,1;;X>>0,,1→Y EXIT:: MOVAH,,4CH INT21H CODE ENDS ENDSTART MOVDS,,AX CMPX,,0;;与与0进行比较进行比较 JGEA1;;X≥0转转A1 MOVY,,-1;;X <<0时,时,-1→Y JMPEXITA1:: JGA2;;X>>0转转A2 MOVY,,0;;X=0时,时,0→Y JMPEXITA2:: MOVY,,1;;X>>0,,1→Y EXIT:: MOVAH,,4CH INT21H CODE ENDS ENDSTART •图图4.2 分支运算分支运算程序流程图程序流程图 【【例例4.4】】 【【例例4.4】】试试编编一一程程序序,,求求三三个个带带符符号号字字数数据据中中的的最最大大值值,,并并将将最最大大值值存存入入MAX字字单单元元中。

      中设三个带符号数分别在三个字变量设三个带符号数分别在三个字变量X、、Y、、Z中存储程序流程图如图中存储程序流程图如图4.3所示所示 图图4.3  [例例4.4]程序流程图程序流程图 程序如下:程序如下:STACSEGMENT STACK DB 200 DUP((0))STACK ENDSDATASEGMENTX DW 00ABHY DW –5Z DW 200MAXDW ??DATAENDSCODE SEGMENT ASSUME DS::DATA,,SS::STACK,,CS::CODE START:: MOV AX,,DATA MOVDS,,AX MOVAX,,X CMPAX,,Y;;X>>Y?? JGL1 MOVAX,,Y;;Y>>Z?? CMPAX,,Z JGEXITL2:: MOVAX,,Z JMPEXIT L1::CMPAX,,Z ;;X>>Z?? JLE L2EXIT:: MOVMAX,,AX MOVAH,,4CH INT 21HCODE ENDS ENDSTART返回本节返回本节 4.3.2 用跳转表实现多路分支用跳转表实现多路分支【【例例4.5】】设设某某程程序序有有8路路分分支支,,试试根根据据给给定定的的N值值((1~8)),,将将程程序序的的执执行行转转移移到到其其中中的的一一路路分支。

      分支程序流程如图程序流程如图4.4所示 程序如下:程序如下:DATASEGMENTTABDW P1,,P2,,P3,,P4,,P5,,P6,,P7,,P8N DB 5DATAENDSSTACK SEGMENT DB 200 DUP((0))STACK ENDSCODE SEGMENT ASSUME DS::DATA,,SS::STACK,,CS::CODE START::MOVAX,,DATAMOVDS,,AX┆ ┆MOVAL,,NDELALADDAL,,ALMOVBM,,ALMOVBH,,0JMPTAB[BX] P1::……┆ ┆JMPEXITP2::……┆ ┆JMPEXITP2::……┆ ┆JMPEXITP3::…… ┆ ┆ JMP EXIT┆ ┆P8::……┆ ┆EXIT:: MOVAH,,4CH INT 21HCODE ENDS ENDSTART上上述述程程序序中中的的无无条条件件转转移移指指令令的的转转移移地地址址采采用用的的是是变变址址寻寻址址。

      同同理理,,转转移移地地址址也也可可以以用用寄寄存存器器间间接接寻寻址或基址加变址寻址,读者可自行考虑址或基址加变址寻址,读者可自行考虑返回本节返回本节 4.4 循环程序设计循环程序设计4.4.1 循环程序的结构循环程序的结构4.4.2 单重循环程序设计单重循环程序设计4.4.3 多重循环程序设计多重循环程序设计返回本章首页返回本章首页 4.4.1 循环程序的结构循环程序的结构1.初始化部分.初始化部分2.循环体部分.循环体部分3.循环控制部分.循环控制部分 循环程序的常见结构形式如图循环程序的常见结构形式如图4.5((a)、()、(b))所示返回本节返回本节 4.4.2 单重循环程序设计单重循环程序设计1.计数控制.计数控制2.条件控制.条件控制 1.计数控制.计数控制【【例例4.7】】已已知知有有几几个个元元素素存存放放在在以以BUF为为首首址址的字节存贮区中,试统计其中正元素的个数的字节存贮区中,试统计其中正元素的个数显显然然,,每每个个元元素素为为一一个个8位位有有符符号号二二进进制制数数,,统统计计其其中中正正元元素素的的个个数数可可用用循循环环程程序序实实现现其程序流程图如图其程序流程图如图4.6所示。

      所示 •图图4.6 程程序序流流程程图图 【【例例4.8】】 【【例例4.8】】试试编编写写一一程程序序,,要要求求比比较较两两个个字字符符串串STR1和和STR所所含含字字符符是是否否相相同同,,若若相相同同则则显显示示 ‘MATCH!! ’,, 若若 不不 相相 同同 则则 显显 示示 ‘NO MATCH!!’程序略程序略)其流程图如图其流程图如图4.7所示 •图图4.7 程程序序流流程程图图 【【例例4.94.9】】试试编编一一个个程程序序将将字字单单元元BUFBUF中中所所含含1 1的的个个数数存存入入COUNTCOUNT单单元元中中要要测测出出BUFBUF字字单单元元所所含含1 1的的个个数数,,首首先先将将BUFBUF中中的的数数送送给给寄寄存存器器AXAX,,然然后后将将AXAX寄寄存存器器逻逻辑辑左左移移一一次次,,如如果果CF=1CF=1,,则则表表明明AXAX中中的的最最高高位位为为1 1,,则则计计数数器器CLCL计计数数1 1次次,,如如果果CF=0CF=0,,表表明明AXAX最最高高位位为为0 0,,这这样样依依次次将将最最高高位位移移入入CFCF中中去去测测试试。

      移移位位之之后后,,判判断断AXAX的的值值是是否否为为0 0,,如如果果为为0 0则则结结束束循循环环,,不不为为0 0,则继续循环则继续循环其流程图如图其流程图如图4.84.8所示2.条件控制.条件控制 程序如下:程序如下:STACK SEGMENT STACK DB 200 DUP((0))STACK EDNSDATASEGMENTBUFDW 0011110010101011BCOUNTDB ??DATAENDSCODE SEGMENT ASSUME DS::DATA,,CS::CODE,,SS::STACK START::MOVAX,,DATAMOVDS,,AXMOVAX,,BUFMOVCL,,0;;计数器为计数器为0COPA::ANDAX,,AXJEEXIT;(;(AX))=0,,结束循环结束循环SHLAX,,1;;AX 左移一位左移一位JNCLOPAINCCL;;产生进位,(产生进位,(CL))+1→CLJMPLOPAEXIT::MOVCOUNT,,CLMOVAH,,4CHINT21HCODEENDSENDSTART返回本节返回本节 4.4.3 多重循环程序设计多重循环程序设计【【例例4.104.10】】在在以以BUFBUF为为首首址址的的字字存存储储区区中中存存放放有有N N个个有有符符号号数数,,现现需需将将它它们们按按大大到到小小的的顺顺序序排排列列在在BUFBUF存存储储区区中,试编写其程序。

      中,试编写其程序我我们们采采用用冒冒泡泡排排序序算算法法从从第第一一个个数数开开始始依依次次对对相相邻邻两两个个数数进进行行比比较较,,如如次次序序对对,,则则不不交交换换两两数数位位置置;;如如次次序序不不对对则则使使这这两两个个数数交交换换位位置置可可以以看看出出,,第第一一遍遍需需比比较较((N-1N-1))次次,,此此时时,,最最小小的的数数已已经经放放到到了了最最后后;;第第二二遍遍比比较较只只需需考考虑虑剩剩下下的的((N-1N-1))个个数数,,即即只只需需比比较较((N-2N-2))次次;;第第三三遍遍只只需需比比较较((N-3N-3))次次,,…………整整个个排排序序过过程程最最多多需需((N-1N-1))遍遍如如下下面面的的4 4个个数数即即是是采采用用冒泡排序比较的例子冒泡排序比较的例子 数数108169032第一遍第一遍101690328第二遍第二遍169032108第三遍第三遍903216108程序流程图如图程序流程图如图4.9所示 程序如下:程序如下:DATASEGMENTBUFDW 3,,-4,,6,,7,,9,,2,,0,,-8,,-9,,-10,,20N=($($-BUF))/2DATAENDSSTACKSEGNMENT STACKDB 200 DUP((0))STACKENDSCODESEGMENTASSUME CS::CODE,,DS::DATA,,SS::STACK START::MOVAX,,DATAMOVDS,,AXMOVCX,,NDECCXLOOP1::MOVDX,,CXMOVBX,,0LOOP2::MOVAX,,BUF[BX]CMPAX,,BUF[BX+2]JGELXCHGAX,,BUF[BX+2]MOVBUF[BX],,AX L::ADDBX,,2DECCXJNELOOP2MOVCX,,DXLOOPLOOP1MOVAH,,4CHINT21HCODEENDSENDSTART 程序运行后,程序运行后,BUF区中的内容如下:区中的内容如下:20,,9,,7,,6,,3,,2,,0,,-4,,-8,,-9,,-10若要对若要对N个无符号数按由大到小的顺序排列,个无符号数按由大到小的顺序排列,只需将指令只需将指令“JGE L”改为改为“JAE L”即可。

      即可 返回本节返回本节 4.5 子程序设计子程序设计4.5.1 子程序的概念子程序的概念4.5.2 子程序的定义子程序的定义4.5.3 子程序设计方法子程序设计方法4.5.4 子程序应用举例子程序应用举例4.5.5 子程序的嵌套与递归调用子程序的嵌套与递归调用返回本章首页返回本章首页 4.5.1 子程序的概念子程序的概念在在程程序序设设计计中中,,我我们们会会发发现现一一些些多多次次无无规规律律重重复复的的程程序序段段或或语语句句序序列列解解决决此此类类问问题题一一个个行行之之有有效效的的方方法法就就是是将将它它们们设设计计成成可可供供反反复复调调用用的的独独立立的的子子程程序序结结构构,,以以便便在在需需要要时时调用在汇编语言中,子程序又称过程在汇编语言中,子程序又称过程调用子程序的程序称为主调程序或主程序调用子程序的程序称为主调程序或主程序 返回本节返回本节 4.5.2 子程序的定义子程序的定义子子程程序序的的定定义义是是由由过过程程定定义义伪伪指指令令PROCPROC和和ENDPENDP来来完完成成的的其格式如下:其格式如下:过程名过程名 PROC [NEAR/FAR]PROC [NEAR/FAR] ┆ ┆过程名过程名 ENDPENDP其其中中PROCPROC表表示示过过程程定定义义开开始始,,ENDPENDP表表示示过过程程定定义义结结束束。

      过程名是过程入口地址的符号表示过程名是过程入口地址的符号表示一般过程名同标号一样,具有三种属性,即段属性、偏一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性移地址属性以及类型属性 返回本节返回本节 4.5.3 子程序设计方法子程序设计方法1.信息的保护与恢复.信息的保护与恢复2.主程序与子程序参数传递方式.主程序与子程序参数传递方式 1.信息的保护与恢复.信息的保护与恢复例例如如::若若子子程程序序PROG中中改改变变了了寄寄存存器器AX,,BX,,CX,,DX的的值值,,则则可可采采用用如如下下方方法法保保护护和和恢恢复复现场PROGPROCPUSH AXPUSH BX PUSH CX;;保护现场保护现场PUSH DX┆ ┆ ┆ ┆ POPDXPOP CXPOP BX;;恢复现场恢复现场POP AXRET ;;返回断点处返回断点处PROCENDP 2.主程序与子程序参数传递方式.主程序与子程序参数传递方式((1)寄存器法)寄存器法((2)约定单元法)约定单元法((3)堆栈法)堆栈法返回本节返回本节 4.5.4 子程序应用举例子程序应用举例【【例例4.12】】将将一一个个给给定定的的二二进进制制数数按按位位转转换换成成相相应应的的ASCII码码字字符符串串,,送送到到指指定定的的存存储储单单元元并并显显示示。

      如如二二进进制制数数10010011转转换换成成字字符符串串为为‘10010011’要要求求将将转转换换过过程程写写成成子子程程序序,,且且子子程程序序应应具具有有较较好好的的通通用用性性,,而而必必须须能实现对能实现对8倍和倍和16倍二进制数的转换倍二进制数的转换 入口参数:入口参数:DX存放待转换的二进制数存放待转换的二进制数CX存放待转换数的位数(存放待转换数的位数(8位或位或16位)位)DI存放存放ASCII码首地址码首地址出口参数:转换后的字符串存放在出口参数:转换后的字符串存放在以以DI作指针的字节存贮区中作指针的字节存贮区中程序如下:程序如下:DATASEGMENTNUM8 DB93HNUM16 DW0ABCDHASCBUFDB20DUP((0))DATAENDS CODESEGMENTASSUME DS::DATA,,CS::CODE,, SS::STACKSTART::MOVAX,,DATAMOVDS,,AXMOVDX,,0MOVDL,,NUM8;;转换二进制数送转换二进制数送DXMOVCX,,8;;置位数置位数8LEADI,,ASCBUF;;字符串首址字符串首址→DICALLBTASC ;;调用子程序调用子程序BTASCMOV[DI],,BYTE PTR 0DHMOV[DI+1],,BYTE PTR 0AH MOV[DI+2],,BYTE PTR ‘$’LEA DX,,ASCBUFMOV AH,,9INT21HMOV DX,,NUM16MOV CX,,16 ;;置位数置位数16LEA DI,,ASCBUFCALLBTASC MOV[DL],,BYTE PTR 0DHMOV [DL+1],,BYTE PTR 0AHMOV [DL+2],,BYTE PTR ‘$$’ ;; 显显示示转转换换后后的字符串的字符串LEA DX,, ASCBUF MOV AH,,9 INT21H BTASCPROCPUSHAX;;保存保存AXMOVAL,,0CMPCX,,8;;比较比较8位数位数JNEL1;;直接转换直接转换16位数位数MOVDH,,DL ;;8位数转换送位数转换送DHL1::ROLDX,,,1 ;;DX最高位移入最高位移入CFRCLAL,,1;;CF移入移入AL最低位最低位ADDAL,,30HMOV[DI],,AL INCDILOOP L1POPAXRETBTASCENDPCODEENDSENDSTART返回本节返回本节 4.5.5 子程序的嵌套与递归调用子程序的嵌套与递归调用1.子程序的嵌套.子程序的嵌套子子程程序序不不但但可可以以被被主主程程序序调调用用,,而而且且也也可可以以被被其其他他子子程程序序调调用用。

      我我们们把把一一个个子子程程序序调调用用另另一一个个子子程程序序称称为子程序的嵌套调用为子程序的嵌套调用2.子程序的递归调用.子程序的递归调用子子程程序序的的递递归归调调用用是是指指一一个个子子程程序序直直接接或或间间接接地地调调用用自自己己递递归归子子程程序序一一般般对对应应于于数数学学上上对对函函数数的的递递归归定定义义,,它它往往往往能能设设计计出出效效率率较较高高的的程程序序,,完完成成相相当当复杂的计算,因而是很有用的复杂的计算,因而是很有用的 【【例例4.15】】【【例例4.15】】试试编编制制计计算算N! ((N≥0))的的程程序序N!=N*((N-1))*((N-2))*……*1其递归定义如下:其递归定义如下:0!=1N!=N*((N-1))! ((N>>1))计算计算N!!的子程序的子程序FACT的流程图如图的流程图如图4.10所示 【【例例4.16】】计算计算5!的程序示例,!的程序示例, RESULT是保存阶乘的存储单元是保存阶乘的存储单元程序如下:程序如下:STACKSEGMENT STACKDB 200 DUP((0))STACKENDSDATASEGMENTNDW 5RESULTDW ??DATAENDSCODESEGMENTASSUME CS::CODE,, SS::STACK,,DS::DATA START::MOVAX,,DATAMOVDS,,AXMOVAX,,NCALLFACTMOVAX,,RESULTMOVAH,,4CHINT21HFACTPROCCMPAX,,0JNEL1 MOVRESULT,,1JMPEXITL1::PUSHAXDECAXCALLFACTPOPAXMOVRESULTMOVRESNLT,,AXEXIT::RETFACTENDPCODEENDSENDSTART返回本节返回本节 4.6 模块化程序设计模块化程序设计1..PUBLIC伪指令伪指令格式:格式:PUBLIC 符号符号 [,符号,符号]功功能能::说说明明其其后后的的符符号号是是全全局局符符号号。

      全全局局符符号号能能被被其其他他模块引用模块引用2..EXTRN伪指令伪指令格式:格式:EXTRN 符号:类型符号:类型 [,符号:类型,符号:类型]功功能能::说说明明在在本本模模块块中中需需要要引引用用的的、、由由其其他他模模块块定定义义的的符号,即外部符号符号,即外部符号返回本章首页返回本章首页 【【例例4.17】】 【【例例4.17】】用用模模块块化化程程序序设设计计方方法法建建立立两两个个模模块块MOD1 ASM和和MOD2 ASM的数据通讯的数据通讯NAMEMOD1EXTRNDISP::FARPUBLICSTR1,,N ,,BUFDATA1SEGMENTSTR1DB‘HOW DO YOU DO?’N=$-STR1BUFDB‘THIS IS AN EXAMPLE OF MODULES PROGRAM $$′DATAENDS STACKSEGMENT STACKDB 200 DUP((0))STACKENDSCODE1SEGMENTASSUME CS::CODE1,,DS::DATA1,,SS::STACKSTART::MOVAX,,DATAMOVDS,,AXCALLDISPMOVAH,,4CHINT21HCODE1ENDS ENDSTARTNAMEMOD2EXTRNSTR1::BYTE,,STR2::BYTE,,N::ABSPUBCICDISPDATA2SEGMENTSTR2DB 81 DUP((0))DATA2ENDSCODE2SEGMENTASSUME CS::CODE2,,ES::DATA2DISPPROCFARMOVAX,,DATA2MOVES,,AX LEABX,,STR1MOVCX,,NLEASI,,STR2NEXT::MOVAL,,[BX]MOVES::[SI],,ALINCBXINCSI LOOPNEXTLEADX,,BUFMOVAH,,9INT21HRET DISPENDPCODE2ENDSEND 4.7 高级汇编语言技术高级汇编语言技术4.7.1 宏指令宏指令4.7.2 宏指令的使用过程宏指令的使用过程4.7.3 宏操作符宏操作符4.7.4 局部符号伪指令局部符号伪指令LOCAL4.7.5 宏库的使用宏库的使用4.7.6 重复汇编4.7.7 条件汇编条件汇编返回本章首页返回本章首页 4.7.1 宏指令宏指令在汇编语言程序设计过程中,可以将具有一在汇编语言程序设计过程中,可以将具有一定功能,需多次重复使用,且比较短的程序定功能,需多次重复使用,且比较短的程序段定义成一条宏指令。

      段定义成一条宏指令使用宏指令语句可以减少程序书写错误,缩使用宏指令语句可以减少程序书写错误,缩短源程序长度,使源程序编写像高级语言一短源程序长度,使源程序编写像高级语言一样清晰、简洁特别是使用宏库后,可以提样清晰、简洁特别是使用宏库后,可以提高编程效率高编程效率返回本节返回本节 4.7.2 宏指令的使用过程宏指令的使用过程1.宏定义.宏定义2.宏调用.宏调用3.宏扩展.宏扩展 1.宏定义.宏定义((1)带参宏定义)带参宏定义宏指令名宏指令名 MACRO 形参形参1,形参,形参2,,…… 宏体 宏体   ENDM((2))无参宏定义无参宏定义宏指令宏指令 MACRO宏体宏体ENDM 2.宏调用.宏调用格式:格式:宏指令名宏指令名 [实参实参1,实参,实参2,,……]例如:例如:对上面的宏定义的三种调用形式为:对上面的宏定义的三种调用形式为:┆ ┆PRINT BUF1┆ ┆PRINT BUF2┆ ┆PRINT BUF3┆ ┆ 3.宏扩展.宏扩展┆ ┆+ LEADX,,BUF1+ MOVAH,,9+ INT21H┆ ┆+ LEADX,,BUF2+ MOVAH,,9+ INT21H ┆ ┆+ LEADX,,BUF3+ MOVAH,,9+ INT21H ┆ ┆•例如:上面三次宏调用,其展开的形式为:例如:上面三次宏调用,其展开的形式为: 返回本节返回本节 4.7.3 宏操作符宏操作符1.文本操作符.文本操作符【【例例4.19】】在程序中定义大小及初值不同的堆栈段。

      在程序中定义大小及初值不同的堆栈段可用如下宏定义:可用如下宏定义:DSTACKMACRO ASTACKSEGMENT STACKDBASTACKENDSENDM 【【例例4.20】】表达符操作表达符操作%示例DATA1MACROA, B, C, D DWA, B, CDBD DUP((0))ENDM如果宏调用为:如果宏调用为:X=10Y=20DATA1%X+2, 5,%X+Y,, %Y-5DATA1X+2, 5, X+Y, Y-5 则相应的宏扩展为:则相应的宏扩展为:+ DW12, 5, 30+ DB15 DUP((0))+ DWX+2, 5, X+Y+ DBY-5 DUP ((0))返回本节返回本节 4.7.4 局部符号伪指令局部符号伪指令LOCAL【【例例4.21】】局部符号伪指令局部符号伪指令LOCAL应用SUMMACRO X,,YLOCAL LMOVCX,,XMOVBX,,YMOVAX,,0L::ADDAX,,BXINCBXLOOPLENDM 如果两次调用宏指令如下:如果两次调用宏指令如下:┆ ┆SUM100,,1┆ ┆SUM50,,1┆ ┆则宏扩展形式为:则宏扩展形式为:┆ ┆MOVCX,,100MOVBX,,1MOVAX,,0 ????0000::ADDAX,,BXINCBXLOOP ????0000┆ ┆MOVCX,,50MOVBX,,10MOVAX,,0????0001::ADDAX,,BX INCBXLOOP ????0001┆ ┆返回本节返回本节 4.7.5 宏库的使用宏库的使用语句格式:语句格式:INCLUDE 库文件名库文件名假设已建立一名为假设已建立一名为MACRO.LIB的宏库,其内容如下:的宏库,其内容如下:INPUTMACRO ALEADX,,AMOVAH,,10 ;;10号系统功能调用号系统功能调用INT21HENDMPRINTMACRO ALEADX,,AMOVAH,,9;;9号系统功能调用号系统功能调用INT21HENDM RETURNMACRO MOVAH,,2MOVDL,,0AHINT21HMOVDL,,0DH;;回车换行回车换行INT21HENDMOUT2MACRO AMOVDL,,AMOVAH,,2;;2号系统功能调用号系统功能调用INT21HENDM STACK0STACK0MACROMACROA ASTACKSTACKSEGMENTSEGMENTSTACKSTACKDBDBA ASTACKSTACKENDSENDSENDMENDM现现要要从从键键盘盘输输入入一一串串字字符符到到系系统统缓缓冲冲区区,,然然后后将将字字符符按按相相反反顺顺序序打打印印,,采采用用调调用用宏库的办法,其程序如下:宏库的办法,其程序如下: INCLUDEMACRO.LIBSTACK0〈〈200DUP ((0)) 〉〉;;定义堆栈段定义堆栈段DATASEGMENTINF01DB‘INPUT STRING:$:$’INF02DB‘OUTPUT STRING:$:$’BUFADB81DB??DB80 DUP((0)) BUFBDB 81 DUP((0))DATAENDSCODESEGMENTASSUME DS::DATA,,SS::STACK,,CS::CODESTART::MOVAX,,DATAMOVDS,,AXRETURN;;输出回车换行输出回车换行PRINTINFO1;;输出字符变量输出字符变量INFO1代代表表的的字字符串符串INPUTBUFA;;键盘输入字符中到缓冲区;键盘输入字符中到缓冲区;LEASI,,BUFA+1MOVCH,,0MOVCL,,[SI]ADDSI,,CXLEADI,,BUFB NEXT:: MOVAL,,[SI]MOV [DI],,ALDEC SIINC DILOOPNEXTMOV BYTE PTR [DI],,‘$$’RETURN;;输出回车换行输出回车换行PRINTINF02;;输出的字符串变量输出的字符串变量INF02代表代表PRINTBUFB;;反向输出输入字符串反向输出输入字符串MOV AH,,4CHINT21HCODEENDSEND START返回本节返回本节 4.7.6 重复汇编1.给定次数的重复汇编伪指令.给定次数的重复汇编伪指令语句格式:语句格式:REPT 表达式表达式重复块重复块ENDM功功能能::宏宏汇汇编编程程序序将将重重复复块块连连续续地地汇汇编编表表达达式式给给定定的的次次数。

      数2.不定次数的重复汇编伪指令,有.不定次数的重复汇编伪指令,有IRP和和IRPC两种伪两种伪指令 【【例例4.22】】 某某一一源源程程序序需需要要多多次次将将AX,,BX,,CX,,DX寄寄存存器器的的内内容容压压入入堆堆栈栈,,则可定义如下宏指令则可定义如下宏指令PUSHRMACROIRPREG,,〈〈AX,,BX,,CX,,DX〉〉PUSHREGENDMENDM调用上述宏定义后,将展开成下列语句:调用上述宏定义后,将展开成下列语句:+ PUSHAX+ PUSHBX + PUSH CX+ PUSH DX又如:又如:IR PW,,〈〈1122H,,3344H,,5566H,,7788H〉〉DW WENDM汇编程序在汇编时将产生语句:汇编程序在汇编时将产生语句:+ DW 1122H,,3344H,,5566H,,7788H2))IRPC语句格式:语句格式:IRPC 形参,字符串形参,字符串重复块重复块ENDM返回本节返回本节 4.7.7 条件汇编条件汇编条条件件汇汇编编指指在在汇汇编编期期间间,,宏宏汇汇编编程程序序根根据据条条件件是是否否成成立立决决定定具具体体汇汇编编哪哪一一程程序序段段。

      条条件件汇汇编编用用条条件件汇汇编编伪伪指指令来定义如表令来定义如表4.14.1所示语句格式:语句格式:IF ×× IF ×× 表达式表达式 条件块条件块1 1 [ELSE [ELSE 条件块条件块2]2] ENDIF ENDIF •表表4.1 条件汇编伪指令条件汇编伪指令 【【例例4.25】】试试用用条条件件汇汇编编编编写写一一宏宏定定义义,,能能完完成成多多种种DOS系系统统功能调用功能调用源程序如下:源程序如下:DOSYSMACRO N,,BUFIFENEXITMENDIFIFDEFBUFLEADX,,BUFMOVAH,,NINT21HELSE MOVAH,,NINT21HENDIFENDM;;…………………………DATASEGMENTMSGDB‘INPUT STRING:$:$’BUFDB81,,0,,80 DUP((0))DATAENDSSTACKSEGMENT STACKDB200 DUP((0)) STACKENDSCODESEGMENTASSUME DS:: DATA,, CS:: CODE,, SS::STACKBEGIN::MOVAX,,DATAMOVDS,,AXDOSYS9,,MSGDOSYS10 ,,BUFDOSYS4CHCODE ENDSENDSTART 则以上三条宏指令展开后的语句为:则以上三条宏指令展开后的语句为:┆ ┆+ LEADX,,MSG+ MOVAH,,9+ INT21H+ LEADX,,BUF+ MOVAH,,10+ INT21H+ MOVAH,,4CH+ INT21H┆ ┆ 。

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