资源预览内容
第1页 / 共63页
第2页 / 共63页
第3页 / 共63页
第4页 / 共63页
第5页 / 共63页
第6页 / 共63页
第7页 / 共63页
第8页 / 共63页
第9页 / 共63页
第10页 / 共63页
亲,该文档总共63页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
新一代汇编语言程序设计第五章 程序设计的基本方法v5.1 程序设计的基本步骤v5.2 顺序程序设计v5.3 分支程序设计v5.4 循环程序设计v5.5 算数运算与代码转换程序设计程序设计的解题程序设计的解题基本步骤如下:基本步骤如下:分析问题分析问题 寻找解决问题的寻找解决问题的思路、方法、算法思路、方法、算法 描述算法描述算法 编写程序实现算法编写程序实现算法 设计测试数据设计测试数据和预期计算结果和预期计算结果 上机调试程序上机调试程序5.1 程序设计的基本步骤程序的基本结构有三种:程序的基本结构有三种:顺序结构、分支结构、循环结构顺序结构、分支结构、循环结构 顺序结构:顺序结构:按语句的书写顺序依次执行。按语句的书写顺序依次执行。1循环结构:循环结构:由条件是否成立,确定是否重复执行某由条件是否成立,确定是否重复执行某段程序。段程序。3分支结构:分支结构:根据不同的条件判断结果,执行不同的根据不同的条件判断结果,执行不同的程序段,实现程序分支。程序段,实现程序分支。 25.3 分支分支程序设计程序设计 程序的分支通过转移指令来实现,因此转移指令的操程序的分支通过转移指令来实现,因此转移指令的操作应该是能够改变程序执行顺序作应该是能够改变程序执行顺序 。 方法方法: : 修改修改CS:IP 4.3.1 转移指令转移指令( (不影响任何标志位不影响任何标志位 ) )无条件转移指令无条件转移指令条件转移指令条件转移指令 转移指令转移指令分为两类分为两类 1)无条件转移指令无条件转移指令指令格式:指令格式:JMP 标号标号 无条件转移到无条件转移到标号标号指向的指令继续执行指向的指令继续执行无条件转移无条件转移段内转移段内转移段间转移段间转移直接寻址直接寻址间接寻址间接寻址(1) 段内转移(段内直接寻址)段内转移(段内直接寻址) 段内转移段内转移只需修改只需修改IP实现转移实现转移 : : 使使IP 标号标号所在行的指令所在行的指令 即:即: (IPIP)= =标号所在行标号所在行指令的偏移地址指令的偏移地址 段内转移分为三种形式:段内转移分为三种形式: 段内直接短转移段内直接短转移 格式:格式:JMP SHORT 标号标号 操作:(操作:(IP)(IP)+D(8位偏移量)位偏移量) 2)条件转移指令条件转移指令 (18条)条)基本格式为:基本格式为: J 标号标号(代表一种转移条件代表一种转移条件 ) 条件转移指令条件转移指令根据检测标志位的状态来判断条件,若条根据检测标志位的状态来判断条件,若条件为真,则转至标号处执行程序,否则顺序往下执行程序件为真,则转至标号处执行程序,否则顺序往下执行程序 。操作:(操作:(IP)(IP)+D (8位偏移量)位偏移量) 条件转移指令条件转移指令转移范围与转移范围与段内短转移段内短转移相同相同例例 :利用条件转移指令:利用条件转移指令构成循环构成循环 MOV CX,100 (循环计数)(循环计数) AGAIN: ADD AX,BX DEC CX JNZ AGAIN 执行执行影响标志位影响标志位的指令(如算术运算、比较及位测试等指令)的指令(如算术运算、比较及位测试等指令)执行适当的条件转移指令检测相应的标志位,根据条件实现转移执行适当的条件转移指令检测相应的标志位,根据条件实现转移1. 判断单个标志位状态v这组指令单独判断5个状态标志之一JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为零(或相等)JS和JNS:利用符号标志SF,判断结果是正是负JO和JNO:利用溢出标志OF,判断结果是否产生溢出JP/JPE和JNP/JPO:利用奇偶标志PF,判断结果中“1”的个数是偶是奇JC/JB/JNAE和JNC/JNB/JAE:利用进位标志CF,判断结果是否进位或借位JccJcc例:JZ/JNZ指令test al,80h;测试最高位jz next0 ;D70(ZF1),转移mov ah,0ffh;D71,顺序执行jmp done ;无条件转向next0:mov ah,0done:.test al,80h;测试最高位jnz next1;D71(ZF0),转移mov ah,0 ;D70,顺序执行jmp done ;无条件转向next1:mov ah,0ffhdone:.例:JS/JNS指令;计算|XY|(绝对值);X和Y为存放于X单元和Y单元的16位操作数;结果存入result mov ax,X sub ax,Y jns nonneg neg ax ;neg是求补指令是求补指令nonneg: mov result,ax例:JO/JNO指令;计算XY;X和Y为存放于X单元和Y单元的16位操作数;若溢出,则转移到overflow处理 mov ax,X sub ax,Y jo overflow .;无溢出,结果正确;无溢出,结果正确overflow: .;有溢出处理;有溢出处理例:JP/JNP指令and al,7fh;最高位置“0”,同时判断“1”的个数jnp next;个数已为奇数,则转向nextor al,80h;否则,最高位置“1”next:.;设字符的;设字符的ASCII码在码在AL寄存器中寄存器中;将字符加上奇校验位;将字符加上奇校验位;在字符;在字符ASCII码中为码中为“1”的个数已为奇数时的个数已为奇数时;则令其最高位为;则令其最高位为“0”;否则令最高位为;否则令最高位为“1”例:JC/JNC指令xor al,al;AL0again:test bx,0ffffh ;等价于 cmp bx,0je next ;相等则转移shl bx,1jnc againinc aljmp againnext:.;AL保存1的个数;记录;记录BX中中1的个数的个数记录BX中“1”的个数xor al,al;AL0 again:cmp bx,0jz nextshl bx,1;也可使用 shr bx,1adc al,0jmp againnext:.;AL保存1的个数另一种做法另一种做法2. 比较无符号数高低v无符号数的大小用高(Above)低(Below)表示v利用CF确定高低、利用ZF标志确定相等(Equal)v两数的高低分成4种关系: 低于(不高于等于):JB(JNAE) CF= ,ZF 不低于(高于等于):JNB(JAE) CF= ,ZF 低于等于(不高于):JBE(JNA) CF= ,ZF 不低于等于(高于):JNBE(JA )CF= ,ZF例:比较无符号数cmp ax,bx ;比较ax和bxjnb next;若axbx,转移xchg ax,bx ;若axbx,交换next:.3. 比较有符号数大小v有符号数的大(Greater)小(Less)需要组合OF、SF标志,并利用ZF标志确定相等(Equal)v两数的大小分成4种关系: 小于(不大于等于):JL(JNGE) SF OF,ZF= 不小于(大于等于):JNL(JGE) SF OF,ZF= 小于等于(不大于):JLE(JNG) SF OF,ZF= 不小于等于(大于):JNLE(JG )SF OF,ZF=JccJcc例:比较有符号数cmp ax,bx ;比较ax和bxjnl next;若axbx,转移xchg ax,bx ;若axbx,交换next:.1. 分支程序设计一、用转移指令实现假如要把连续存放在内存变量名DAT中的三个数按递减次序排列。2024/9/5汇编语言汇编语言 【例4.17】设变量X为带符号整数,试编写一个程序,完成下面的分段函数计算: 题目分析:为了实现上述分段函数的计算,首先要利用上一个例题求出X的绝对值,然后根据X的绝对值判断Y的取值。程序段如下:22DATASEGMENT X DB -36 Y DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE;DS:DATASTART:MOV AX,DATA MOV DS,AX MOV AL,X CMP AL,0 JGE NEXT ;为正,转NEXT NEG AL ;AL中的内容求补NEXT: CMP AL,5 ;|X|和5比较 JGE P1 ;5,转P1 MOV AL,1 ;否则1送AL MOV BL,X ;X送BL中 SUB AL,BL ;结果送AL中 JMP EXIT ;转EXITP1:MOV AL,0 ;0送AL中EXIT: MOV Y,AL ;结果送Y单元 MOV AH,4CH INT 21H ;返回DOSCODE ENDS END START ;汇编结束 23 【例4.19】设计一个程序,统计在内存W单元保存的无符号字变量中有多少个二进制“1”,统计结果送内存N单元保存。 分析:要统计内存W单元保存的无符号字变量中有多少个二进制“1”,可以将该数据送寄存器AX中,通过移位指令将AX中的每一位依次移入进位标志CF中,若CF=1则计数器CL的值加1,这样就可以统计出AX中1的个数。设计源程序如下:。 24DATA SEGMENT W DW 00FFH;定义字数据 N DB ?;定义结果保存单元DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART: MOV AX,DATA;初始化DS MOV DS,AX MOV CL,0;计数器清零 MOV AX,W ;取数到AX AA:AND AX,AX ;逻辑与,判AX=0? JZ CC ;结果为0转移到CC SHL AX,1;逻辑左移1位 JNC BB;无进位转BB INC CL;有“1”则计数 BB:JMP AA;无条件转AA CC:MOV N,CL;结果送N单元 MOV AH,4CH;返回DOS INT 21HCODE ENDS END START;汇编结束 25实验内容v1、设X,Y为存放在X,Y单元中的16位操作数,判断XY,若成立执行X-Y, 否则计算|X-Y|,并把结果存入RESULT中v2、假设有100个16位无符号数存放在数据段,把它们的和求出来,作为32位数存在DX和AX中v3、数据段有一个首地址为ARRAY的N字数组,要求测试其中正数、0、负数的个数,正数个数放在DI中,0的个数放在SI中,并根据N-(DI)-(SI)求得负数的个数放在AX中。用无条件转移指令用无条件转移指令+ +跳转表实现程序分支跳转表实现程序分支 跳转表便于实现多路分支。跳转表便于实现多路分支。 设有若干段分支程序,将每段设有若干段分支程序,将每段分支程序的入口地址分支程序的入口地址(也称(也称跳转地址)组成一个连续存放在内存中的表,称为跳转地址)组成一个连续存放在内存中的表,称为跳转表跳转表。 若有若有n个产品个产品,将这,将这n个产品的加工处理程序(分支程序)个产品的加工处理程序(分支程序)入口地址(分别为入口地址(分别为BR0,BR1,BRn-1)组成跳转表,)组成跳转表,可就利用跳转表取得可就利用跳转表取得BR0,BR1,BRn-1,转移到相应,转移到相应的的分支程序分支程序去处理产品。去处理产品。 由由表地址表地址就可取得分支程序地址就可取得分支程序地址BRn,再将,再将BRn送送IP,实现转移。,实现转移。例:例: 根据学生成绩评定等级:根据学生成绩评定等级:90100分的等级为分的等级为“A”;8089分的等级为分的等级为“B”;7079分的等级为分的等级为“C”,6069分的等分的等级为级为“D”,60分的等级为分的等级为“E” 。分析:分析: 059 6069 7079 8089 90 100 0 1 2 3 4 tab dw br0 , br1 , br2 , br3 , br4 (跳转表)(跳转表) E D C B A(程序见(程序见P84 例例4-10)5.4 循环循环程序设计程序设计根据条件重复执行一段指令就构成了循环程序结构根据条件重复执行一段指令就构成了循环程序结构 。例:例: MOV AX,0 ;累加求和寄存器清;累加求和寄存器清0 MOV BX,OFFSET ARRAY ;数组始址送;数组始址送BX中中 MOV CX,50 ;循循环环控控制制计计数数初初始始化化 AGAIN : ADD AX,BX ADD BX,2 ;数组地址增;数组地址增2,BX指向下一个元素指向下一个元素 DEC CX ;循环控制计数减;循环控制计数减1 JNZ AGAIN ;计数不为;计数不为0时继续循环时继续循环 MOV S,AX ;计数为;计数为0时循环结束,和存于时循环结束,和存于S中中 将将ARRAY数组中的数组中的50个数求和,并将和存入字变量个数求和,并将和存入字变量S中中 。保证循环正常执行和结束的条件:保证循环正常执行和结束的条件:正确地正确地初始化初始化循环控制计数和初始条件循环控制计数和初始条件1正确地正确地检测检测循环条件循环条件2必必须须保保证证能能达达到到循循环环结结束束条条件件 ( (例例如如在在循循环环体体内内有有修改循环控制值修改循环控制值的指令)的指令)3 指令系统提供了专门用于循环结构的循环控制指令,更指令系统提供了专门用于循环结构的循环控制指令,更加简便的地实现循环结构。加简便的地实现循环结构。 5.4.1 循环控制指令循环控制指令循环控制指令的转移范围为:循环控制指令的转移范围为:- -128+127字节字节 格式:格式:LOOP LOOP 标号标号 操作:操作: 如右图所示如右图所示 (段内短转移)(段内短转移)(1)LOOPLOOP指令指令(2)等于继续循环指令等于继续循环指令 格式:格式:LOOPZ/LOOPE LOOPZ/LOOPE 标号标号 (3)不等于继续循环指令不等于继续循环指令格式:格式:LOOPNZ/LOOPNE LOOPNZ/LOOPNE 标号标号 操作:操作: 如右图所示如右图所示 操作:操作: 如右图所示如右图所示 LOOP AGAIN LOOP AGAIN 在前面的求和例子中,可用一条循环指令代替两条指令:在前面的求和例子中,可用一条循环指令代替两条指令: DEC CX JNZ AGAIN例例: MOV CX,80 MOV SI,-1 MOV AL, $ AGAIN: INC SI CMP AL,STRSSI LOOPNE AGAIN MOV LEN,SI设设: STRS DB string$ 求求存放在存放在STRS存储区中的存储区中的字符串长度。字符串长度。要求将要求将 4230H= 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 B30 31 30 30 30 30 31 30 30 30 31 31 30 30 30 30逐位分离开并转换为逐位分离开并转换为再讨论如何分离开各二进制位并转换为再讨论如何分离开各二进制位并转换为ASCII码码先将(先将(num)()(DX)分析如下:分析如下:(DX)= 0 1 0 0 0 0 1 0 0 0 1 1 0 0 0 01 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 (ROL DX,1 ) 0 0 0 0 0 0 0 1 (AND AL,1)0 0 0 0 0 0 0 0+ 0 0 1 1 0 0 0 0 (ADD AL,30H)0 0 1 1 0 0 0 0300 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 (ROL DX,1) 0 0 0 0 0 0 0 1 (AND AL,1)0 0 0 0 0 0 0 1+ 0 0 1 1 0 0 0 0 (ADD AL,30H )0 0 1 1 0 0 0 1310 1 0 0 0 0 1 0 0 0 1 1 0 0 0 0 (ROL DX,1) 0 0 0 0 0 0 0 1 (AND AL,1)0 0 0 0 0 0 0 00 0 1 1 0 0 0 0 30 31 30 30 30 30 31 30 30 30 31 31 30 30 30 1.2.16. binbuf 30+ 0 0 1 1 0 0 0 0 (ADD AL,30H)mov al,dl 根根据据上上述述分分析析,将将(DX)中中的的二二进进制制数数依依次次循循环环左左移移1位位,可可以以使使得得各各个个数数位位的的分分离离(AND)和和ASCII码码转转换换(ADD)操操作作完完全全相相同同,便便于于组组织织循循环环,并并且且循循环环次次数数已已知知(16次)次)。例例4-17(P91):): 将将十进制数(十进制数(number)转换为八进制数。转换为八进制数。 方方法法:(number)/8 保保留留余余数数,除除法法操操作作循循环环次次数数事先未知事先未知,仅当商为,仅当商为0时,循环结束。时,循环结束。 此例为此例为计数计数循环循环 此例为此例为条件条件循环循环 第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法例例4-18 统计统计AXAX中的二进制数含中的二进制数含“1 1”的总个数,程序段如下:的总个数,程序段如下:当型循环与直到型循环当型循环与直到型循环: MOVCX,0 AGAIN: ANDAX,AX;(AX)=0? JZQUIT;是,退出循环是,退出循环 SALAX,1 ;否否,(AX)的最高位移入)的最高位移入CF位位 JNCNEXT;CF=0时,转向时,转向NEXT再次循环再次循环 INCCX ;CF=1,计数器,计数器(CX)(CX) +1 NEXT: JMPAGAIN;再次循环再次循环 QUIT : 上述程序为上述程序为当型循环当型循环程序结构:程序结构:先判断条件,后执行循环先判断条件,后执行循环。第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法 4.4.3 多重循环程序设计多重循环程序设计例例: 分析下述程序的功能分析下述程序的功能:多重循环程序能够解决更复杂的实际问题。多重循环程序能够解决更复杂的实际问题。消耗时间消耗时间延时功能延时功能 mov bl,20 delay: mov cx,9801h;外循环开始;外循环开始 idle: loop idle;内循环体;内循环体 dec bl jnz delay;外循环结束;外循环结束第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法设计设计多重循环程序多重循环程序时注意下面两点:时注意下面两点: (1) 内层循环必须完全内层循环必须完全包含在外层循环内包含在外层循环内 (2) 转移指令只能从循环转移指令只能从循环结构内转到循环结构外结构内转到循环结构外4.5 子子程序设计程序设计 子程序结构是模块化程序设计的重要基础,其子程序结构是模块化程序设计的重要基础,其调用调用和和返返回回分别由分别由CALL和和RET指令完成,子程序设计方法包括:指令完成,子程序设计方法包括:子程序定义子程序定义1参数传递参数传递2子程序的嵌套调用子程序的嵌套调用3子程序的递归调用子程序的递归调用4第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法(1)段内直接调用)段内直接调用 格式:格式:CALL dstCALL dst 操作操作:(:(SP)(SP)- -2 ((SP)+1,(,(SP))(IP)(返回地址返回地址) (IP)(IP)+D (子程序入口地址子程序入口地址) 保护断点地址保护断点地址实现转移实现转移类似段内直接近转移操作类似段内直接近转移操作1) 调用指令调用指令 CALLCALL指令指令的寻址方式类似的寻址方式类似JMPJMP指令,也分为四种调用方式。指令,也分为四种调用方式。 4.5.1 调用与返回指令调用与返回指令 (不影响标志位)(不影响标志位)第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法(2)段内间接调用)段内间接调用 格式:格式:CALL dst 操作:(操作:(SP)(SP)- -2, ((SP)+1,(,(SP))(IP) (IP)(OA) ( (OA是存储器单元地址或寄存器是存储器单元地址或寄存器, (OA)=, (OA)=子程序入口的偏移地址子程序入口的偏移地址)例例4-24 段内间接调用段内间接调用子程序子程序maxCALL BX ;保护断点,;保护断点,IP(BX)= = max入口的偏移地址入口的偏移地址第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法(3)段间直接调用)段间直接调用 格式:格式:CALL dst 操作:(操作:(CS)入栈)入栈 (IP)入栈)入栈 (IP) 子程序入口的偏移地址子程序入口的偏移地址 (CS) 子程序入口的段地址子程序入口的段地址 保护断点保护断点例例4-25 段间直接调用段间直接调用子程序子程序max保护断点:保护断点: CS、IP当前值当前值(断点地址断点地址)入栈入栈实现转移:实现转移: max入口的入口的段地址和偏移地址送段地址和偏移地址送CS、IP CALL FAR PTR max 操作:操作:操作:操作:第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法(4)段间间接调用)段间间接调用 格式:格式:CALL dst 操作操作: (: (CS) )、( (IP) ) 入栈入栈, , 保护断点保护断点 (IP)(OA),(),(CS)(OA+2) OAOA是双字单元地址,存放子程序入口地址。是双字单元地址,存放子程序入口地址。 例例4-26 段间间接调用子程序段间间接调用子程序max CALL DWORD PTR BX 保护断点保护断点:CS、IP当前值当前值(断点地址断点地址)入栈入栈实现转移:实现转移: (( (IP)(( (BX) )),(),(CS)(( (BX) )+2)BX所指双字单元所指双字单元(OAOA)= =max入口的入口的段地址段地址和和偏移地址偏移地址第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法2)返回指令返回指令 (不影响标志位)(不影响标志位) 子程序执行的最后一条指令必须是子程序执行的最后一条指令必须是RET指令指令 ,返回到返回到CALL指令后的断点处继续执行。指令后的断点处继续执行。 (1)段内返回)段内返回 格式:格式: RET 操作:(操作:(IP)(SP)+1,(,(SP) (SP)(SP)+2 将栈顶的断点地址出栈将栈顶的断点地址出栈 IP,返回到断点处继续执行。,返回到断点处继续执行。 (2)段内带立即数返回)段内带立即数返回 格式:格式:RET 表达式表达式 (D )操作:(操作:(IP)(SP)+1,(,(SP) (SP)(SP)+2 (SP)(SP)+D (16位的偏移量)位的偏移量) 第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法例:例:带立即数返回带立即数返回举例举例SPSP4SPSP(参数个数(参数个数 2) push ax ;参数;参数1入栈入栈 push bx ;参数;参数2入栈入栈 CALL max;调用子程序;调用子程序max mov ax,bx;断点指令;断点指令 max proc near ;子程序入口;子程序入口 ret max endp参数参数1参数参数2IP第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法(3)段间返回)段间返回 格式:格式:RET (4)段间带立即数返回)段间带立即数返回 格式:格式:RET 表达式表达式 段间返回指令操作与段内返回指令的差别只是:段间返回指令操作与段内返回指令的差别只是: 段间返回指令从堆栈中段间返回指令从堆栈中连续弹出两个字连续弹出两个字 第一个字(断点的偏移地址)出栈送第一个字(断点的偏移地址)出栈送IP 第二个字(断点的段地址)出栈送第二个字(断点的段地址)出栈送CS第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法 4.5.2 子程序的编写方法子程序的编写方法1简化程序简化程序书写书写2减小代码减小代码长度长度3便于子程序便于子程序功能的共享功能的共享1)子程序的优点:子程序的优点: 4便于便于大型程序的大型程序的模块化组织模块化组织第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法调调用用程程序序和和子子程程序序在在同同一代码段中一代码段中调调用用程程序序和和 子子程程序序不不在在同同一代码段中一代码段中P99- -P100子程序的子程序的类型属性类型属性 NEAR型型FAR型型2)编写子程序的一般要求编写子程序的一般要求 (1)保护寄存器)保护寄存器第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法(2)正确使用堆栈)正确使用堆栈 sub1 proc near ;子程序入口;子程序入口 PUSH AX PUSH BX PUSH CX POP CX POP BX POP AX retsub1 endp出栈与入栈顺序应当相反出栈与入栈顺序应当相反 必须成对地执行必须成对地执行PUSH和和POP指令指令 ,使使RET指令能正确指令能正确地弹出断点返回地址。地弹出断点返回地址。 第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法 CALL sub1;调用子程序;调用子程序sub1 mov ax,bx;断点指令;断点指令 sub1 proc near ;子程序入口;子程序入口 push ax ;数据;数据1入栈入栈 push bx ;数据;数据2入栈入栈 pop bx ;数据;数据1出栈出栈 pop ax ;数据;数据2出栈出栈 ret sub1 endp例:子程序内例:子程序内必须必须成对地成对地执行执行PUSH和和POP指令指令 ,才能正常返回。,才能正常返回。IPSPSPSPSPIPaxbx第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法(3)编写适当的子程序内部文档)编写适当的子程序内部文档 使子程序可读性好、易理解和便于使用使子程序可读性好、易理解和便于使用 (4)参数传递)参数传递 参数可以增加子程序的灵活性和通用性。调用程序传参数可以增加子程序的灵活性和通用性。调用程序传送给子程序的参数称为入口参数,子程序返回给调用程序的送给子程序的参数称为入口参数,子程序返回给调用程序的结果称为出口参数。结果称为出口参数。 第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法参数传递一般有如下三种方法:参数传递一般有如下三种方法: 用寄存器传递参数:用寄存器传递参数:将参数送入约定的寄存器中,将参数送入约定的寄存器中, 用于参数较少的情况。用于参数较少的情况。 1用堆栈传递参数:用堆栈传递参数:调用程序将参数压入堆栈,子程调用程序将参数压入堆栈,子程序从堆栈中取得参数。用于参数多、子程序嵌套调序从堆栈中取得参数。用于参数多、子程序嵌套调用和递归调用用和递归调用 。3用参数表传递参数:用参数表传递参数:调用程序将参数组成一个参数调用程序将参数组成一个参数表传送给子程序,用于大量参数的传送。表传送给子程序,用于大量参数的传送。 2 本节分别讨论本节分别讨论用用寄存器传递参数寄存器传递参数和用和用堆栈传递参数堆栈传递参数的方法例子。的方法例子。学习要点:学习要点:第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法例例4-29 ( P104)在一个带符号数的数组中,选出绝对值最大的值)在一个带符号数的数组中,选出绝对值最大的值并确定该值存放单元的位置序号。并确定该值存放单元的位置序号。选最大值方法的分析:选最大值方法的分析:120430- -44 0 1 2 AX120DL0BX430DH143012- -44 用寄存器传递参数的方法用寄存器传递参数的方法 选最大值的方法选最大值的方法array 主程序提供参数主程序提供参数: 数组地址、数组长度数组地址、数组长度 子程序子程序选最大值选最大值第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法例例4-31 程程序序功功能能与与例例4-29相相同同,不不同同的的只只是是本本例例利利用用堆堆栈栈传传递递入入口口参参数数、和出口参数。和出口参数。学习要点:学习要点: 用堆栈传递参数的方法用堆栈传递参数的方法 bp寄存器的使用寄存器的使用 带立即数返回指令的使用带立即数返回指令的使用程序分析如下:程序分析如下: 程序执行过程中堆栈的变化程序执行过程中堆栈的变化情况如图所示。情况如图所示。( ret n)元素个数元素个数数组首址数组首址IPbpaxbxcxdxsidibpSPSPSP最大值最大值位置序号位置序号SPSP(si)(cx)(ax)(dx)简洁、易读简洁、易读空间开销大空间开销大优点:优点: 缺点:缺点: 第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法 4.5.3 子程序的嵌套调用与递归调用子程序的嵌套调用与递归调用(1)子程序的嵌套调用)子程序的嵌套调用(2)子程序的递归调用)子程序的递归调用 A A 间接递归调用间接递归调用 直接递归调用直接递归调用 子程序的递归调用需要由堆栈传递参数子程序的递归调用需要由堆栈传递参数 ,每次递归调用时将每次递归调用时将入口入口/出口参数、寄存器内容以及所有的中间结果保存在堆栈中出口参数、寄存器内容以及所有的中间结果保存在堆栈中。A B A AB C第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法例例4-32 用递归的方法将一个字符数组中的字符串反序输出,用递归的方法将一个字符数组中的字符串反序输出,字符串以字符串以 $ 为结束符。为结束符。 设设 strs db ab$ 程序执行过程中堆栈的变化如下程序执行过程中堆栈的变化如下:(1)每次递归调用时,正向依次压入各字符的单元地址。)每次递归调用时,正向依次压入各字符的单元地址。 axbxIP0 SPdxstrsbp0 SPbp1bp1+0 +2 +4 +6 +8 +10( a )SPbp2( b )axbxIP1 dxstrs+1bp1 bp2+0 +2 +4 +6 +8 +10SPbp3( $ )axbxIP2dxstrs+2bp2bp3+0 +2 +4 +6 +8 +10第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法axbxIP0 SPdxstrsbp0 SPbp1bp1+0 +2 +4 +6 +8 +10( a )SPbp2( b )axbxIP1 dxstrs+1bp1 bp2+0 +2 +4 +6 +8 +10SPbp3( $ )axbxIP2dxstrs+2bp2bp3+0 +2 +4 +6 +8 +10$反向输出反向输出:ba(2)逐层返回时,反向逐次弹出各字符的单元地址并输出其)逐层返回时,反向逐次弹出各字符的单元地址并输出其中的字符。中的字符。第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法4.6 DOS系统功能调用系统功能调用 功能功能包括包括(1)基本输入)基本输入/输出输出(2)磁盘读写管理)磁盘读写管理 (3)文件与内存管理)文件与内存管理 DOS系统功能调用系统功能调用是是 DOS为用户提供的常用功能子程序,为用户提供的常用功能子程序, 每个功能子程序有一个编号,可以按功能编号在汇编浯言每个功能子程序有一个编号,可以按功能编号在汇编浯言程序中直接调用程序中直接调用(p325)。 第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法4.8 多模块程序设计多模块程序设计 在多模块程序设计中,会产生不同模块文件间的模块引在多模块程序设计中,会产生不同模块文件间的模块引用和数据通信问题,解决上述问题需要用两条伪指令。用和数据通信问题,解决上述问题需要用两条伪指令。 (1)伪指令)伪指令PUBLIC 格式:格式: PUBLIC 符号名符号名 , 将本模块中已定义的符号名(变量名、标号、过程名等)将本模块中已定义的符号名(变量名、标号、过程名等)定义为定义为全局符号全局符号,允许其它模块引用这些全局符号。,允许其它模块引用这些全局符号。 (2)伪指令)伪指令EXTERN 格式:格式:EXTERN 符号名:类型符号名:类型 , (在在MASM 5.x 中为中为EXTRN) 声明所列出的符号名是已在别的模块中定义了的声明所列出的符号名是已在别的模块中定义了的外部符号外部符号,本模块可以直接引用。本模块可以直接引用。 第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法对于变量名:类型为对于变量名:类型为 BYTE、WORD、DWORD、QWORD对于标号或过程名:类型为对于标号或过程名:类型为 NEAR、FAR例例4-38 (P121) 从键盘输入一个十进制数,并将该数转换为从键盘输入一个十进制数,并将该数转换为十六进制数后显示在屏幕上。十六进制数后显示在屏幕上。将上述功能分解成两部分,分配给两个模块完成:将上述功能分解成两部分,分配给两个模块完成: 模块1文件:主过程功能:键盘 十进制数 二进制数 binum单元输入转换存入convert.asm模块2文件:子过程功能:binum单元 二进制数 十六进制数 显示 取转换btoh.asm 第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法学习要点学习要点: : 不同文件中各模块的相互引用和数据通信不同文件中各模块的相互引用和数据通信 将键盘输入按将键盘输入按十进制数转换的方法十进制数转换的方法设十进制数形式为:设十进制数形式为: d2d1d0 d2 102+d1 101+d0 = ( ( ( ( 0 10 )+d2 ) 10 )+d1 ) 10+d0 第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法 模块模块1要引用模块要引用模块2中的过程名中的过程名btoh,因此必须将,因此必须将btoh说说明为外部过程名,并且为明为外部过程名,并且为far类型,同时类型,同时模块模块1中的中的binum要要被模块被模块2引用,所以引用,所以binum被定义为被定义为全局符号名全局符号名。 模块模块2要从要从模块模块1的的binum单元取得二进制数,因此必须将单元取得二进制数,因此必须将binum说明为说明为外部符号名外部符号名,并且为字类型,并且为字类型word,同时还须将,同时还须将btoh定义为全局符号名以供定义为全局符号名以供模块模块1引用。引用。 extern both:farpublic binumextern binum:wordpublic both第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法3 00 30 10 3 3 0 10 3 0 10+3 5 33 53 10 5 5 3 10 5 3 10+5ax bx ax bx 设输入为:设输入为: 35循环次数:循环次数: 1 2= ( ( ( 0 10 )+3 ) 10 )+5 binumbinum
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号