新一代汇编语言程序设计5业界荟萃_第1页
新一代汇编语言程序设计5业界荟萃_第2页
新一代汇编语言程序设计5业界荟萃_第3页
新一代汇编语言程序设计5业界荟萃_第4页
新一代汇编语言程序设计5业界荟萃_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、新一代汇编语言程序设计1行业知识第五章 程序设计的基本方法v5.1 程序设计的基本步骤v5.2 顺序程序设计v5.3 分支程序设计v5.4 循环程序设计v5.5 算数运算与代码转换程序设计2行业知识程序设计的解题程序设计的解题基本步骤如下:基本步骤如下:分析问题分析问题 寻找解决问题的寻找解决问题的思路、方法、算法思路、方法、算法 描述算法描述算法 编写程序实现算法编写程序实现算法 设计测试数据设计测试数据和预期计算结果和预期计算结果 上机调试程序上机调试程序5.1 程序设计的基本步骤3行业知识程序的基本结构有三种:程序的基本结构有三种:顺序结构、分支结构、循环结构顺序结构、分支结构、循环结构

2、 顺序结构:顺序结构:按语句的书写顺序依次执行。按语句的书写顺序依次执行。1循环结构:循环结构:由条件是否成立,确定是否重复执行某由条件是否成立,确定是否重复执行某段程序。段程序。3分支结构:分支结构:根据不同的条件判断结果,执行不同的根据不同的条件判断结果,执行不同的程序段,实现程序分支。程序段,实现程序分支。 24行业知识5.3 分支分支程序设计程序设计 程序的分支通过转移指令来实现,因此转移指令的操作程序的分支通过转移指令来实现,因此转移指令的操作应该是能够改变程序执行顺序应该是能够改变程序执行顺序 。vv 方法方法: : 修改修改cs:ip 4.3.1 转移指令转移指令( (不影响任何

3、标志位不影响任何标志位 ) )无条件转移指令无条件转移指令条件转移指令条件转移指令 转移指令转移指令分为两类分为两类5行业知识 1)无条件转移指令无条件转移指令指令格式:指令格式:jmp 标号标号 无条件转移到无条件转移到标号标号指向的指令继续执行指向的指令继续执行无条件转移无条件转移段内转移段内转移段间转移段间转移直接寻址直接寻址间接寻址间接寻址(1) 段内转移(段内直接寻址)段内转移(段内直接寻址) 段内转移段内转移只需修改只需修改ip实现转移实现转移 : : 使使ip 标号标号所在行的指令所在行的指令 即:即: (ipip)= =标号所在行标号所在行指令的偏移地址指令的偏移地址 段内转移

4、分为三种形式:段内转移分为三种形式: 段内直接短转移段内直接短转移 格式:格式:jmp short 标号标号 操作:(操作:(ip)(ip)+d(8位偏移量)位偏移量) 6行业知识2)条件转移指令条件转移指令 (18条)条)基本格式为:基本格式为: j 标号标号 (代表一种转移条件代表一种转移条件 ) 条件转移指令条件转移指令根据检测标志位的状态来判断条件,若条件根据检测标志位的状态来判断条件,若条件为真,则转至标号处执行程序,否则顺序往下执行程序为真,则转至标号处执行程序,否则顺序往下执行程序 。操作:(操作:(ip)(ip)+d (8位偏移量)位偏移量)vv 条件转移指令条件转移指令转移范

5、围与转移范围与段内短转移段内短转移相同相同7行业知识例例 :利用条件转移指令:利用条件转移指令构成循环构成循环 mov cx,100 (循环计数)(循环计数) again: add ax,bx dec cx jnz again 执行执行影响标志位影响标志位的指令(如算术运算、比较及位测试等指令)的指令(如算术运算、比较及位测试等指令)执行适当的条件转移指令检测相应的标志位,根据条件实现转移执行适当的条件转移指令检测相应的标志位,根据条件实现转移8行业知识条件转移指令9行业知识1. 判断单个标志位状态v这组指令单独判断5个状态标志之一jz/je和jnz/jne:利用零标志zf,判断结果是否为零(

6、或相等)js和jns:利用符号标志sf,判断结果是正是负jo和jno:利用溢出标志of,判断结果是否产生溢出jp/jpe和jnp/jpo:利用奇偶标志pf,判断结果中“1”的个数是偶是奇jc/jb/jnae和jnc/jnb/jae:利用进位标志cf,判断结果是否进位或借位10行业知识例: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,顺序执

7、行jmp done ;无条件转向next1:mov ah,0ffhdone:.11行业知识例:js/jns指令;计算|xy|(绝对值);x和y为存放于x单元和y单元的16位操作数;结果存入result mov ax,x sub ax,y jns nonneg neg ax ;neg是求补指令是求补指令nonneg: mov result,ax12行业知识例:jo/jno指令;计算xy;x和y为存放于x单元和y单元的16位操作数;若溢出,则转移到overflow处理 mov ax,x sub ax,y jo overflow .;无溢出,结果正确;无溢出,结果正确overflow: .;有溢出处

8、理;有溢出处理13行业知识例:jp/jnp指令and al,7fh;最高位置“0”,同时判断“1”的个数jnp next;个数已为奇数,则转向nextor al,80h;否则,最高位置“1”next:.;设字符的;设字符的ascii码在码在al寄存器中寄存器中;将字符加上奇校验位;将字符加上奇校验位;在字符;在字符ascii码中为码中为“1”的个数已为奇数时的个数已为奇数时;则令其最高位为;则令其最高位为“0”;否则令最高位为;否则令最高位为“1”14行业知识例:jc/jnc指令xor al,al;al0again:test bx,0ffffh ;等价于 cmp bx,0je next ;相等

9、则转移shl bx,1jnc againinc aljmp againnext:.;al保存1的个数;记录;记录bx中中1的个数的个数15行业知识记录bx中“1”的个数xor al,al;al0 again:cmp bx,0jz nextshl bx,1;也可使用 shr bx,1adc al,0jmp againnext:.;al保存1的个数另一种做法另一种做法16行业知识2. 比较无符号数高低v无符号数的大小用高(above)低(below)表示v利用cf确定高低、利用zf标志确定相等(equal)v两数的高低分成4种关系: 低于(不高于等于):jb(jnae) cf= ,zf 不低于(高

10、于等于):jnb(jae) cf= ,zf 低于等于(不高于):jbe(jna) cf= ,zf 不低于等于(高于):jnbe(ja )cf= ,zf17行业知识例:比较无符号数cmp ax,bx ;比较ax和bxjnb next;若axbx,转移xchg ax,bx ;若axbx,交换next:.18行业知识3. 比较有符号数大小v有符号数的大(greater)小(less)需要组合of、sf标志,并利用zf标志确定相等(equal)v两数的大小分成4种关系: 小于(不大于等于):jl(jnge) sf of,zf= 不小于(大于等于):jnl(jge) sf of,zf= 小于等于(不大于

11、):jle(jng) sf of,zf= 不小于等于(大于):jnle(jg )sf of,zf=19行业知识例:比较有符号数cmp ax,bx ;比较ax和bxjnl next;若axbx,转移xchg ax,bx ;若axbx,交换next:.20行业知识1. 分支程序设计一、用转移指令实现假如要把连续存放在内存变量名dat中的三个数按递减次序排列。ab?bc?ab?交换nnnyyy交换交换a、bb、ca、b结束开始21行业知识汇编语言汇编语言 【例4.17】设变量x为带符号整数,试编写一个程序,完成下面的分段函数计算: 题目分析:为了实现上述分段函数的计算,首先要利用上一个例题求出x的绝

12、对值,然后根据x的绝对值判断y的取值。程序段如下:5|15|0 xxxy22行业知识datasegment 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

13、: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的个数。设计源程序如下:。 24行业知识data segment w dw 00ffh;定义

14、字数据 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;汇编结

15、束 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中。26行业知识用无条件转移指令用无条件转移指令+ +跳转表实现程序分支跳转表实现程序分支 跳转表便于实现多路分支。跳转表便于实现多路分支。 设有若干段分支程序,将每段设有若干段分支程

16、序,将每段分支程序的入口地址分支程序的入口地址(也称(也称跳转地址)组成一个连续存放在内存中的表,称为跳转地址)组成一个连续存放在内存中的表,称为跳转表跳转表。 若有若有n个产品个产品,将这,将这n个产品的加工处理程序(分支程序)个产品的加工处理程序(分支程序)入口地址(分别为入口地址(分别为br0,br1,brn-1)组成跳转表,)组成跳转表,可就利用跳转表取得可就利用跳转表取得br0,br1,brn-1,转移到相应,转移到相应的的分支程序分支程序去处理产品。去处理产品。 27行业知识由由表地址表地址就可取得分支程序地址就可取得分支程序地址brn,再将,再将brn送送ip,实现转移。,实现转

17、移。例:例: 根据学生成绩评定等级:根据学生成绩评定等级: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)28行业知识5.4 循环循环程序设计程序设计根据条件重复执行一段指令就构成了循环程序结构根据条件重复执行一段指令就构成了循环程序

18、结构 。例:例: 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个数求和,并将和存入字变量个数求和,并将和存

19、入字变量s中中 。29行业知识保证循环正常执行和结束的条件:保证循环正常执行和结束的条件:正确地正确地初始化初始化循环控制计数和初始条件循环控制计数和初始条件1正确地正确地检测检测循环条件循环条件2必须保证能必须保证能达到循环结束条件达到循环结束条件 ( (例如在循环体内有例如在循环体内有修改循环控制值修改循环控制值的指令)的指令)3 指令系统提供了专门用于循环结构的循环控制指令,更加指令系统提供了专门用于循环结构的循环控制指令,更加简便的地实现循环结构。简便的地实现循环结构。 30行业知识 5.4.1 循环控制指令循环控制指令循环控制指令的转移范围为:循环控制指令的转移范围为:- -128+

20、127字节字节 格式:格式:loop loop 标号标号 操作:操作: 如右图所示如右图所示 (段内短转移)(段内短转移)(1)looploop指令指令(2)等于继续循环指令等于继续循环指令 格式:格式:loopz/loope loopz/loope 标号标号 (3)不等于继续循环指令不等于继续循环指令格式:格式:loopnz/loopne loopnz/loopne 标号标号 操作:操作: 如右图所示如右图所示 操作:操作: 如右图所示如右图所示 31行业知识loop again loop again 在前面的求和例子中,可用一条循环指令代替两条指令:在前面的求和例子中,可用一条循环指令代替

21、两条指令: 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存储区中的存储区中的字符串长度。字符串长度。32行业知识要求将要求将 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逐位分离开并转换为逐位分离开并转换为再讨论如何分离开各二进制位并转换为再讨论如

22、何分离开各二进制位并转换为ascii码码先将(先将(num)()(dx)分析如下:分析如下:33行业知识(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

23、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,dl34行业知识 根据上述分析,将(根据上述分析,将(dx)中的二进制数依次)中的二进制数依次循

24、环左移循环左移1位位,可以使得,可以使得各个数位的分离各个数位的分离(and)和)和ascii码转换码转换(add)操作完全相同,便于组织循环,并且)操作完全相同,便于组织循环,并且循环次数已循环次数已知(知(16次)次)。例例4-17(p91):): 将将十进制数(十进制数(number)转换为八进制数。转换为八进制数。 方法方法:(number)/8 保留余数保留余数,除法,除法操作循环次数事操作循环次数事先未知先未知,仅当商为,仅当商为0时,循环结束。时,循环结束。vv 此例为此例为计数计数循环循环 vv 此例为此例为条件条件循环循环 35行业知识第四章第四章 汇编语言程序设计的基本方法

25、汇编语言程序设计的基本方法例例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 : vv 上述程序为上述程序为当型循环当型循环程序结构:程序

26、结构:先判断条件,后执行循环先判断条件,后执行循环。36行业知识第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法 4.4.3 多重循环程序设计多重循环程序设计例例: 分析下述程序的功能分析下述程序的功能:多重循环程序能够解决更复杂的实际问题。多重循环程序能够解决更复杂的实际问题。消耗时间消耗时间延时功能延时功能 mov bl,20 delay: mov cx,9801h;外循环开始;外循环开始 idle: loop idle;内循环体;内循环体 dec bl jnz delay;外循环结束;外循环结束37行业知识第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方

27、法设计设计多重循环程序多重循环程序时注意下面两点:时注意下面两点: (1) 内层循环必须完全内层循环必须完全包含在外层循环内包含在外层循环内 (2) 转移指令只能从循环转移指令只能从循环结构内转到循环结构外结构内转到循环结构外 38行业知识4.5 子子程序设计程序设计 子程序结构是模块化程序设计的重要基础,其子程序结构是模块化程序设计的重要基础,其调用调用和和返回返回分别由分别由call和和ret指令完成,子程序设计方法包括:指令完成,子程序设计方法包括:子程序定义子程序定义1参数传递参数传递2子程序的嵌套调用子程序的嵌套调用3子程序的递归调用子程序的递归调用439行业知识第四章第四章 汇编语

28、言程序设计的基本方法汇编语言程序设计的基本方法(1)段内直接调用)段内直接调用 格式:格式:call dstcall dst 操作操作:(:(sp)(sp)- -2 ((sp)+1,(,(sp))(ip)(返回地址返回地址) (ip)(ip)+d (子程序入口地址子程序入口地址) 保护断点地址保护断点地址实现转移实现转移类似段内直接近转移操作类似段内直接近转移操作1) 调用指令调用指令 callcall指令指令的寻址方式类似的寻址方式类似jmpjmp指令,也分为四种调用方式。指令,也分为四种调用方式。 4.5.1 调用与返回指令调用与返回指令 (不影响标志位)(不影响标志位)40行业知识第四章

29、第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法(2)段内间接调用)段内间接调用 格式:格式:call dst 操作:(操作:(sp)(sp)- -2, ((sp)+1,(,(sp))(ip) (ip)(oa) ( (oa是存储器单元地址或寄存器是存储器单元地址或寄存器, (oa)=, (oa)=子程序入口的偏移地址子程序入口的偏移地址)例例4-24 段内间接调用段内间接调用子程序子程序maxcall bx ;保护断点,;保护断点,ip(bx)= = max入口的偏移地址入口的偏移地址41行业知识第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法(3)段间直接调用)

30、段间直接调用 格式:格式:call dst 操作:(操作:(cs)入栈)入栈 (ip)入栈)入栈 (ip) 子程序入口的偏移地址子程序入口的偏移地址 (cs) 子程序入口的段地址子程序入口的段地址 保护断点保护断点例例4-25 段间直接调用段间直接调用子程序子程序maxvv保护断点:保护断点: cs、ip当前值当前值(断点地址断点地址)入栈入栈vv实现转移:实现转移: max入口的入口的段地址和偏移地址送段地址和偏移地址送cs、ip call far ptr max 操作:操作:42行业知识操作:操作:第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法(4)段间间接调用)段间间

31、接调用 格式:格式:call dst 操作操作: (: (cs) )、( (ip) ) 入栈入栈, , 保护断点保护断点 (ip)(oa),(),(cs)(oa+2) oaoa是双字单元地址,存放子程序入口地址。是双字单元地址,存放子程序入口地址。 例例4-26 段间间接调用子程序段间间接调用子程序max call dword ptr bx vv保护断点保护断点:cs、ip当前值当前值(断点地址断点地址)入栈入栈vv实现转移:实现转移: (( (ip)(( (bx) )),(),(cs)(( (bx) )+2)bx所指双字单元所指双字单元(oaoa)= =max入口的入口的段地址段地址和和偏移

32、地址偏移地址43行业知识第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法2)返回指令返回指令 (不影响标志位)(不影响标志位) 子程序执行的最后一条指令必须是子程序执行的最后一条指令必须是ret指令指令 ,返回到返回到call指令后的断点处继续执行。指令后的断点处继续执行。 (1)段内返回)段内返回 格式:格式: ret 操作:(操作:(ip)(sp)+1,(,(sp) (sp)(sp)+2 将栈顶的断点地址出栈将栈顶的断点地址出栈 ip,返回到断点处继续执行。,返回到断点处继续执行。 (2)段内带立即数返回)段内带立即数返回 格式:格式:ret 表达式表达式 (d )操作:

33、(操作:(ip)(sp)+1,(,(sp) (sp)(sp)+2 (sp)(sp)+d (16位的偏移量)位的偏移量) 44行业知识第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法例:例:带立即数返回带立即数返回举例举例spsp4spsp(参数个数(参数个数 2) push ax ;参数;参数1入栈入栈 push bx ;参数;参数2入栈入栈 call max;调用子程序;调用子程序max mov ax,bx;断点指令;断点指令 max proc near ;子程序入口;子程序入口 ret max endp参数参数1参数参数2ip45行业知识第四章第四章 汇编语言程序设计的基

34、本方法汇编语言程序设计的基本方法(3)段间返回)段间返回 格式:格式:ret (4)段间带立即数返回)段间带立即数返回 格式:格式:ret 表达式表达式 段间返回指令操作与段内返回指令的差别只是:段间返回指令操作与段内返回指令的差别只是: vv 段间返回指令从堆栈中段间返回指令从堆栈中连续弹出两个字连续弹出两个字 vv 第一个字(断点的偏移地址)出栈送第一个字(断点的偏移地址)出栈送ip vv 第二个字(断点的段地址)出栈送第二个字(断点的段地址)出栈送cs46行业知识第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法 4.5.2 子程序的编写方法子程序的编写方法1简化程序简化

35、程序书写书写2减小代码减小代码长度长度3便于子程序便于子程序功能的共享功能的共享1)子程序的优点:子程序的优点: 4便于便于大型程序的大型程序的模块化组织模块化组织47行业知识第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法调用程序和调用程序和子程序在同子程序在同一代码段中一代码段中调 用 程 序 和调 用 程 序 和 子程序不在同子程序不在同一代码段中一代码段中p99- -p100子程序的子程序的类型属性类型属性 near型型far型型2)编写子程序的一般要求编写子程序的一般要求 (1)保护寄存器)保护寄存器48行业知识第四章第四章 汇编语言程序设计的基本方法汇编语言程序设

36、计的基本方法(2)正确使用堆栈)正确使用堆栈 sub1 proc near ;子程序入口;子程序入口 push ax push bx push cx pop cx pop bx pop ax retsub1 endp出栈与入栈顺序应当相反出栈与入栈顺序应当相反 必须成对地执行必须成对地执行push和和pop指令指令 ,使使ret指令能正确地指令能正确地弹出断点返回地址。弹出断点返回地址。 49行业知识第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法 call sub1;调用子程序;调用子程序sub1 mov ax,bx;断点指令;断点指令 sub1 proc near ;子程

37、序入口;子程序入口 push ax ;数据;数据1入栈入栈 push bx ;数据;数据2入栈入栈 pop bx ;数据;数据1出栈出栈 pop ax ;数据;数据2出栈出栈 ret sub1 endp例:子程序内例:子程序内必须必须成对地成对地执行执行push和和pop指令指令 ,才能正常返回。,才能正常返回。ipspspspspipaxbx50行业知识第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法(3)编写适当的子程序内部文档)编写适当的子程序内部文档 使子程序可读性好、易理解和便于使用使子程序可读性好、易理解和便于使用 (4)参数传递)参数传递 参数可以增加子程序的灵

38、活性和通用性。调用程序传送参数可以增加子程序的灵活性和通用性。调用程序传送给子程序的参数称为入口参数,子程序返回给调用程序的结给子程序的参数称为入口参数,子程序返回给调用程序的结果称为出口参数。果称为出口参数。 51行业知识第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法参数传递一般有如下三种方法:参数传递一般有如下三种方法: 用寄存器传递参数:用寄存器传递参数:将参数送入约定的寄存器中,将参数送入约定的寄存器中, 用于参数较少的情况。用于参数较少的情况。 1用堆栈传递参数:用堆栈传递参数:调用程序将参数压入堆栈,子程调用程序将参数压入堆栈,子程序从堆栈中取得参数。用于参数多

39、、子程序嵌套调序从堆栈中取得参数。用于参数多、子程序嵌套调用和递归调用用和递归调用 。3用参数表传递参数:用参数表传递参数:调用程序将参数组成一个参数调用程序将参数组成一个参数表传送给子程序,用于大量参数的传送。表传送给子程序,用于大量参数的传送。 2vv 本节分别讨论本节分别讨论用用寄存器传递参数寄存器传递参数和用和用堆栈传递参数堆栈传递参数的方法例子。的方法例子。52行业知识学习要点:学习要点:第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法例例4-29 ( p104)在一个带符号数的数组中,选出绝对值最大的值)在一个带符号数的数组中,选出绝对值最大的值并确定该值存放单元

40、的位置序号。并确定该值存放单元的位置序号。选最大值方法的分析:选最大值方法的分析:120430- -44 0 1 2 ax120dl0bx430dh143012- -44vv 用寄存器传递参数的方法用寄存器传递参数的方法vv 选最大值的方法选最大值的方法arrayvv 主程序提供参数主程序提供参数: 数组地址、数组长度数组地址、数组长度vv 子程序子程序选最大值选最大值53行业知识第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法例例4-31 程序功能与例程序功能与例4-29相同,不同的相同,不同的只是本例利用堆栈传递入口参数、只是本例利用堆栈传递入口参数、和出口参数。和出口参

41、数。学习要点:学习要点: vv 用堆栈传递参数的方法用堆栈传递参数的方法 vv bp寄存器的使用寄存器的使用 vv 带立即数返回指令的使用带立即数返回指令的使用程序分析如下:程序分析如下: 程序执行过程中堆栈的变化程序执行过程中堆栈的变化情况如图所示。情况如图所示。( ret n)元素个数元素个数数组首址数组首址ipbpaxbxcxdxsidibpspspsp最大值最大值位置序号位置序号spsp(si)(cx)(ax)(dx)54行业知识简洁、易读简洁、易读空间开销大空间开销大优点:优点: 缺点:缺点: 第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法 4.5.3 子程序的嵌

42、套调用与递归调用子程序的嵌套调用与递归调用(1)子程序的嵌套调用)子程序的嵌套调用(2)子程序的递归调用)子程序的递归调用 a a 间接递归调用间接递归调用 直接递归调用直接递归调用 子程序的递归调用需要由堆栈传递参数子程序的递归调用需要由堆栈传递参数 ,每次递归调用时将入每次递归调用时将入口口/出口参数、寄存器内容以及所有的中间结果保存在堆栈中出口参数、寄存器内容以及所有的中间结果保存在堆栈中。a b a ab c55行业知识第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法例例4-32 用递归的方法将一个字符数组中的字符串反序输出,用递归的方法将一个字符数组中的字符串反序输

43、出,字符串以字符串以 $ 为结束符。为结束符。 设设 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 +1056行业知识第四章第四章 汇编语言程序设计的基本方法汇编语言

44、程序设计的基本方法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)逐层返回时,反向逐次弹出各字符的单元地址并输出其)逐层返回时,反向逐次弹出各字符的单元地址并输出其中的字符。中的字符。57行业知识第四章第四章 汇编语言程序设计的基本方法汇编语言程序设计的基本方法4.6 dos系统功能调用系统功能调用 功能功能包括包括(1)基本输入)基本输入/输出输出(2)磁盘读写管理)磁盘读写管理 (3)文件与内存管理)文件与内存管理 dos系统功能调用系统功能调用是是 dos为用户提供的常用功能子程序,为用户提供的常用功能子程序, 每个功能子程序有一个编号,可以按功能编号在汇编浯言每个功能子程序有一个编号,可以按功能编号在汇编浯言程序中直接调用程序中直接调用(p325)。 58行业知识第四章第四章 汇编语言程序设计的基本方法汇编语言程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论