第四章选择和循环_第1页
第四章选择和循环_第2页
第四章选择和循环_第3页
第四章选择和循环_第4页
第四章选择和循环_第5页
已阅读5页,还剩144页未读 继续免费阅读

下载本文档

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

文档简介

1、1 12 24.1 4.1 测试和控制指令测试和控制指令 4.2 4.2 选择结构程序选择结构程序4.3 4.3 循环结构程序循环结构程序4.4 4.4 程序的调试程序的调试 习题四习题四3 3按照指令执行的顺序,程序的结构可以划分成以下三种。按照指令执行的顺序,程序的结构可以划分成以下三种。 顺 序 结 构顺 序 结 构 : 程 序 按 照 它 编 写 的 顺 序 执 行 , 每 条 指 令 只 执 行 一: 程 序 按 照 它 编 写 的 顺 序 执 行 , 每 条 指 令 只 执 行 一 次,这样的程序称为次,这样的程序称为“顺序结构顺序结构”的程序。的程序。 循环结构循环结构:一组指令

2、被反复地执行,这样的程序称为:一组指令被反复地执行,这样的程序称为“循环结循环结 构构”或者或者“重复结构重复结构”的程序。的程序。 选 择 结 构选 择 结 构 : 根 据 某 个 条 件 , 一 部 分 指 令 被 执 行 , 另 一 部 分 指: 根 据 某 个 条 件 , 一 部 分 指 令 被 执 行 , 另 一 部 分 指 令 没 有 被 执 行 , 这 样 的 程 序 称 为令 没 有 被 执 行 , 这 样 的 程 序 称 为 “ 选 择 结 构选 择 结 构 ” 或 者或 者 “ “分支结构分支结构”的程序。的程序。一个实际运行的程序,常常是由以上三种结构的程序组合而成的,上

3、面的三一个实际运行的程序,常常是由以上三种结构的程序组合而成的,上面的三种结构称为程序的种结构称为程序的“基本结构基本结构”。使用这三种基本结构,可以编写出任何所。使用这三种基本结构,可以编写出任何所需要的程序。需要的程序。 4 44.1.1 4.1.1 无条件转移指令无条件转移指令4.1.2 4.1.2 比较和测试指令比较和测试指令 4.1.3 4.1.3 条件转移指令条件转移指令 5 5执行执行jmp指令后,程序转移到新的指令后,程序转移到新的“目的位置目的位置”执行。执行。4.1.1 4.1.1 无条件转移指令无条件转移指令无条件转移指令的一般格式:无条件转移指令的一般格式:jmp目的位

4、置目的位置6 6codecodesegmentsegmentassumeassume cs: codecs: codestart:start: movmovdl, 20hdl, 20hone:one:movmovah, 2ah, 2intint21h21h;输出;输出dldl中的字符中的字符incincdldl;修改;修改dldl中的字符代码中的字符代码jmpjmponeone;转移到;转移到“one”one”处继续执行处继续执行movmovax, 4c00hax, 4c00hintint21h21hcodecodeendsendsendendstartstart例例4-1 用用jmp指令实现

5、转移指令实现转移7 71.近程无条件转移指令近程无条件转移指令 如果转移的目的位置与出发点在同一个段里,这样的转移称如果转移的目的位置与出发点在同一个段里,这样的转移称为为“近程近程”转移或者转移或者“段内段内”转移。实现转移。实现“近程近程”转移,实质转移,实质上是把目标位置的上是把目标位置的“偏移地址偏移地址”置入置入ip寄存器。寄存器。 按照寻址方式的不同,近程无条件转移指令有三种格式。按照寻址方式的不同,近程无条件转移指令有三种格式。8 8(1)短转移短转移如果目的位置离开出发点很近,可以使用以下格式:如果目的位置离开出发点很近,可以使用以下格式:jmpshort label其中其中“

6、label”是目的位置的标号。这种格式产生的机器指令代码最短,为是目的位置的标号。这种格式产生的机器指令代码最短,为2字节。字节。100h: jmp short two102h: 10ch: two: 指令指令“jmp short two”汇编后产生的机器指令为汇编后产生的机器指令为“eb0a”。 “eb”是这种类型转移指令的是这种类型转移指令的“操作码操作码”,“0a”是目的位置离开出发点的距离,是目的位置离开出发点的距离,10ch102h=0ah。 由于用一个字节补码表示目的地址与当前地址的距离,所以转移范围为下由于用一个字节补码表示目的地址与当前地址的距离,所以转移范围为下一条指令地址一

7、条指令地址-128 +127字节以内。字节以内。9 9(2)近程直接转移近程直接转移jmp目的位置标号目的位置标号指令指令“jmp two”jmp two”汇编后得到的机器指令代码为汇编后得到的机器指令代码为“e9fdee”e9fdee”。“e9”e9”为操作码为操作码“0eefdh”0eefdh”为位移量,为位移量,0eefdh=0f000h0eefdh=0f000h103h103h。指令指令“jmp one”jmp one”对应的机器指令代码为对应的机器指令代码为“e90011”e90011”“e9”“e9”为操作码为操作码位移量位移量“1100h”1100h”,0f003h+1100h=

8、0103h(0f003h+1100h=0103h(舍去进位舍去进位) )使用近程直接转移指令可以实现同一个段内使用近程直接转移指令可以实现同一个段内64kb64kb范围的转移。范围的转移。100h: jmptwo103h:one: 0f000h:two:jmpone0f003h:1010(3)近程间接转移近程间接转移 把转移的目的地址事先存放在某个寄存器或存储器单元中,把转移的目的地址事先存放在某个寄存器或存储器单元中,通过这个寄存器或存储单元实现转移。通过这个寄存器或存储单元实现转移。jmp cx ;寄存器间接转移,可使用任何一个通用寄存器;寄存器间接转移,可使用任何一个通用寄存器jmp w

9、ord ptrbx;存储器间接转移,目的地址在存储单元中;存储器间接转移,目的地址在存储单元中11111)jmp one;近程直接转移;近程直接转移2)lea dx, one jmp dx;寄存器间接段内转移;寄存器间接段内转移3)lea bx, target jmp word ptrbx ;存储器间接段内转移;存储器间接段内转移4)jmp target;存储器间接段内转移;存储器间接段内转移已在数据段定义存储器单元已在数据段定义存储器单元“target” :taegetdw one下面四组指令都可以实现向标号下面四组指令都可以实现向标号“one”的转移:的转移:1212 远程无条件转移指令可

10、以实现不同的段之间的转移,执远程无条件转移指令可以实现不同的段之间的转移,执行该指令时,行该指令时,cpu把目的段的段基址装入把目的段的段基址装入cs,目的位置的,目的位置的段内偏移地址装入段内偏移地址装入ip。有直接寻址和间接寻址两种格式。有直接寻址和间接寻址两种格式。(1)远程直接转移远程直接转移jmp far ptr 远程标号远程标号指令汇编后,对应的机器指令为指令汇编后,对应的机器指令为5个字节:个字节: 1个字节操作码个字节操作码“0eah” 2个字节目的地址的段内偏移地址个字节目的地址的段内偏移地址 2个字节目的标号所在段的段基址个字节目的标号所在段的段基址2远程无条件转移指令远程

11、无条件转移指令1313(2)远程间接转移远程间接转移 远程转移需要远程转移需要32位的目的地址,使用间接转移时,需要把位的目的地址,使用间接转移时,需要把32位目的地位目的地址事先装入用址事先装入用“dd”定义的存储单元。定义的存储单元。1)jmp far ptr two;远程直接转移;远程直接转移2)lea bx, far_tgt jmp dword ptrbx;远程间接转移;远程间接转移3)jmp far_tgt;远程间接转移;远程间接转移假设已在数据段定义存储器单元假设已在数据段定义存储器单元“far_tgt”如下:如下:far_tgtddtwo下面三组指令都可以实现向远程标号下面三组指

12、令都可以实现向远程标号“two”的转移:的转移:14144.1.2 4.1.2 比较和测试指令比较和测试指令(1)cmp(compare, 比较)指令比较)指令指令格式指令格式:cmp 目的操作数,源操作数目的操作数,源操作数目的操作数目的操作数:8位位/16位位/32位的寄存器位的寄存器/存储器操作数。存储器操作数。源操作数源操作数:与目的操作数同类型的寄存器:与目的操作数同类型的寄存器/存储器存储器/立即数。立即数。功能功能:目的操作数:目的操作数-源操作数,保留运算产生的标志位,不保留源操作数,保留运算产生的标志位,不保留运算的差。用来比较两个有符号数或无符号数的大小。运算的差。用来比较

13、两个有符号数或无符号数的大小。 1515假设(假设(ecx)= 8090a0b0h,指令,指令“cmp ecx, 0”执行后:执行后: zf=0 (ecx) 0 of=0 减法操作没有产生溢出(减法操作没有产生溢出(sf是正确的结果符号位)是正确的结果符号位) sf=1 如果如果ecx中存放的是有符号数,这个数是负数中存放的是有符号数,这个数是负数 cf=0 如果如果ecx中存放的是无符号数,这个数大于中存放的是无符号数,这个数大于0这条指令与下面的指令等效:这条指令与下面的指令等效: or ecx, 0 ;根据;根据ecx的值确定的值确定sf,zf and ecx, 0ffffffffh ;

14、根据;根据ecx的值确定的值确定sf,zf xor ecx, 0 ;根据;根据ecx的值确定的值确定sf,zf1616cf=0,目的操作数,目的操作数源操作数源操作数cf= 1, 目的操作数源操作数目的操作数源操作数对于有符号数对于有符号数:of=0时,时,sf为正确的结果符号为正确的结果符号 of=1时,时,sf与正确的符号位相反与正确的符号位相反 of sf的运算结果反映了正确的结果符号的运算结果反映了正确的结果符号of sf= 0, 目的操作数目的操作数源操作数源操作数of sf= 1, 目的操作数源操作数目的操作数源操作数对于无符号数对于无符号数:1717zf=0 (x) 5of=0

15、减法操作没有产生溢出,减法操作没有产生溢出,sf是正确的结果符号位是正确的结果符号位sf=1 如果如果x中存放的是有符号数,中存放的是有符号数,x5 假设存储器变量(假设存储器变量(x)= 80h,指令,指令“cmp x, 5”执行后:执行后:1818(2)test(test,测试)指令,测试)指令指令格式指令格式:test 目的操作数,源操作数目的操作数,源操作数目的操作数目的操作数:8位位/16位位/32位的寄存器位的寄存器/存储器操作数。存储器操作数。源操源操 作数作数:与目的操作数同类型的寄存器:与目的操作数同类型的寄存器/存储器存储器/立即数。立即数。功能功能:test指令将目的操作

16、数与源操作数进行逻辑乘运算,保指令将目的操作数与源操作数进行逻辑乘运算,保留运算产生的各标志位,但是不保留逻辑乘的结果。该留运算产生的各标志位,但是不保留逻辑乘的结果。该指令用来测试目的操作数中某几位二进制的特征。指令用来测试目的操作数中某几位二进制的特征。1919如果如果zf = 0, 说明说明bl寄存器的寄存器的d2d100,这两位为这两位为01,10或或11。如果如果zf = 1,说明,说明bl寄存器的寄存器的d2d100,这两位为,这两位为00。 指令指令 testvar, 1 执行后:执行后:如果如果zf = 0,说明变量,说明变量var的的d0位为位为1,该数为奇数,该数为奇数如果

17、如果zf = 1,说明变量,说明变量var的的d0位为位为0,该数为偶数,该数为偶数指令指令 testbl, 6 执行后:执行后:2020(3)bt(bit test,位测试)指令,位测试)指令指令格式指令格式:bt目的操作数,源操作数目的操作数,源操作数目的操作数目的操作数: 16位位/32位的寄存器位的寄存器/存储器操作数。存储器操作数。源操作数源操作数:与目的操作数同类型的寄存器操作数或:与目的操作数同类型的寄存器操作数或0255以内以内 的立即数。的立即数。功能功能:bt指令将目的操作数内部由源操作数指定的那一位二进指令将目的操作数内部由源操作数指定的那一位二进制的值送入制的值送入cf

18、,两个操作数的值均不改变。该指令用来,两个操作数的值均不改变。该指令用来测试目的操作数中某一位二进制的值。测试目的操作数中某一位二进制的值。2121bts目的操作数,源操作数目的操作数,源操作数 ;测试目的操作数的指定位,并把该位置为;测试目的操作数的指定位,并把该位置为1btr目的操作数,源操作数目的操作数,源操作数;测试目的操作数的指定位,并把该位置为;测试目的操作数的指定位,并把该位置为0btc目的操作数,源操作数目的操作数,源操作数;测试目的操作数的指定位,并把该位取反;测试目的操作数的指定位,并把该位取反设(设(edx)= 12345678h, (ecx)= 5bt edx, ecx

19、 ; 由于由于edx寄存器寄存器d5=1,执行后,执行后cf= 1,edx值不变值不变bt edx, 2 ; 由于由于edx寄存器寄存器d2=0,执行后,执行后cf= 0,edx值不变值不变与与bt指令类似的还有以下三条指令:指令类似的还有以下三条指令:22224.1.3 4.1.3 条件转移指令条件转移指令 “j”是条件转移指令操作码的第一个字母是条件转移指令操作码的第一个字母 “cc”是代表转移条件的是代表转移条件的13个字母个字母 “label”是转移目的地的标号。是转移目的地的标号。条件转移指令格式:条件转移指令格式: jcclabel2323(1)根据两个有符号数比较结果的条件转移指

20、令)根据两个有符号数比较结果的条件转移指令两个有符号数的比较结果通过两个有符号数的比较结果通过of,sf,zf反映出来反映出来 g (greater,大于,大于) l (less,小于,小于) e (equal,等于,等于) n (not,否,否)例:例:jg大于(不小于等于)则转移大于(不小于等于)则转移 jnl 不小于(大于或等于)则转移不小于(大于或等于)则转移 je等于(为零)则转移等于(为零)则转移2424指令助记符指令助记符 指令功能指令功能转移条件转移条件jg, jnle大于(不小于等于)时转移大于(不小于等于)时转移ofsf= 0且且zf=0jge, jnl大于等于(不小于)时

21、转移大于等于(不小于)时转移ofsf= 0jz, je为零(相等)时转移为零(相等)时转移zf= 1jnz, jne不为零(不相等)时转移不为零(不相等)时转移zf=0jl, jnge小于(不大于等于)时转移小于(不大于等于)时转移ofsf= 1jle, jng小于等于(不大于)时转移小于等于(不大于)时转移ofsf= 1或或zf=1根据有符号数大小的条件转移指令根据有符号数大小的条件转移指令2525mov ax, x ;取出;取出x的值送的值送axcmp ax, y ;比较两个操作数,建立需要的标志位;比较两个操作数,建立需要的标志位jggreater;如果;如果xy,转移到,转移到 “gr

22、eater”处执处执行行jeequal;如果;如果x=y,转移到,转移到 “equal”处执行处执行less:;否则,执行标号;否则,执行标号“less”处的指令处的指令greater:equal:下面程序根据有符号字变量下面程序根据有符号字变量x和和y的大小决定程序的走向。的大小决定程序的走向。2626subax, bx;ax(ax)(bx), 建立标志位建立标志位jgeskip;如果;如果(ax)0,转标号,转标号“skip”negax;如果;如果(ax)0,把,把ax的值取反的值取反skip: jg greater;如果;如果xy,转移到,转移到 “greater”处处 je equal

23、 ;如果;如果x=y,转移到,转移到 “equal”处处 jl less;如果;如果xy,转移到,转移到 “less”处处less: 这个程序能够正确运行,最后一条指令有这个程序能够正确运行,最后一条指令有“画蛇添足画蛇添足”之嫌。之嫌。下面的程序计算下面的程序计算 ax = |axbx|2727(2)根据两个无符号数比较结果的条件转移指令)根据两个无符号数比较结果的条件转移指令两个有符号数的比较结果通过两个有符号数的比较结果通过cf,zf反映出来,代反映出来,代表转移条件的字母表转移条件的字母: a(above,高于),高于) b(below,低于),低于) e(equal,等于),等于)2

24、828指令助记符指令助记符指令功能指令功能转移条件转移条件ja, jnbe高于(不低于等于)时转移高于(不低于等于)时转移cf= 0且且zf=0jae, jnb, jnc高于等于(不低于)时转移高于等于(不低于)时转移cf= 0jz, je为零(相等)时转移为零(相等)时转移zf= 1jnz, jne不为零(不相等)时转移不为零(不相等)时转移zf=0jb, jnae, jc低于(不高于等于)时转移低于(不高于等于)时转移cf= 1jbe, jna低于等于(不高于)时转移低于等于(不高于)时转移cf= 1或或zf=1根据无符号数大小的条件转移指令根据无符号数大小的条件转移指令2929(3)根据

25、单个标志位的条件转移指令)根据单个标志位的条件转移指令 指令操作码助记符指令操作码助记符指令功能指令功能转移条件转移条件jc, jb, jnae有进位时转移有进位时转移cf= 1jnc, jnb, jae无进位时转移无进位时转移cf= 0jz, je为零(相等)时转移为零(相等)时转移zf= 1jnz, jne不为零(不相等)时转移不为零(不相等)时转移zf=0js为负时转移为负时转移sf=1jns为正时转移为正时转移sf=0jo溢出时转移溢出时转移of=1jno不溢出时转移不溢出时转移of=0jp, jpe“1”的个数为偶数时转移的个数为偶数时转移pf=1jnp, jpo“1”的个数为奇数时

26、转移的个数为奇数时转移pf=03030jngskipjmplabelskip: 对于对于16位位80x86cpu,条件转移指令的转移范围在下一条指令地址,条件转移指令的转移范围在下一条指令地址128127字节之间。如果转移目的位置超出了上述范围,汇编时将报告错误。字节之间。如果转移目的位置超出了上述范围,汇编时将报告错误。对于对于32位位80x86cpu,条件转移指令汇编后产生,条件转移指令汇编后产生4字节机器代码,前字节机器代码,前2字节是字节是它的操作码,后面它的操作码,后面2字节是表示转移距离的位移量,可以实现字节是表示转移距离的位移量,可以实现64kb范围内的范围内的转移。转移。 jg

27、 label ;如果标号;如果标号“label”超出范围,汇编时将出错超出范围,汇编时将出错可以把上面指令修改为:可以把上面指令修改为:3131(4)根据)根据cx/ecx寄存器值的条件转移指令寄存器值的条件转移指令指令格式指令格式: jcxzlabel;若;若cx=0,转移到,转移到label jecxz label;若;若ecx=0,转移到,转移到label它们的转移范围固定为下一条指令地址它们的转移范围固定为下一条指令地址128127字节以内。字节以内。32324.2.1 4.2.1 基本选择结构基本选择结构4.2.2 4.2.2 单分支选择结构单分支选择结构4.2.3 4.2.3 复合

28、选择结构复合选择结构4.2.4 4.2.4 多分支选择结构多分支选择结构3333为为“|x|3”和和“|x|3”分别编制了进行不同处理的指令序列。分别编制了进行不同处理的指令序列。如果条件如果条件“|x|3”成立(为成立(为“真真”),执行),执行 “y=3x5”如果条件如果条件“|x|3”不成立(为不成立(为“假假”),执行),执行y=6通过在不同的程序之间进行选择,实现程序的不同功能,通过在不同的程序之间进行选择,实现程序的不同功能,“选择选择结构结构”因此得名。因此得名。 653xy33xx计算分段函数的值计算分段函数的值34344.2.1 4.2.1 基本选择结构基本选择结构3535c

29、odesegmentassumecs: codestart:jmpbeginxdb?; 被测试的数,汇编之前置入被测试的数,汇编之前置入yesdb0ah, 0dh, “its a even number.”, 0ah, 0dh, $nodb0ah, 0dh, “its a odd number.”, 0ah, 0dh, $begin:pushcspopds例例4-2 判断变量判断变量x的值是否为的值是否为“偶数偶数”3636testx, 1;测试;测试x的最低位,确定是否为偶数的最低位,确定是否为偶数jzevn;zf=1,该数是偶数,转向,该数是偶数,转向“evn”odd:leadx, no;

30、否则,该数是奇数;否则,该数是奇数movah, 9int21h;输出奇数的相关信息;输出奇数的相关信息jmpdone;跳过程序;跳过程序“evn”evn:leadx, yesmovah, 9int21h;输出偶数的相关信息;输出偶数的相关信息done:movax, 4c00hint21hcodeendsendstart3737testx, 1;测试;测试x的最低位,确定是否为偶数的最低位,确定是否为偶数jzevn;zf=1,该数是偶数,转向,该数是偶数,转向“evn”odd:lea dx, no;否则,该数是奇数;否则,该数是奇数jmp done ;跳过程序;跳过程序“evn”evn:lea

31、dx, yes;该数是偶数;该数是偶数done:movah, 9int21h;输出该数的相关信息;输出该数的相关信息mov ax, 4c00h如果两个如果两个“平行平行”分支有相同的处理过程,可以把它们分支有相同的处理过程,可以把它们“合并合并” :3838变量变量x取值取值93h,汇编、连接后运行该程序,程序输出:,汇编、连接后运行该程序,程序输出:its a odd number.变量变量x取值取值94h,汇编、连接后运行该程序,程序输出:,汇编、连接后运行该程序,程序输出:its a even number.3939datasegmentprompt db 0dh, 0ah, “ inp

32、ut a lowercase letter: $”;提示提示err_msg db 0dh, 0ah, “ input error . $”;输入错误警告;输入错误警告bufdb 0dh, 0ah, prev: ;输出缓冲区;输出缓冲区prevdb 20hdb 0dh, 0ah, succ: succdb 20hdb 0dh, 0ah, $dataendscodesegmentassumecs: code, ds: data例例4-3 从键盘上输入一个小写字母,显示该字母的前导和后继。从键盘上输入一个小写字母,显示该字母的前导和后继。4040start:mov ax, datamov ds, a

33、xinput:leadx, promptmov ah, 9int21h;输出提示信息;输出提示信息mov ah, 1int21h;输入一个字符;输入一个字符cmp al, a;输入正确性检查;输入正确性检查jberrorcmp al, zjaerrormov bl, al;计算;计算“前导前导”字母字母decbl4141cmp bl, ajbskip1;“前导前导”非字母,跳过非字母,跳过mov prev, bl;保存;保存“前导前导”字母字母skip1:incal;计算;计算“后继后继”字母字母cmp al, zjaskip2;“后继后继”非字母,跳过非字母,跳过mov succ, al;“

34、后继后继”为字母,保存为字母,保存skip2:lea dx, buf;输出;输出“前导前导”和和“后继后继”字母字母mov ah, 09hint21hjmpexit;跳过出错处理程序;跳过出错处理程序4242error:lea dx, err-msg;显示出错信息;显示出错信息mov ah, 09hint21hjmpinput;要求重新输入;要求重新输入exit:movax, 4c00h;返回;返回osint21hcodeendsendstart健壮性健壮性预设结果预设结果程序要点程序要点:4343例例4-4 计算分段函数计算分段函数 653xy33xxincludeylib.hdataseg

35、mentpromptdb0dh, 0ah, “input x ( -10000+10000 ): $”xdw?out_msgdb0dh, 0ah, “y= $”dataendscodesegmentassumecs: code, ds: datastart:movax, data movds, ax;装载;装载ds4444leadx, prompt;输入提示信息;输入提示信息callreadint;从键盘上输入;从键盘上输入x的值的值movx, ax;保存输入值;保存输入值comp:cmp x, 3;比较,;比较,x3 ?jggreater ;x3成立,转成立,转“greater”cmpx,

36、-3;比较,;比较,x3 ?jlgreater ;x3 的程序段的程序段output:lea dx, out_msg ;结果的前导文字;结果的前导文字call writeint;输出计算结果;输出计算结果call crlf;输出回车换行;输出回车换行exit:mov ax, 4c00hint 21hcodeendsend start4646复合逻辑表达式的分解复合逻辑表达式的分解47474.2.2 4.2.2 单分支选择结构单分支选择结构 如果选择结构的一个分支为如果选择结构的一个分支为“空空”,这样的程序流程称为,这样的程序流程称为“单分支选择结构单分支选择结构”。合理地选择合理地选择jcc

37、指令所使用的条件,可以使程序更加流畅。指令所使用的条件,可以使程序更加流畅。 可以把一些基本选择结构程序改写为单分支选择结构。可以把一些基本选择结构程序改写为单分支选择结构。 4848例例4-4为例,可以将为例,可以将y“预设预设”为为6,一旦条件,一旦条件|x|3成立,立即转成立,立即转向向output输出输出“预设预设”的结果,否则进行相应的计算。的结果,否则进行相应的计算。4949 comp:mov ax, 6;预设;预设ax= 6cmp x, 3;比较,;比较,x3 ?jg output;若;若x3,转,转output输出输出cmp x, -3;比较,;比较,x3 ?jl output

38、;若;若x3,转转output输出输出less:;|x3 的程序段的程序段mov ax, x;axx mov bx, ax;bxxsal ax, 1;ax2xadd ax, bx;ax2x+xsub ax, 5;ax3x5output:lea dx, out_msg;结果的前导文字;结果的前导文字 call writeint;输出计算结果;输出计算结果5050例例4-5 将将4位二进制转换成对应的十六进制字符位二进制转换成对应的十六进制字符 hxhxy373099xx mov al, x cmp al, 9 jaalph addal, 30h jmpdonealph: addal, 37hdo

39、ne: mov y, al moval, x oral, 30h cmpal, 9 jbedone addal, 7done: movy, al5151 选择结构一个分支的程序中又出现了选择结构,这样的选择结构一个分支的程序中又出现了选择结构,这样的结构称为结构称为“复合选择结构复合选择结构”或者或者“嵌套选择结构嵌套选择结构”。4.2.3 4.2.3 复合选择结构复合选择结构排除法:每次判断排除若干可能,留下一种可能情况进行处理;排除法:每次判断排除若干可能,留下一种可能情况进行处理;确认法:每次判断确认一种可能,对已确认的情况进行处理。确认法:每次判断确认一种可能,对已确认的情况进行处理。

40、5252;方法;方法a,逐项排除,逐项排除 cmpx, 0 jgeun_minusminus: movy, -1 jmpdoneun_minus: jezero movy, 1 jmpdonezero: movy, 0done:;方法;方法b,逐项确认,逐项确认 cmpx, 0 jgplus jezerominus: movy, -1 jmpdoneplus: movy, 1 jmpdonezero: movy, 0done:例例4-6 计算计算y=sgn(x)5353复合分支选择结构复合分支选择结构 54544.2.4 4.2.4 多分支选择结构多分支选择结构在选择结构程序里,如果可供选择的

41、程序块多于两个,这样在选择结构程序里,如果可供选择的程序块多于两个,这样的结构称为多分支选择结构,如下图的结构称为多分支选择结构,如下图 (a)所示,下图所示,下图 (b)是汇是汇编语言程序的实现方法。编语言程序的实现方法。5555datasegmentpromptdb0dh, 0ah, “input a number (13): $”msg1 db0dh, 0ah, “function 1 executed . $”msg2 db0dh, 0ah, “function 2 executed . $”msg3 db0dh, 0ah, “function 3 executed . $”datae

42、ndscodesegmentassumecs: code, ds: datastart:mov ax, datamov ds, ax例例4-7 从键盘上输入数字从键盘上输入数字“1”到到“3”,根据输入选择对应程,根据输入选择对应程序序 块执行。块执行。5656input:lea dx, promptmov ah, 9int21h;输出提示信息;输出提示信息mov ah, 1int21h;输入一个数字;输入一个数字cmp al, 1jbinput;“0”或非数字,重新输入或非数字,重新输入jef1;数字;数字“1”,转,转f1cmp al, 2jef2;数字;数字“2”,转,转f2cmp al

43、, 3jef3;数字;数字“3”,转,转f3jmpinput;大于;大于“3”,重新输入,重新输入5757f1:leadx, msg1;f1程序块程序块jmpoutputf2:leadx, msg2;f2程序块程序块jmpoutputf3:leadx, msg3;f3程序块程序块jmpoutputoutput:mov ah, 9int21hmov ax, 4c00hint21hcodeendsendstart 5858把完成各功能的程序块入口地址放在一张表格中,根据输入,把完成各功能的程序块入口地址放在一张表格中,根据输入,计算出该功能程序块入口地址在表中的位置,通过存储器间接计算出该功能程序

44、块入口地址在表中的位置,通过存储器间接转移转入对应位置执行。转移转入对应位置执行。datasegment promptdb 0dh, 0ah, “input a number (13): $”msg1db 0dh, 0ah, “function 1 executed . $”msg2db 0dh, 0ah, “function 2 executed . $”msg3db 0dh, 0ah, “function 3 executed . $”addtbldw f1, f2, f3dataendscodesegmentassumecs: code, ds: data5959start:mov ax

45、, datamovds, axinput:leadx, promptmovah, 9int21h;显示提示信息;显示提示信息movah, 1int21h;输入一个数字;输入一个数字cmpal, 1jbinput ;不正确输入,重新输入;不正确输入,重新输入cmpal, 3jainput ;不正确输入,重新输入;不正确输入,重新输入6060subal, 1 ;将数字字符;将数字字符“1”到到“3”转换为转换为0, 1, 2shlal, 1;转换为;转换为0,2,4movbl, almovbh, 0;转入;转入bxjmpaddtblbx;间接寻址,转移到对应程序块;间接寻址,转移到对应程序块f1:

46、leadx, msg1;f1程序块程序块jmpoutputf2:leadx, msg2;f2程序块程序块jmpoutputf3:leadx, msg3;f3程序块程序块jmpoutput;这条指令可以省略;这条指令可以省略6161output:mov ah, 9int21hmov ax, 4c00hint21hcodeendsendstart62624.3.1 4.3.1 循环指令循环指令4.3.2 4.3.2 计数循环计数循环4.3.3 4.3.3 条件循环条件循环4.3.4 4.3.4 多重循环多重循环6363循环结构循环结构也称为也称为“重复结构重复结构”,它使得一组指令重复地执行,可以

47、用有限长度的程序,它使得一组指令重复地执行,可以用有限长度的程序完成大量的处理任务,几乎所有的应用程序中都离不开循环结构。完成大量的处理任务,几乎所有的应用程序中都离不开循环结构。循环一般由以下循环一般由以下4个部分组成:个部分组成:(1)初始化部分初始化部分:为循环做准备,如累加器清零,设置地址指:为循环做准备,如累加器清零,设置地址指针和计数器的初始值等。针和计数器的初始值等。(2)工作部分工作部分:实现循环的基本操作,也就是需要重复执行的:实现循环的基本操作,也就是需要重复执行的一段程序。一段程序。(3)修改部分修改部分:修改指针、计数器的值,为下一次循环做准备。:修改指针、计数器的值,

48、为下一次循环做准备。(4)控制部分控制部分:判断循环条件,结束循环或继续循环。:判断循环条件,结束循环或继续循环。6464计数循环计数循环:循环的次数事先已经知道,用一个变量(寄存器或存储器单元)记录循环的循环的次数事先已经知道,用一个变量(寄存器或存储器单元)记录循环的次数(称为次数(称为“循环计数循环计数 器器”)。进行减法计数时,循环计数器的初值直接设)。进行减法计数时,循环计数器的初值直接设为循环次数,每循环一次将计数器减为循环次数,每循环一次将计数器减1,计数器减为,计数器减为0时,循环结束。时,循环结束。条件循环条件循环:循环的次数事先并不确定,每次循环开始前或结束后测试某个条件,

49、根据这循环的次数事先并不确定,每次循环开始前或结束后测试某个条件,根据这个条件是否满足来决定是否继续下一次循环。个条件是否满足来决定是否继续下一次循环。按照循环结束的条件,有以下两类循环:按照循环结束的条件,有以下两类循环:6565按照循环结束判断在循环中的位置,有以下两种结构的循环:按照循环结束判断在循环中的位置,有以下两种结构的循环:whilewhile循环循环:进入循环后,先判断循环结束条件,条件满足则退出循环,循进入循环后,先判断循环结束条件,条件满足则退出循环,循环次数最少为环次数最少为0次。次。do-whiledo-while循环循环:进入循环后,先执行工作部分,然后判断循环继续的

50、条件,条进入循环后,先执行工作部分,然后判断循环继续的条件,条件满足则转向工作部分继续循环,循环次数最少件满足则转向工作部分继续循环,循环次数最少1次。次。66666767looplabel ; cxcx-1,若,若(cx)0,转移到,转移到labelloopz/loope label; cxcx-1,若,若(cx)0且且zf=1,转移到,转移到labelloopnz/loopne label; cxcx-1,若,若(cx)0且且zf=0,转移到,转移到label4.3.1 4.3.1 循环指令循环指令 循环指令采用相对寻址方式,循环指令采用相对寻址方式,label距离循环指令的下一条指距离循

51、环指令的下一条指令必须在令必须在-128+127b之内。之内。6868 loopz/loope,loopnz/loopne指令的功能也可以由指令的功能也可以由jcc指令实现。指令实现。 由于对由于对cx先减先减1,后判断,如果,后判断,如果cx的初值为的初值为0,将循环,将循环65536次。次。 循环指令的执行不影响标志位。循环指令的执行不影响标志位。loop指令的功能可以用指令的功能可以用jcc指令实现:指令实现:deccx; cxcx-1jnzlabel ; 若若(cx)0(也就是(也就是zf=0),转移到),转移到label6969 计数循环是基本的循环组织方式,用循环计数器的值来控制计

52、数循环是基本的循环组织方式,用循环计数器的值来控制循环,有时候也可以结合其它条件共同控制。循环,有时候也可以结合其它条件共同控制。4.3.2 4.3.2 计数循环计数循环例例4-8 从键盘上输入一个字符串(不超过从键盘上输入一个字符串(不超过80个字符),将它个字符),将它逆序后输出。逆序后输出。includeylib.hdatasegmentbufferdb81, ?, 81 dup(?)messdb0ah, 0dh, “input a string please : $”dataends7070codesegmentassume cs:code, ds:datastart:mov ax,

53、datamovds, axleadx, messmovah, 09hint21h; 输出提示信息输出提示信息movah, 0ahleadx, bufferint21h; 输入字符串输入字符串callcrlfleabx, buffer; 缓冲区首地址送缓冲区首地址送bxmovcl, buffer+1movch, 0; 输入字符个数送输入字符个数送cx(循环次数)(循环次数)7171addbx, cxincbx; 计算字符串末地址送计算字符串末地址送bx(指针)(指针)disp: mov dl, bxmov ah, 02hint21h; 逆序输出一个字符逆序输出一个字符decbx; 修改指针修改指

54、针loopdisp; 计数循环计数循环call crlf; 输出换行、回车,结束本行输出换行、回车,结束本行mov ax, 4c00hint21hcodeendsendstart7272includeylib.hdatasegmentmess1db0ah, 0dh, “input a number : $”mess2db0ah, 0dh, “the number in hexdecimal is: $”hextabdb“0123456789abcdef”dataendscodesegmentassumecs: code, ds: datastart:mov ax, datamov ds, ax

55、例例4-9 从键盘上输入一个十进制无符号整数,将它用十六进从键盘上输入一个十进制无符号整数,将它用十六进制格式输出。制格式输出。7373 leadx, mess1call readdec; 输入一个十进制无符号数输入一个十进制无符号数mov si, ax; 转存在转存在si中中leadx, mess2mov ah, 9int21h; 输出文字前导输出文字前导mov cx, 4; 循环次数初值循环次数初值leabx, hextab; 换码表首地址换码表首地址one: push cxmov cl, 4 rolsi, cl; 把最高把最高4 4位移到最低位移到最低4 4位位7474mov ax, s

56、i; 转入转入ax中中andax, 000fh; 保留最低保留最低4位位xlat; 查表查表,转换成十六进制字符的转换成十六进制字符的ascii代码代码mov dl, almov ah, 2 int21h; 输出一个十六进制字符输出一个十六进制字符popcxloopone; 计数循环计数循环call crlf; 输出回车换行输出回车换行, 结束本行结束本行mov ax, 4c00hint21hcodeendsendstart7575 用总分减去最高分、最低分,最后除以用总分减去最高分、最低分,最后除以5,得到需要的成绩。,得到需要的成绩。 求求n个数据中最大值的方法:个数据中最大值的方法:预设

57、一个预设一个“最大值最大值”,取出一个数据与这个取出一个数据与这个“最大值最大值”进行比较,进行比较, 如果数据大于如果数据大于“最大值最大值”,则将该数据作为新的,则将该数据作为新的“最大最大值值”。进行进行n次比较之后留下的就是这次比较之后留下的就是这n个数据的最大值。个数据的最大值。 预设的预设的“最大值最大值”的初值可以从的初值可以从n个数据中任取一个,也可以个数据中任取一个,也可以根根据数据的范围,取一个该范围内的最小的数。据数据的范围,取一个该范围内的最小的数。 计算最小值的方法与此类似。计算最小值的方法与此类似。例例4-10 从键盘上输入七名裁判的评分(从键盘上输入七名裁判的评分

58、(010),扣除一个最),扣除一个最高分,一个最低分,计算出其它五项评分的平均值(保留高分,一个最低分,计算出其它五项评分的平均值(保留一位小数),在显示器上输出。一位小数),在显示器上输出。7676includeylib.hdatasegmentmess1db0dh, 0ah, “input a score ( 010 ) : $”mess2db0dh, 0ah, “the final score is : $”c5db5maxdb?mindb?sumdb?dataendscodesegmentassumecs: code, ds: datastart:mov ax, datamov ds,

59、 ax7777mov sum, 0; 累加器清零累加器清零mov max, 0; “最大值最大值”预设为预设为0mov min, 255; “最小值最小值”预设为预设为255mov cx, 7; 循环计数器,初值循环计数器,初值7one: leadx, mess1call readdec; 键盘输入一个分数键盘输入一个分数addsum, al; 累加累加cmp max, al; 与与“最大值最大值”比较比较jal1mov max, al; 大于大于“最大值最大值”则保留则保留l1:cmp min, al; 与与“最小值最小值”比较比较jbl2mov min, al; 小于小于“最小值最小值”则

60、保留则保留l2:loopone; 计数循环计数循环7878mov al, sumsubal, maxsubal, min; 从总分中减去最大、最小值从总分中减去最大、最小值mov sum, alxor ah, ah; 高高8位清零位清零divc5; 求平均值求平均值push ax; 保留余数(在保留余数(在ah中)中)mov ah, 0; 清余数清余数leadx, mess2call writedec; 输出结果的整数部分输出结果的整数部分 7979mov dl, .mov ah, 2int21h; 输出小数点输出小数点popax; 从堆栈弹出余数从堆栈弹出余数shlah, 1 ; 计算小数部

温馨提示

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

评论

0/150

提交评论