已阅读5页,还剩124页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章子程序与宏指令设计 为了程序共享或模块化设计的需要 可以把一段公共语句序列设计成子程序或宏指令的形式 6 1子程序结构及设计方法6 2子程序参数传递6 3嵌套与递归子程序6 4宏指令6 5宏指令库6 6重复伪指令6 7条件伪指令 6 1子程序结构及设计方法 6 1 1含有子程序的程序结构在汇编语言中用过程定义伪指令定义子程序 过程定义伪指令格式 过程名PROC属型 过程名ENDP 1 调用程序和子程序在同一个代码段的程序结构 子程序类型可缺省 注意END后必须跟主程序名 CODESEGMENTMAINPROCFAR CALLSUB1RETMAINENDPSUB1PROC RETSUB1ENDPCODEENDSENDMAIN 2 调用程序和子程序在不同段的程序结构 SUB2既被段间调用又被段内调用 必须是FAR属性 CALL要显式说明是FAR属性 CODE1SEGMENTMAINPROCFARCALLFARPTRSUB2RETMAINENDPCODE1ENDSCODE2SEGMENTSUB1PROCFARCALLFARPTRSUB2RETSUB1ENDPSUB2PROCFARRETSUB2ENDPCODE2ENDSENDMAIN 6 1 2设计子程序时应注意的问题1 子程序说明2 寄存器的保存与恢复3 密切注意堆栈状态 6 2子程序参数传递 可以通过给子程序传递参数使其更通用 常用的参数传递方法如下 通过寄存器传递 若调用程序和子程序在同模块 源程序 中 子程序可以直接访问模块中的变量 通过地址表传递参数地址 通过堆栈传递参数或参数地址 6 2 1通过寄存器传递这种传递方式使用方便 适用于参数较少的情况 例1 把BX中的16位二进制数转换成十进制并显示在屏幕上 STASGSEGMENTDW32DUP STASGENDSCODESEGMENTASSUMECS CODEMAINPROCFARMOVBX 162EHCALLTERNMOVAX 4C00HINT21HMAINENDP 程序6 3 TERNPROC 二 十并显示 MOVCX 10000CALLDEC DIV 转换万位数MOVCX 1000CALLDEC DIV 转换千位数MOVCX 100CALLDEC DIV 转换百位数MOVCX 10CALLDEC DIV 转换十位数MOVCX 1CALLDEC DIV 转换个位数RETTERNENDP DEC DIVPROC CX中为十进制的位权MOVAX BXMOVDX 0DIVCX 商为转换后的一位十进制数MOVBX DXMOVDL ALADDDL 30H 转换成ASCII码MOVAH 2 显示INT21HRETDEC DIVENDPCODEENDSENDMAIN 6 2 2同模块中的子程序可直接访问模块中的变量若调用程序和子程序在同模块中 子程序可以直接访问模块中的变量 例2 实现数组求和功能 要求数组求和 不考虑溢出情况 由子程序实现 其数组元素及结果均为字型数据 见程序6 4 STACKSGSEGMENTSTACK STK DW32DUP S STACKSGENDSDATASEGMENTARYDW1 2 3 4 5 6 7 8 9 10COUNTDW ARY 2 数组元素个数SUMDW 数组和的地址DATAENDS 程序6 4 CODE1SEGMENTMAINPROCFARASSUMECS CODE1 DS DATAPUSHDSXORAX AXPUSHAXMOVAX DATAMOVDS AXCALLFARPTRARY SUMRETMAINENDPCODE1ENDS CODE2SEGMENTASSUMECS CODE2ARY SUMPROCFAR 数组求和子程序PUSHAX 保存寄存器PUSHCXPUSHSILEASI ARY 取数组起始地址MOVCX COUNT 取元素个数XORAX AX 清0累加器 NEXT ADDAX SI 累加和ADDSI TYPEARY 修改地址指针LOOPNEXTMOVSUM AX 存和POPSI 恢复寄存器POPCXPOPAXRETARY SUMENDPCODE2ENDSENDMAIN 6 2 3通过地址表传递参数地址适用于参数较多的情况 具体方法是先建立一个地址表 该表由参数地址构成 然后把表的首地址通过寄存器或堆栈传递给子程序 例3 编写一个数组求和子程序 其数组元素及结果均为字型数据 另定义两个数组 并编写一个主程序 通过调用数组求和子程序分别求出两个数组的和 见程序6 5 程序6 5 STACKSGSEGMENTSTACK STK DW32DUP S STACKSGENDSDATASEGMENTARYDW1 2 3 4 5 6 7 8 9 10 数组1COUNTDW ARY 2 数组1的元素个数SUMDW 数组1的和地址NUMDW10 20 30 40 50 数组2CTDW NUM 2 数组2的元素个数TOTALDW 数组2的和地址TABLEDW3DUP 地址表DATAENDS CODE1SEGMENTMAINPROCFARASSUMECS CODE1 DS DATAPUSHDSXORAX AXPUSHAXMOVAX DATAMOVDS AX 构造数组1的地址表MOVTABLE OFFSETARYMOVTABLE 2 OFFSETCOUNTMOVTABLE 4 OFFSETSUMLEABX TABLE 传递地址表首地址CALLFARPTRARY SUM 构造数组2的地址表MOVTABLE OFFSETNUMMOVTABLE 2 OFFSETCTMOVTABLE 4 OFFSETTOTALLEABX TABLE 传递地址表的首地址CALLFARPTRARY SUM 段间调用调用数组求和子程序RETMAINENDPCODE1ENDS CODE2SEGMENTASSUMECS CODE2ARY SUMPROCFAR 数组求和子程序PUSHAX 保存寄存器PUSHCXPUSHSIPUSHDIMOVSI BX 取数组起始地址MOVDI BX 2 取元素个数地址MOVCX DI 取元素个数MOVDI BX 4 取结果地址XORAX AX 清0累加器 NEXT ADDAX SI 累加和ADDSI TYPEARY 修改地址指针LOOPNEXTMOV DI AX 存和POPDI 恢复寄存器POPSIPOPCXPOPAXRETARY SUMENDPCODE2ENDSENDMAIN 6 2 4通过堆栈传递参数或参数地址这种方式适用于参数较多 或子程序有多层嵌套 递归调用的情况 步骤 主程序把参数或参数地址压入堆栈 子程序使用堆栈中的参数或通过栈中参数地址取到参数 子程序返回时使用RETn指令调整SP指针 以便删除堆栈中已用过的参数 保持堆栈平衡 保证程序的正确返回 例4 完成数组求和功能 求和由子程序实现 要求通过堆栈传递参数地址 STACKSGSEGMENTSTACK STK DW16DUP STACKSGENDSDATASEGMENTARYDW1 2 3 4 5 6 7 8 9 10COUNTDW ARY 2SUMDW DATAENDS 程序6 6 CODE1SEGMENTMAINPROCFARASSUMECS CODE1 DS DATAPUSHDS XORAX AXPUSHAX MOVAX DATAMOVDS AX LEABX ARYPUSHBX 压入数组起始地址LEABX COUNTPUSHBX 压入元素个数地址LEABX SUMPUSHBX 压入和地址CALLFARPTRARY SUM 调用求和子程序RET MAINENDPCODE1ENDS CODE2SEGMENTASSUMECS CODE2ARY SUMPROCFAR 数组求和子程序PUSHBP 保存BP值MOVBP SP BP是堆栈数据的地址指针PUSHAX 保存寄存器内容PUSHCX PUSHSI PUSHDI MOVSI BP 10 得到数组起始地址MOVDI BP 8 得到元素个数地址MOVCX DI 得到元素个数MOVDI BP 6 得到和地址XORAX AX NEXT ADDAX SI 累加ADDSI TYPEARY 修改地址指针LOOPNEXTMOV DI AX 存和POPDI 恢复寄存器内容POPSI POPCX POPAX POPBP RET6 返回并调整SP指针ARY SUMENDPCODE2ENDSENDMAIN 返回 程序6 6中所有入栈操作对堆栈的影响 返回 程序6 6中主程序的RET执行前堆栈状态 例5 完成数组求和功能 其中求和由子程序实现 要求使用结构访问堆栈中的参数 编码见程序6 7 返回 SS SP BP 程序6 7的堆栈及结构数据示意图 结构 程序6 7 STACKSGSEGMENTSTACK STK DW16DUP S STACKSGENDSDATASEGMENTARYDW1 2 3 4 5 6 7 8 9 10COUNTDW ARY 2SUMDW DATAENDS CODE1SEGMENTMAINPROCFARASSUMECS CODE1 DS DATAPUSHDSXORAX AXPUSHAXMOVAX DATAMOVDS AX LEABX ARYPUSHBX 压入数组起始地址LEABX COUNTPUSHBX 压入元素个数地址LEABX SUMPUSHBX 压入和地址CALLFARPTRARY SUMRETMAINENDPCODE1ENDS CODE2SEGMENTASSUMECS CODE2STACK STRCSTRUC 定义结构SAVE BPDW SAVE CS IPDW2DUP SUM ADDRDW COUNT ADDRDW ARY ADDRDW STACK STRCENDS ARY SUMPROCFAR 数组求和子程序PUSHBP 保存BP值MOVBP SPPUSHAXPUSHCXPUSHSIPUSHDIMOVSI BP ARY ADDR 数组始地址MOVDI BP COUNT ADDRMOVCX DI MOVDI BP SUM ADDR 得到和地址XORAX AX NEXT ADDAX SI 累加ADDSI TYPEARY 修改地址指针LOOPNEXTMOV DI AX 存和POPDIPOPSIPOPCXPOPAXPOPBPRET6 返回并调整SP指针ARY SUMENDPCODE2ENDSENDMAIN 子程序嵌套示意图 返回 6 3嵌套与递归子程序 1 子程序嵌套 以下是求N 递归过程的描述 编码见程序6 8 2 递归子程序 BEGINFACT N RESULT SAVEREGISTERONSTACKIFN 0RESULT 1ELSEPUSHADDRESSOFRESULTONTOSTACKPUSHN 1ONTOSTACKCALLFACT N 1 RESULT RESULT N RESULTENDIFRESTOREREGISTERSFROMSTACKDELETEPARAMETERSFROMSTACK N 流程图 返回 程序6 8 STACKSGSEGMENTSTACK S 定义堆栈DW128DUP ST STACKSGENDSDATASEGMENTN VALDW3 定义N值RESULTDW 结果DATAENDS CODESEGMENTASSUMECS CODE DS DATA SS STACKSGFRAMESTRUC 定义帧结构SAV BPDW 保存BP值SAV CS IPDW2DUP 保存返回地址NDW 当前N值RESULT ADDRDW 结果地址FRAMEENDS MAINPROCFARMOVAX DATAMOVDS AXLEABX RESULTPUSHBX 结果地址入栈PUSHN VAL N值入栈CALLFARPTRFACT 调用递归子程序R1 MOVAX 4C00HINT21HMAINENDP FACTPROCFAR N 递归子程序PUSHBP 保存BP值MOVBP SP BP指向帧基地址PUSHBXPUSHAXMOVBX BP RESULT ADDRMOVAX BP N 取帧中N值CMPAX 0JEDONE N 0时退出子程序嵌套PUSHBX 为下一次调用压入结果地址DECAXPUSHAX 为下一次调用压入 N 1 值CALLFARPTRFACT R2 MOVBX BP RESULT ADDRMOVAX BX 取中间结果 N 1 MUL BP N N N 1 JMPSHORTRETURNDONE MOVAX 1 0 1RETURN MOV BX AX 存中间结果POPAXPOPBXPOPBPRET4FACTENDPCODEENDSENDMAIN 程序6 8的运行情况 主程序把结果地址和N的初始值压入堆栈 然后调用FACT子程序 在FACT中 它不断调用自身 每调用一次都要在堆栈中形成一帧 该帧由以下信息组成 子程序中要用到的寄存器内容 中间结果地址 N 1 的值 子程序返回地址 自身调用直到N 0为止 当N 0时开始返回 通过 BP RESULT ADDR和 BP N取出堆栈中本次使用的参数 计算N N 1 的值 保存中间结果 恢复寄存器的值 用RET4返回并废除已用过的N和中间结果地址 重复第 步 逐层返回直到N等于初始值为止 6 4宏指令 在高级汇编语言技术中 一段共用语句序列除了可以设计成子程序外 还可以设计成宏指令的形式 6 4 1宏定义 宏调用 宏扩展 宏指令是源程序中一段有独立功能的程序代码 宏指令由宏定义伪指令定义 它只需在源程序中定义一次 便可以多次被调用 宏指令名MACRO 形式参数表 宏指令体ENDM 宏定义伪指令格式 宏调用 宏指令一经定义 就可以在程序中调用它 这被称为宏调用 宏调用格式 宏指令名 实参数表 宏扩展 宏扩展就是用宏定义体替换宏指令名 并用实参数替换形式参数 例1 输入一个字符的宏定义 宏调用 宏扩展 宏定义INCHARMACROMOVAH 1INT21H 输入的字符在ALENDM 宏调用INCHAR当汇编程序汇编到宏指令INCHAR时 则对其扩展如下 1MOVAH 11INT21H 指令前的 1 表示该语句是扩展时替换得到的 设计宏指令时应注意的问题 由于宏指令也像子程序那样可以被多次调用或被多个程序共享 所以在设计时需要注意以下问题 1 宏指令说明2 寄存器的保存与恢复3 宏指令中的符号说明 6 4 2LOCAL伪指令 格式 LOCAL局部符号表功能 对局部符号表中的每个符号 在汇编时每扩展一次便建立一个惟一的符号 形如 xxxx xxxx的值在0000 FFFF之间 以保证汇编时生成名字的惟一性 例2 以下是定义一个延时程序的宏指令delay 并且在同一个程序中两次被调用的扩展情况 宏定义DELAYMACROLOCALLOPMOVCX 2801LOP LOOPLOPENDM 宏调用 DELAYDELAY汇编时宏扩展如下 DELAY0009B90AF11MOVCX 2801000CE2FE1 0000 LOOP 0000DELAY000EB90AF11MOVCX 28010011E2FE1 0001 LOOP 0001 宏指令中参数的使用 在宏定义时可以带有形式参数 而在宏调用时给出实参数即可 宏指令的参数可以是常数 寄存器 变量 表达式 操作码或操作码的一部分 指令或伪指令助记符等 例3 定义在两个字型内存变量之间传送数据的宏指令 并调用它 然后观察其扩展情况 MOVEMOCROX YPUSHAXMOVAX XMOVY AXPOPAXENDM DATASEGMENTVAR1DW6543HVAR2DW DATAENDS 宏调用 宏扩展MOVEVAR1 VAR21PUSHAX1MOVAX VAR11MOVVAR2 AX1POPAX 6 4 3宏指令嵌套 宏指令嵌套有两种情况 宏定义体中含有宏调用 宏定义体中含有宏定义 DMACMACROMNAME OPER 外层宏定义MNAMEMACROX Y Z 内层宏定义PUSHAXMOVAX XOPERAX YMOVZ AXPOPAXENDMENDM 例4 宏定义体中嵌套宏定义的宏指令 宏调用及宏扩展示例 ADW25BDW12CDW DMACADDITION ADD 外层宏调用1ADDITIONMACROX Y Z1PUSHAX1MOVAX X1ADDAX Y1MOVZ AX1POPAX1ENDM ADDITIONA B C 内层宏调用1PUSHAX1MOVAX A1ADDAX B1MOVC AX1POPAX DMACLOGIC AND AND 外层宏调用1LOGIC ANDMACROX Y Z1PUSHAX1MOVAX X1ANDAX Y1MOVZ AX1POPAX1ENDM LOGIC ANDA B C 内层宏调用1PUSHAX1MOVAX A1ANDAX B1MOVC AX1POPAX 使用适当的实参数 通过调用DMAC宏指令可以生成另一条新的宏指令 再调用新宏指令可以实现任何双操作数指令的操作 而且两个操作数可以同时为存储器操作数 这种方法使得宏的功能更强大 PURGE伪指令 格式 PURGE宏指令名 功能 从内存中删除指定的宏指令 例 PURGEINCHAR 6 4 4宏操作符 这些操作符不仅适用于宏指令 也适用于重复汇编伪指令 宏操作符格式名称注释宏注释 1 操作符 在宏定义体中 可以作为形式参数的前缀 而当宏扩展时则把 前后两个符号合并形成一个符号 这个符号可以是操作码 操作数或是一个字符串 例5 下面定义的PutData宏指令中 参数TheName作为变量名的一部分 通过 把前后两个符号合并成一个变量名 在Jump宏指令中 参数Cond作为操作码的一部分 通过 把前后两个符号合并成一个指令助记符 PUTDATA宏指令PUTDATAMACROTHENAME THEDATAPD 宏扩展1PD MYDATADB5 JUMP宏指令JUMPMACROCOND LJ宏扩展1JNELAB1 在宏指令中 当使用宏定义PUTDATA0MACROTHENAME THEDATALOCALPD THENAMEPD THENAMEDBTHEDATAENDM 宏调用PUTDATA0MYDATA 5 宏扩展1 0000MYDATADB5 宏调用PUTDATA0MYDATA 8 宏扩展1 0001MYDATADB8 返回 由操作符括起的内容作为一个整体原样传递 例如 可以使用符号包围目标 从而使该目标作为单一的参数而不是多个参数的列表 例6 用不同的实参数调用PUTDATA宏指令 观察它们的变化 PUTDATAMACROTHENAME THEDATAPD 宏扩展1PD MYDATADB5 2 文本原样传递操作符 宏调用2PUTDATAMYDATA 宏扩展1PD MYDATADB5 4 3 又如以下符号定义语句 Numeric 10 2Textualequ其汇编结果是 NUMERIC NUMBER000CTEXTUAL TEXT10 2可以看到 对Numeric已经求值 而Textual只是一串字符而已 返回 3 字符原意操作符 操作符指示MASM把后跟的一个字符原样传送 即把它只作为普通字符对待 例如 若你需要把 符号中的一个作为宏指令中的字符 可以使用 操作符 例7 以下宏调用的第二个实参数是一串警告信息 其中最后一个字符希望是感叹号 但 是宏操作符 要想把 当做其原意感叹号对待 就需在它前边加上宏操作符 宏定义DEBUGMSGMACROPOINT STRINGMSG宏扩展1MSG6DB ATPOINT6 INSERTIONFAILS 4 表达式操作符 在宏调用时 操作符强迫后跟的表达式立即求值 并把表达式的结果作为实参数替换 而不是表达式本身 例8 定义Problem1宏指令 并比较两次调用Problem1宏指令的区别 其中一次调用中使用了 操作符 Problem1宏指令功能 把由宏指令参数所指定的字型数组 array 的一个元素装入AX寄存器 该参数经汇编后必须是一个常数表达式 PROBLEM1MACROPARAMETERMOVAX ARRAY PARAMETER 2 ENDM 宏调用1 希望取出ARRAY12 其中的参数 10 2 是表达式本身PROBLEM110 2 宏扩展1 1MOVAX ARRAY 10 2 2 实际取出的是ARRAY7 正确的表达是 宏调用2 PROBLEM1 10 2 宏扩展2 1MOVAX ARRAY 12 2 注意 由于MASM在调用宏指令时对其中的参数经常是原文替换 所以有时产生的可能不是预期的结果 考虑以下对PROBLEM1的宏调用及宏扩展 宏调用 要求装入ARRAY的元素2PROBLEM12 宏扩展1MOVAX ARRAY 2 2 可以看到 宏扩展后结果正确 宏调用 装入ARRAY的元素10 INDEX 8PROBLEM1INDEX 2 宏扩展1MOVAX ARRAY INDEX 2 2 因为MASM的地址表达式遵守操作符优先级的优先规则 则该语句宏扩展后不是预想的结果 它访问的是元素6 索引12 而不是元素10 索引20 为了能够得到正确的结果 可以在宏指令的参数表达式中用 把参数括起来 宏定义PROBLEM2MACROPARAMETERMOVAX ARRAY PARAMETER 2 ENDM 宏调用INDEX 8PROBLEM2INDEX 2 宏扩展1MOVAX ARRAY INDEX 2 2 5 宏注释 在宏定义中 若注释以一个分号开始 则该注释在宏扩展时出现 但若注释以两个分号开始 则该注释在宏扩展时不出现 举例见列表伪指令 返回 6 4 5列表伪指令 格式功能 LALL在列表文件中列出全部宏文本内容 以双分号开头的注释除外 SALL在列表文件中不显示任何宏文本内容 XALL 缺省 在列表文件中只列出可产生目标代码的宏文本内容注意 这些列表伪指令只影响列表文件 并不影响目标码的生成 6 5宏指令库 为了使宏指令能让多个程序共享 可以把它们组织到一个文件中 并存放在磁盘上 把这种文件称为宏指令库 1 建立宏指令库可以把一些常用的宏指令集中在一个文件中形成宏指令库 用EDIT等任何文本编辑程序创建宏指令库 库名由用户自己起 而且对库的扩展名没有特殊要求 库中的宏指令以源代码形式出现 假设MACRO LIB中包含以下宏指令 详细内容见教材P174 SETMODE 设置80 25彩色显示模式INCHAR 接收一个字符 并返回在AL中OUTCHARX 输出X字符PUSHREG 保存寄存器DX CX BX AX DI SI BPPOPREG 恢复寄存器BP SI DI AX BX CX DX WINDOWMACROCollor WleftTopRow WLeftTopCul WRightBottomRow WRightBottomCul 功能 开窗口MOVEMOCROX Y 字型数据X送Y变量CLRSCRN 清屏CURSOR 置光标 入口参数 DH DL 行 列号RETURN 返回操作系统 BIN DECMACROASC BIN 功能 把16位二进制数转换为十进制数的 ASCII值 ASC为5个字节的十进制数缓冲区 BIN为要转换的二进制数 DISPMACROASC 显示首址为ASC的字符串 2 把宏指令库包含到应用程序中格式 INCLUDE源文件名功能 把另一个源文件包含到当前源文件中 3 使用宏指令库中的宏指令例9 实现32位二进制数除以16位二进制数 并把结果用十进制数形式显示在屏幕上 编码见程序6 9 程序6 9 INCLUDEMACRO LIBPURGESETMODE INCHAR OUTCHAR WINDOW MOVE MULSTACKSGSEGMENTSTACK S DW16DUP STACKSGENDSDATASEGMENTADD7006652 被除数BDW1234 除数CDW 商PROMPTDB Theresultis ASCIIDB5DUP 转换结果DATAENDS CODESEGMENTASSUMECS CODE DS DATA SS STACKSGMAINPROCFARMOVAX DATAMOVDS AXMOVDX WORDPTRA 2MOVAX WORDPTRADIVB BIN DECASCII AXCLRSCRNDISPPROMPTDISPASCIIRETURNMAINENDPCODEENDSENDMAIN 4 宏指令与子程序的区别 采用宏和子程序均能达到代码共享 简化源程序的目的 但它们的区别也是显而易见的 区别主要有以下几点 1 工作方式的区别 2 参数传递的方便性 3 参数的多样性及灵活性 通常 宏指令被用在代码较短且参数较多的场合 子程序被用在代码较长的场合 6 6重复伪指令 当程序中需要重复书写相同或几乎相同的语句时 可以用重复伪指令定义重复块 以简化程序和减轻程序设计人员的工作量 绝大部分MASM版本提供了REPT IRP和IRPC重复伪指令 而在MASM6 X中还提供了其它重复伪指令 6 6 1重复伪指令REPT 格式 REPT数值表达式 重复块ENDM功能 汇编程序使重复块的内容重复多次 重复次数由表达式给出 说明 重复块中可以出现任何有效的汇编语句 数值表达式的计算结果应该是无符号常数 DATASEGMENTTABLELABELWORDX 5REPT6 重复6次DWX X X 定义立方值X X 1ENDMDATAENDS 汇编后的情况如下 1 0000DATASEGMENT 2 0000TABLELABELWORD 3 0005X 5 4 REPT6 5 DWX X X 6 X X 1 7 ENDM 8 0000007D1DWX X X 9 000200D81DWX X X 10 000401571DWX X X 11 000602001DWX X X 12 000802D91DWX X X 13 000A03E81DWX X X 14 000CDATAENDS第 8 到第 13 行是汇编后的情况 在代码段中可以通过TABLE名来引用这些值 MOVBX 10REPT2DECBXENDM汇编后产生如下语句 MOVBX 101DECBX1DECBX CHARSMACRONUMMOVAH 2CHAR A REPTNUMMOVDL CHARINT21HCHAR CHAR 1ENDMENDM CODESEGMENTASSUMECS CODEMAINPROCFARCHARS26MOVAX 4C00HINT21HMAINENDPCODEENDSENDMAIN从本例可以看出 重复伪指令可以出现在宏指令中 CHARSMACRONUMMOVAH 2CHAR A REPTNUMMOVDL CHARINT21HCHAR CHAR 1ENDMENDM 0000CODESEGMENTASSUMECS CODE0000MAINPROCFARCHARS260000B4021MOVAH 20002B2412MOVDL CHAR 字符A0004CD212INT21H0006B2422MOVDL CHAR 字符B0008CD212INT21H 0066B25A2MOVDL CHAR 字符Z0068CD212INT21H006AB84C00MOVAX 4C00H006DCD21INT21H006FMAINENDP006FCODEENDSENDMAIN 6 6 2不定重复伪指令 1 IRP伪指令格式 IRP形式参数 实参数 重复块ENDM功能 汇编程序使重复块的内容重复多次 重复次数由实参数个数决定 每次重复都用尖括号中的一个实参数替代形式参数 依次使用实参数 直到用完为止 例1 实参数可以是符号 IRPREG PUSHREGENDM汇编后产生以下指令 1PUSHAX1PUSHBX1PUSHCX1PUSHDX IRPX DBXENDM汇编后产生的 LST文件 00
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年自助餐饮服务站项目可行性研究报告及总结分析
- 2025年环保垃圾分类及处理项目可行性研究报告及总结分析
- 2025年虚拟试衣技术应用开发可行性研究报告及总结分析
- 2025年企业团建餐饮合作协议
- 2025年绿色旅游发展规划项目可行性研究报告及总结分析
- 2025年互联网金融平台搭建可行性研究报告及总结分析
- 2025年城市空气净化系统建设可行性研究报告及总结分析
- 2025年农业灌溉水泵售后服务合同协议
- 2025年养老产业综合体建设项目可行性研究报告及总结分析
- 2025全国安全知识网络竞赛试题及答案
- 2025年消防工程师真题及答案
- 黑龙江省哈尔滨市第三十二中学2025-2026学年高二上学期11月期中考试语文试题(原卷版)
- 2025年四川省泸州市中考英语试卷
- 技术经纪人培训教程大纲
- 2025国泰租赁有限公司招聘笔试历年备考题库附带答案详解试卷3套
- 视频监控系统工程监理细则
- 2025天津滨海传媒发展有限公司招聘13人笔试考试参考题库及答案解析
- 2025年变电设备检修工(中级)技能鉴定理论考试题库(含答案)
- 2025年电磁学试题及答案解析
- 2025年商铺停车管理合同协议
- 湖北环境保护与可持续发展策略探讨
评论
0/150
提交评论