微机原理第五章 程序设计-dsh
- 格式:ppt
- 大小:271.50 KB
- 文档页数:86
第5章程序设计方法和上机调试第五章《程序设计方法和上机调试》轨道交通与电力牵引技术研究所本章介绍以下内容分支结构 循环程序结构 子程序结构 综合举例汇编程序的设计方法唐建湘Tel:2656809 tang2656809@2009-8-30上机调试过程 宏汇编和条件汇编1中南大学信息院电气工程系2009-8-30中南大学信息院电气工程系2汇编语言程序设计的一般步骤流程图汇编语言程序设计一般有以 下几个步骤: 分析问题,确定算法 绘制流程图,分配存储区 根据流程图编制程序 调试程序2009-8-30中南大学信息院电气工程系磨 刀 不 误 砍 柴 工31.流程图的概念 流程图是由特定的几何图形,指向线, 文字说明来表示数据处理的步骤,形 象描述逻辑控制结构以及数据流程的 示意图.流程图具有简洁,明了,直 观的特点. 2.流程图符号表示 (1)起止框:表示 程序的开始和结束.起止框2009-8-30中南大学信息院电气工程系4流程图流程图(2)判断框 (3)处理框(5)指向线(4)调用框5(6)连接框2009-8-30中南大学信息院电气工程系2009-8-30中南大学信息院电气工程系615.1汇编程序的设计方法5.1.1顺序结构本节介绍以下内容:例:内存中TABLE开始存放0-9的平方值,通过人机对话,当任给定一个X (0-9),查表得X的平方值,放在AL中.顺序结构 分支结构 循环程序结构 子程序结构 综合举例DATA SEGMENT 段定义语句:将一个逻辑段定义成一个整体 TABLE DB 0,1,4,9,16,25,36,49,64,81 BUF DB 'Please input one number:',0DH,0AH,'$' 分类名 DATA ENDS 定位类型:指定段的起始地址 STACK SEGMENT PARA STACK ' STACK' DB 50 DUP(?) 指定段的类型 TOP THIS WORD STACK ENDS 定义TOP为栈底名,类型为字 CODE SEGMENT 段分配语句 ASSUME CS:CODE,DS:DATA,SS: STACK MAIN PROC FAR 72009-8-30中南大学信息院电气工程系2009-8-30中南大学信息院电气工程系8START:NEXT:MOV MOV MOV MOV MOV MOV MOV MOV INT MOV INT MOV AND ADD MOVAX,DATA DS,AX AX,STACK SS,AX SP, OFFSET TOP BX,OFFSET TABLE DX,OFFSET BUF AH,9 21 AH,1 21 AH,0 AL, 0FH BX,AX AL,[BX];送数据段段地址 ;送堆栈段段地址 ;堆栈段偏移量送SP ;平方表有效地址送BX ;提示输入一个数 ; 9号功能调用,(显示字符串) ;1号功能调用,(输入字符并显示) ;键入数送入AL A*D ;屏蔽高四位 ;表首加偏移量 ;查表得平方值送AL ;带参数返回DOS ;返回DOS ;过程MAIN结束 ;代码段结束 ;汇编结束 B*C例1:两个32位无符号数的乘法A B D B*D*CMAIN CODE2009-8-30MOV AH,4CH INT 21H RET ENDP ENDS END START+A*CBX+0 +2 * 积3 * +4 积1 +6 + 部分积1 和1 +8 +A 部分积2 +C 部分积3 +E 部分积4最后乘积B A D C 积1L 积1H 和2 和1L 和2 L 和1H 和3 和3H* 积2 + 积1H * 积4 + 和2H乘法运算过程示意图 10中南大学信息院电气工程系92009-8-30中南大学信息院电气工程系设地址指针 被乘数的低16位B送AXname 32 bit multiply进位加至部分和1H,存内存 B×C=部分积3 DATA SEGMENT MULNUM DW 0000,0FFFFH,0000,0FFFFH,4DUP( ?) DATA ENDS STACK SEGMENT PARA STACK ' STACK' STAK DB 100 DUP(?) TOP EQU LENGTH STAK STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS: STACK, ES :DATA START PROC FAR BEGIN: PUSH DS MOV AX,0 PUSH AX MOV AX, DATA ;送数据段段地址 MOV DS,AX MOV ES, AX MOV AX,STACK ;送堆栈段段地址 MOV SS,AX MOV SP, OFFSET TOP ;堆栈段偏移量送SP乘数的低16位D送SI 乘数的高16位C送DI B×D存部分积1部分积3+部分和1,存内存 存进位 A×C=部分积4被乘数的高16位A送AX A×D=部分积2 部分积2L+部分积1H部分积4+部分和2H+ 进位=和3 存和3 返回2009-8-30中南大学信息院电气工程系112009-8-30中南大学信息院电气工程系122LEABX,MULNUM ; B送 AX ; D送SI ; C送DI ; B*D ; 保存部分积1 ; A送AX ; A*D ; 部分积2L与部分积1H相加 ; 存和1 ; B送AX ; C*B,部分积3 START CODEMULU32: MOV AX ,[BX] MOV SI ,[BX+4] MOV DI ,[BX+6] MUL SI MOV [BX+8] ,AX MOV [BX+0AH] ,DX MOV AX ,[BX+2] MUL SI ADD AX ,[BX+0AH] ADC DX ,0 MOV [BX+0AH] ,AX MOV [BX+0CH] ,DX MOV AX ,[BX] MUL DIADD AX ,[BX+0AH] ADC DX ,[BX+0CH] MOV [BX+0AH] ,AX MOV [BX+0CH] ,DX PUSHF MOV AX ,[BX+2] MUL SI , POPF ADC AX , [BX+0CH] ADC DX ,0 MOV [BX+0CH] ,AX MOV [BX+0EH] ,DX RET ENDP ENDS END BEGIN;部分积3与和1相加 ;存和2 ;保护进位位 ; A送 AX ;A×C,得积4 ;恢复进位位 ; 部分积4L与和2H相加; 存和32009-8-30中南大学信息院电气工程系132009-8-30中南大学信息院电气工程系145.1.2分支结构二分支 多分支 跳转表实现多分支例3:在以BUF为首地址的 内存,存放着一个长度为N (N<256)的字符串,编程统 计其中数字,字母和其它字 符的个数,统计数存放在串 后三个单元中.'0'—'9' 初始化 取一字符送AL (AL)≥30H Y (AL)>39H Y (AL) ≥41H N 'A'—'Z'30H—39H 41H—5AHADH送内存 DL送内存N DH+1根据表内地址分支 根据表内指令分支 根据关键字分支2009-8-30中南大学信息院电气工程系 15NAL=N-DH-DL AL送内存 RET NDL+1 初始化:N送CX; 0送DX; 0送BX; BX为串偏移量, MOV AL,BUF[BX]NY (AL)>5AH Y修改BX及(CX)-1 (CX)=0 Y2009-8-30中南大学信息院电气工程系 A162,多分枝有的分枝结构为多分枝,可依次测试条件是否满足,若满足 条件则转入相应分枝入口,若不满足继续向下测试,直到全部 测试完.简单,直观,速度慢. 例:有8个加 工子程序,入 口地址分别为 P1,P2,… P8.编程实现 检测键盘输入 命令,使系统 分别转向8个 加工子程序. 局限性?MOV AH,1 INT 21H ;1号功能调用,键盘输入 CMP AL,'1' JE P1 ;键值为1,转P1 CMP AL,'2' JE P2 ;键值为2,转P2 CMP JE JMP P1:… P2:… P8:… ST: HLT AL,'8' P8 ST3,跳转表实现多分枝利用跳转表实现多分枝,可以直接找到相应入口,利用该法需建立 一个跳转表,表中含每个分枝的入口地址. (1)根据表内地 址分枝 BASE+0 跳转表中存放了 每个分枝程序的 BASE+2 入口地址,只要 找到表地址,再 将其内容取出, 即可得到每个分 P0 枝程序的入口地 址. P1 表地址=跳转表首 址+偏移地址 MOV BX,OFFSET BASE 开始 P0L P0H P1L P1H . . . . . . . . . 输入键值 表首地址BX 求偏移量 计算地址 散转 跳转表在内存中 的存放方法 JMP WORD PTR [BX] AND ADD MOV ADD AL,0FH AL,AL AH , 0 BX,AX;键值为8,转P8 ;非法键,转停机 ; 1号键加工子程序 ; 2号键加工子程序 ;8号键加工子程序2009-8-30中南大学信息院电气工程系172009-8-30中南大学信息院电气工程系183(2)根据表内指令分枝跳转表中存放着转移指令,查表后程序执行转移指令将转到相应的子程序去. MOV AH,1 BASE JMP P1L P1H JMP P2L P2H . . . . . . . . . INT 21H ;键入到AL(3)根据关键字分枝跳转表中存放关键字及相应分枝地址. 分枝流程图BASEAND AL,0FH MOV AH,0 MOV BL,ALADD AL,AL ADD AL,BL ;偏移量=键值*3 MOV ADD BX,OFFSET BASE BX,AX ;得转移地址 ;转入转移指令 P1 P231 P1L P1H 32 P2L P2H . . . . . . . . .开始 输入关键字Y关键字=0 N 首地址送BX 与关键字比较 相等 N 指针加3 YP1 P2JMP BX 转移指令跳转表转移2009-8-30中南大学信息院电气工程系19关键字跳转表2009-8-30中南大学信息院电气工程系20例:首地址为BUFFER的数组已按升序排好,长度为N(=10),在数组中查找 数M(=80),若找到则从数组中删掉,否则将它插入正确的位置,DX中记录 数组最后的长度. AX=80 CX=10 DX=10 数组中无M 搜索有无关键字 10 CX=9 MOV DI,OFFSET BUFFER AX≠ CLD REPNE SCASW 寻找插入位置 SI=2*(DX–1) CMP AX,BUFFER[SI]搜索有无关键字 MOV DI,OFFSET BUFFER CLD REPNE SCASW 搜索到,后续元素前移 MOV BX,[DI] MOV [DI-2],BX ADD DI,2数组中有数M AX=80 AX≠ AX≠ AX≠ AX≠ AX≠ AX≠ AX≠ AX = CX=10 DI=BUFFER CX=9 CX=8 CX=7 CX=6 CX=5 CX=4 CX=3 DI=BUFFER+2 DI=BUFFER+4 DI=BUFFER+6 DI=BUFFER+8 DI=BUFFER+A DI=BUFFER+C DI=BUFFER+E25 CX=8 边 36 AX≠ CX=7 界 48 AX≠ CX=6 条 53 AX≠ CX=5 件 58 AX≠ CX=4 元素下移 MOV BX,BUFFER[SI] 问 70 AX≥ BUFFER[SI-2] AX≠ CX=3 MOV BUFFER[SI+2],BX 80 82 AX≥ BUFFER[SI-2] AX≠ CX=2 题 插入 82 90 AX≥ BUFFER[SI-2] AX≠ CX=1 MOV BUFFER[SI+2],AX 90 98 AX≥ AX≠ BUFFER[SI] CX=0 98 DX=11 21 中南大学信息院电气工程系 2009-8-30AX≠BX=[DI]=(BUFFER+10H) BX=[DI+2]=(BUFFER+12H)10 25 36 48 53 58 70 90 80 98 90 98CX=2 DI=BUFFER+10H DI-2 CX-1=1 DI-2 CX-1=0 DX=92009-8-30中南大学信息院电气工程系22初始化串扫描查找 Y 找到 N 设置串尾比较指针SI 关键字>[SI] N 数组元素下移 修改比较指针SI Y初始化:M送AX; N送CX,DX; 地址偏移量送DI; 增量修改指针 CLD YDATA(CX)=0 N DI 所指元素上移 修改比较指针DI (CX)-1=0 Y 数组长度-1 N插在SI所 指单元后 数组长度+1结束SEGMENT BUFFER DW 5,10,32,47,53,77,89,106,115,124 N DB 10 M EQU 80 DATA ENDS CODE SEGEMENT ASSUME CS:CODE,DS:DATA,ES:DATA MAIN PROC FAR START: PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV ES,AX ; MOV AX,M ;待查数 送AX MOV CX,N ;数组长度送 CX MOV DX,N MOV DI,OFFSET BUFFER CLD REPNE SCASW ;串扫描查找2009-8-30中南大学信息院电气工程系232009-8-30中南大学信息院电气工程系244JE DEL ;查到,ZF=1 DEC DX ;未查到,插入 MOV SI,DX ;关键字与最后数比较 ADD SI,DX L1: CMP AX,BUFFER[SI] JL L2 ;关键字比数组中某个字小,转L2 MOV BUFFER[SI+2], AX ;大,则插在后面 JMP L3 L2: MOV BX,BUFFER[SI] ;数组下移一位 MOV BUFFER[SI+2], BX SUB SI,2 JMP L1 L3: ADD DX,1 ;修改长度 JMP NEXT1 DEL: JCXZ NEXT ;找到,删此元素 DEL1: MOV BX,[DI] ;其后元素依次前移 MOV [DI-2],BX ADD DI,2 LOOP DEL1 NEXT: DEC DX ;改变数组长度 NEXT1: RET MAIN ENDP CODE ENDS 25 END 中南大学信息院电气工程系 2009-8-30START5.1.2循环结构常规结构 先执行,后判断. 先判断,后执行.方法控制循环 用计数控制循环 用逻辑尺控制循环多重循环2009-8-30中南大学信息院电气工程系 262. 多重循环程序设计冒泡排序算法在以BUF为首址的字存储区中存放有N 个有符号数,现需将它们按大到小 的顺序排列在BUF存储区中,试编写 其程序. 我们采用冒泡排序算法从第一个数开 始依次对相邻两个数进行比较,如 次序对,则不交换两数位置;如次 序不对则使这两个数交换位置.2009-8-30中南大学信息院电气工程系 27数 10 8 16 90 32 第一遍 10 16 90 32 8 第二遍 16 90 32 10 8 第三遍 90 32 16 10 8 程序流程图如图5-10所示.2009-8-30中南大学信息院电气工程系28冒泡排序算法程序如下: DATA SEGMENT BUF DW 3,-4,6,7,9,2,0,-8,9,-10,20 N=($-BUF)/2 DATA ENDS STACK SEGNMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME CS : CODE , DS : DATA,SS:STACK2009-8-30中南大学信息院电气工程系292009-8-30中南大学信息院电气工程系305冒泡排序算法START: MOV AX,DATA MOV DS,AX MOV CX,N DEC CX MOV DX,CX MOV BX,0 MOV AX,BUF[BX] CMP AX,BUF[BX+2] JGE L XCHG AX , BUF[BX+2] MOV BUF[BX],AX中南大学信息院电气工程系 31冒泡排序算法L: ADD BX,2 DEC CX JNE LOOP2 MOV CX,DX LOOP LOOP1 MOV AH,4CH INT 21H ENDS END START中南大学信息院电气工程系 32LOOP1: LOOP2:CODE2009-8-302009-8-30冒泡排序算法5.1.3子程序结构程序运行后,BUF区中的内容 如下: 20,9,7,6,3,2,0,-4,8,-9,-10 若要对N个无符号数按由大到 小的顺序排列, 只需将指令 "JGE L"改为"JAE L"即可.2009-8-30中南大学信息院电气工程系 33汇编语言中多次使用的程序段应 当写成一个相对独立的程序段, 将这样的程序段定义为"过程"或 称子程序. 每一个子程序包括在过程定义语 句PROC…ENDP中间. 过程的距离属性有:NEAR / FAR 过程调用的指令:CALL. 过程返回的指令:RET.2009-8-30中南大学信息院电气工程系 34子程序说明子程序说明子程序真正实用在于它的通用性例如:在任意长度,任何地址的 串中搜索任意字符的子程序是广 泛有用的编写子程序时应当用注释语句写明该 子程序的主要信息. 子程序的主要注释信息包括: (1)功能描述子程序的名称,功能及性能(2)子程序中用到的寄存器和存储单元 (3)子程序的入口参数和出口参数 (4)子程序中调用其它子程序的名称352009-8-30中南大学信息院电气工程系2009-8-30中南大学信息院电气工程系366子程序说明PROC NEAR(FAR) PUSH CX MOV CH,AL AND CH,0FH ;名称:BCD2BIN CL,4 ;功能:一个字节的BCD码转换成二进制数 MOV ;所用寄存器:CX SHR AL,CL ;/16 ;入口参数:AL中存两位BCD数 MOV CL,10 ;出口参数:AL存二进制数 MUL CL ;*10 ;调用其它子程序:无 ADD AL,CH ;+低位 POP CX RET BCD2BIN ENDP * 保护调用程序的返回地址,在子程序中特别注意堆栈的使用, 防止弹出地址值出错; * 保护寄存器的内容,注意PUSH,POP指令的使用次序. 37 中南大学信息院电气工程系 2009-8-30 BCD2BIN子程序调用主程序使用CALL指令调用过程过程调用应处理好三个问题: (1)保护调用程序的返址 (2)保护某些寄存器内容 (3) 参数传递用寄存器传递参数 用存储器传递参数 用堆栈传递参数2009-8-30中南大学信息院电气工程系 38子程序调用*子程序的调用和返回 子程序名 PROC 可存放在与主程序同一CS段.调用时使用 CALL (NEAR)指令,称为段内调用. 子程序名 PROC 可存放在与主程序不同的CS段.调用时使 用CALL FAR指令,称为段间调用. *现场保护和恢复 保护和恢复的对象:在子程序中需要使用的内部寄存器. (1)一定要保护:子程序中使用的寄存器;在返回后主程序需继 续使用的寄存器. (2)一定不能保护:作为子程序的结果传送给主程序的寄存器. (3)可不必保护(随意):子程序中使用,返回主程序后不再使用 的寄存器. 39 中南大学信息院电气工程系 2009-8-30子程序调用参数传递技术 (一)利用寄存器传递参数 例如在某子程序中要对两个长度相同的数据缓冲区 进行操作,可在主程序中把缓冲区的长度和首址存入寄 存器中. MOV MOV MOV CALL CX,LENGTH BX,OFFSET BUFFER1 SI, OFFSET BUFFER2 SUBR2009-8-30中南大学信息院电气工程系40(二)利用存储器传递参数SEGMENT 例:编程实现数组段分别求和(不计溢出). ARY1 DW 100 DUP(?) SUM1 DW ? ARY2 DW 100 DUP(?) SUM2 DW ? DATA ENDS STACK SEGMENT STACK SA DW 50 DUP(?) TOP EQU LENGTH SA STACK ENDS CODE SEGMENT ASSUME CS: CODE,DS:DATA,SS:STACK MAIN PROC FAR START: PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX 41 MOV SP,TOP 中南大学信息院电气工程系 2009-8-30 DATA(二)利用存储器传递参数LEA MOV CALL LEA MOV CALL RET ENDP PROC XOR ADD INC INC LOOP MOV RET ENDP ENDS END SI,ARY1 CX,LENGTH ARY1 SUM SI,ARY2 CX,LENGTH ARY2 SUM调用前将数组的偏移 地址放入SI中MAIN SUM L1:NEAR AX,AX AX,WORD PTR[SI] SI SI L1 WORD PTR [SI],AX在过程中通过寄存器 间址就可取得存储器 中的操作数,并通过 存储器返回.SUM CODESTART2009-8-30中南大学信息院电气工程系427(三)利用堆栈传递参数例:编程实现十进制数组求和,段间调用.子程序: SUBR: PUSH MOV MOV BPL MOV BPH MOV IPL IPH POP BUFLL RET BUFLH BP BP,SP CX,[BP+4] DI, [BX+6] SI, [BX+8] MDATA SEGMENT ARY1 DB 20 DUP(?) SUM1 DW ? ARY2 DW 100 DUP(?) SUM2 DW ? MDATA ENDS MSTACK SEGMENT STACK SB DW 100 DUP(?) TOP EQU LENGTH SB MSTACK ENDS MCODE SEGMENT ASSUME CS: MCODE,DS:MDATA,SS:MSTACK MAIN PROC FAR START: PUSH DS SUB AX,AX PUSH AX MOV AX,MDATA MOV DS,AX MOV AX,MSTACK MOV SS,AX 44 MOV SP,TOP 中南大学信息院电气工程系 2009-8-30段说明:DATA SEGMENT BUFFER1 DW BUFA BUFFER2 DW BUFB LENGTH DW BUFL DATA ENDSSP-A SP-9 SP-8 SP-7 SP-6主程序:LEA PUSH PUSH PUSH CALL BX,BUFFER1 [BX] [BX+2] [BX+4] SUBRBPSP-5 SP-4 BUFBL SP-3 BUFBHSP-2 BUFAL SP-1 BUFAH2009-8-30中南大学信息院电气工程系SP43MOV AX,OFFSET ARY1 F SP-10 PUSH AX BP SP-E MOV AX,SIZE ARY1 CX SP-C PUSH AX BX SP-A CALL FAR PTR PADD MOV AX,OFFSET ARY2 IP SP-8 PUSH AX CS SP-6 MOV AX,SIZE ARY2 SP-4 SIZE1 PUSH AX CALL FAR PTR PADD SP-2 ARY1 RET MAIN ENDP SP MCODE ENDS PCODE SEGMENT ASSUME CS: PCODE,DS:MDATA,SS:MSTACK PADD PROC FAR PUSH BX PUSH CX PUSH BP MOV BP,SP PUSHF2009-8-30中南大学信息院电气工程系45MOV MOV MOV NEXT: ADD DAA MOV MOV ADC DAA MOV MOV INC LOOP MOV POPF POP POP POP RET PADD ENDP PCODE ENDS 2009-8-30 END STARTCX,[BP+10] BX,[BP+12] AX,0 AL,[BX] DL,AL AL,0 AL,AH AH,AL AL,DL BX NEXT [BX],AX BP CX BX 4SP-10 SP-E SP-C SP-A SP-8 SP-6 SP-4 SP-2 SPF BP CX BX IP CS SIZE1 ARY1中南大学信息院电气工程系46子程序嵌套与递归调用5.3宏汇编和条件汇编汇编子程序嵌套的层数不限 以堆栈空间能够容纳为限 注意点: 寄存器的保护及恢复汇编子程序可以递归调用宏指令是源程序中一段独立的程 序段,首先对它进行定义,然后 就可用宏指令语句多次调用它 了. 宏指令的使用包括三个方面: 宏定义 宏调用 宏展开472009-8-30中南大学信息院电气工程系2009-8-30中南大学信息院电气工程系488宏定义宏调用指令使用前必须先进行宏定义 宏定义格式为:宏指令名 MACRO 形式参数,形式参数,… ………. <宏体> ………. ENDM经宏定义后的宏指令可以在源程 序中调用,宏调用格式为: 宏指令名 实参,实参 …宏调用需要有宏指令名 若宏定义中有形参,那么宏调用时 必须带有实际参数来替代形参,实 际参数的个数,顺序,类型与形参 一一对应,各个实参之间用逗号分 开.2009-8-30中南大学信息院电气工程系 50宏体:一段有独立功能的程序代码段. 形式参数:又称为哑元,各个哑元之间 用逗号隔开.2009-8-30中南大学信息院电气工程系 49宏展开例5-4不带参数的宏定义,用宏指令来实现将AL 中内容右移4位.宏定义: SHIFT MACRO MOV CL,4 SAR AL,CL ENDM 宏调用: SHIFT 宏展开: 将下段程序插入宏调用语句位置上. +MOV CL, 4 +SAR AL, CL51汇编程序在对源程序汇编 时,对每个宏调用作宏展 开,即用宏定义中的宏体取 代宏指令名,并用实参一一 对应代替形参(即实元取代哑 元),每条插入的宏体指令前 带上加号"+".2009-8-30中南大学信息院电气工程系2009-8-30中南大学信息院电气工程系52例5-5 宏调用中参数传递 宏定义带一个参数,用宏指令实现将AL中内 容右移任意次(<256)宏定义: SHIFT MACRO N MOV CL, N SAR AL, CL ENDM 宏调用1: SHIFT 3 宏调用2: SHIFT 17 宏展开1: +MOV CL, 3 ;AL中内容算术右移3次 +SAR AL, CL 宏展开2: +MOV CL, 17 ;AL中内容算术右移17次 +SAR AL, CL操作码的宏替换宏定义可用部分操作码作参数, 但在宏定义体中必须用"&"作分隔 符,&是一个操作符,它在宏定 义体中可作为哑元的前缀,宏展 开时,可以把&前后两个符号合 并成一个符号. 参看下面的例子:2009-8-30中南大学信息院电气工程系532009-8-30中南大学信息院电气工程系549例5-6操作码宏替换举例宏指令与子程序的区别宏定义: SJP MACRO X, Y, Z, W MOV AX, X C&W AX, Y J&Z NEXT ENDM 宏调用: 宏展开: SJP BX, SI, NZ, MP +MOV AX, BX +CMP AX, SI +JNZ NEXT中南大学信息院电气工程系 55都是一小段可以多次使用的程序:过程调用使用CALL语句,由CPU执 行,宏指令调用由宏汇编程序MASM中 宏处理程序来识别. 过程调用时,涉及工作现场保护和恢 复,执行速度慢.而宏指令调用时,不 需要堆栈操作,执行速度快. 子程序占有空间小,节省内存空间.而 宏调用目标代码长度长,占内存空间 多. 宏指令可以带哑元,调用时可以用实元 取代,使不同的调用完成不同的操作, 灵活性方面超过子程序.2009-8-30中南大学信息院电气工程系 562009-8-30条件汇编条件伪操作语句清单条件汇编是对给定的条件进行测 试,汇编程序根据测试结果,将 一段程序嵌入源程序汇编或不进 行汇编,它的一般格式为:IF条件 (表达式) (指令体1) ;条件为真汇编指令体1 ELSE (指令体2) ;条件为假汇编指令体2 ENDIF2009-8-30中南大学信息院电气工程系 57语句IF IFE IFDEF IFNDEF IFB IFNB IFIDN IFDIF条件说明表达式 表达式 符号 符号 参数 参数 字符串1,字符串2 字符串1,字符串2表达式的值不等于0,条件满足 表达式的值等于0,条件满足 符号已定义或被说明为外部符号,条件满足 符号未定义或未通过外部说明,条件满足 参数为空,条件满足 参数不为空,条件满足 字符串1和字符串2相同,条件满足 字符串1和字符串2不相同,条件满足2009-8-30中南大学信息院电气工程系58例:条件汇编GOTO MACRO L, X, REL, Y IFB <REL> JMP L ELSE 宏调用: GOTO LOOP, SUM, NZ, MOV AX, X 15 CMP AX, Y ::: J& REL L GOTO EXIT ENDIF 宏展开: +MOV AX, SUM ENDM+CMP AX,15 +JNZ LOOP ::: +JMP EXIT2009-8-30中南大学信息院电气工程系5910。