《汇编语言程序设计》-相伟-电子教案第4章课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《汇编语言程序设计》-相伟-电子教案第4章课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言程序设计 汇编语言 程序设计 相伟 电子 教案 课件
- 资源描述:
-
1、21世纪高等院校规划教材汇编语言程序设计相 伟 主编徐小平 李珍香 副主编中国水利水电出版社第4章 分支程序设计n本章主要讲解分支程序设计的基本思想和设计方法。通过本章学习,读者应掌握以下内容:n段内寻址与段间寻址n无条件转移指令n条件转移指令n二分支程序设计方法n多分支程序设计方法4.1 转移地址的寻址方式nIntel 8086/8088CPU中,程序的执行顺序是由代码段寄存器CS和指令指针IP确定的。CS包含当前指令所在代码段的段地址,IP则是要执行的下一条指令的偏移地址。通常情况下,程序是顺序执行的,即CPU取出指令后,自动形成下一条指令的地址,依指令序列顺序执行。但有时需要改变程序的流
2、程,这就要给出目标指令的段地址(CS)和偏移地址(IP)值,这就是与转移地址有关的寻址方式。n与转移地址有关的寻址方式有四种:段内直接寻址、段内间接寻址、段间直接寻址和段间间接寻址。4.1.1 段内寻址n段内寻址分为段内直接寻址和段内间接寻址两种方式。其转移方式是在当前代码段64KB范围内转移,因此不需要更改段地址CS的值,只要改变偏移地址IP的值即可。1段内直接寻址n指令中直接给出转移地址的偏移量(8位或16位),转移目标与转移指令在同一段内。转移指令执行后,CS值保持不变。转移的有效地址为当前的IP值与指令中指定的偏移量之和。即n 目标地址=IP(当前值)+偏移量n其中偏移量为8位或16位
3、有符号数。若偏移量为正数,向前转移(即高地址方向);若偏移量为负数,则向后转移(即低地址方向)。另外,对8位偏移量,其转移范围为-128 +127,称为短转移;对16位偏移量,其转移范围为-32768 +32767,称为近转移。n短转移指令为2字节指令,IP的当前值为转移指令所在的IP值加2。近转移指令为3字节指令,IP的当前值为转移指令所在的IP值加3。例4-1:分析下列指令。n JMP SHORT DSP1 ;短转移指令n JMP NEAR PTR DSP2 ;近转移指令n假设两条指令存放地址均为1000H:0200H,偏移量DSP1为08H,偏移量DSP2为0012H。n短转移指令执行时
4、,当前IP值=0200H+2=0202H。目标地址=IP(当前值)+偏移量=0202H+08H=020AH 指令执行后将转向1000H:020AH去执行。n近转移指令执行时,当前IP值=0200H+3=0203H。目标地址=IP(当前值)+偏移量=0203H+0012H=0215H 指令执行后将转向1000H:0215H去执行。2段内间接寻址n与段内直接寻址方式相同,转移目标与转移指令在同一段内。转移指令执行后,CS值保持不变。与段内直接寻址方式不同的是,转移的有效地址值存放在16位的通用寄存器或连续两个存储单元中。若有效地址在存储单元中,一定要指出存储单元为字型。例4-2:假设(DS)=20
5、00H,(BX)=3000H,(23000H)=2536H,分析下列指令。nJMP BX 指令执行后,将BX的内容直接赋给IP。所以,(IP)=3000H。nJMP WORD PTRBX 指令执行后,先计算出存储单元地址23000H,再从该单元中取出内容送给IP。所以,(IP)=2536H。4.1.2 段间寻址n段间寻址分为段间直接寻址和段间间接寻址两种方式。其转移方式是从当前代码段跳转到另一个代码段,因此需要修改CS段地址和IP偏移地址的值。1段间直接寻址n在指令中直接给出了转移目标的段地址和偏移地址。只要用指令中指定的偏移地址代替IP寄存器的内容,用指令中指定的段地址代替段寄存器CS的内容
6、就可以完成从一个段到另一个段的转移操作。段间直接转移通常叫远转移(far jump),指令的操作数必须附加FAR PTR操作符。例4-3:执行如下指令n JMP FAR PTR DSPn假设指令存放地址为1000H:0200H,DSP的有效地址为3620H,段地址为2000H。n则指令执行后,(IP)=3620H,(CS)=2000H。程序转移到2000H:3620H处继续执行。2段间间接寻址n与段间直接寻址方式相同,转移目标与转移指令不在同一段内,转移指令执行后,CS和IP都发生变化。不同的是转移目标的偏移地址和段地址存储在两个连续的字存储单元中。因此指令中需要用DWORD PTR操作符将存
7、储单元指定为双字单元。指令执行时,根据存储单元的寻址方式计算出存储单元地址,从该存储单元取第一个字传送到IP,取第二个字传送到CS,这样就可以实现段间转移。例4-4:执行如下指令n JMP DWORD PTR 6BXn假设:(CS)=1000H,(IP)=0600H,(DS)=2000H,(BX)=1000H,(21006H)=3000H,(21008H)=6000H。n则指令执行后,(CS)=6000H,(IP)=3000H。n程序转移到6000H:3000H处继续执行。4.2 无条件转移指令n无条件转移指令JMP使CPU无条件地转移到指令中指明的目的地址处执行。它不能构成分支程序,但在分支
8、程序中却往往需要用它将各分支的出口重新汇集到一起。特别是当条件转移指令的转移范围超过-128 +127个字节时,往往要借助无条件转移指令实现预定的转移。n转移可分成两类:段内转移和段间转移。段内转移是指在同一代码段内进行转移,此时只需改变IP寄存器的内容,即用新的转移目标地址代替原有的IP值就可达到转移的目的。段间转移则是要转到另一个段去执行程序,此时不仅要修改IP寄存器的内容,还需要修改CS寄存器的内容才能达到目的。因此,此时的转移目标地址应该由新的段地址和偏移地址两部分组成。4.2.1 段内无条件转移1段内直接转移n指令格式:n JMP 标号 ;IP(IP)+位移量n JMP SHORT
9、标号 ;IP(IP)+8位位移量,短转移n JMP NEAR PTR 标号 ;IP(IP)+16位位移量,近转移n功能:无条件地转移到指令指定的标号处,执行从该标号开始的指令。n其中:JMP为指令操作码。标号为8位或16位偏移量。2段内间接转移n指令格式:JMP 寄存器 JMP WORD PTR 存储单元n功能:程序转移的有效地址放在寄存器或存储单元中,执行指令时,将寄存器或字存储单元中的有效地址写入IP,从而实现转移。4.2.2 段间无条件转移1段间直接转移n指令格式:JMP 标号 JMP FAR PTR 标号n功能:无条件地转移到另一个代码段的标号处,执行从该标号开始的指令。标号所在段的段
10、地址作为新的CS,标号在该段内的偏移地址作为新的IP。2段间间接转移n指令格式:JMP DWORD PTR 存储单元n功能:指令执行时,从指定存储单元连续取出两个字,第一个字送给IP,第二个字送给CS,从而实现段间转移。nJMP指令不影响状态标志位。4.3 条件转移指令n条件转移指令根据上一条指令所设置的条件标志作判断依据,条件满足则程序转移,否则顺序执行。这类转移指令的转移均属于短转移,即转移目标地址距当前IP所表示的地址的距离为-128 +127字节。n语句格式为:助记符 标号n条件转移指令共有18条,可分成以下三类:n 简单条件转移指令。n 无符号数条件转移指令。n 有符号数条件转移指令
11、。n条件转移指令均不影响状态标志位。4.3.1 简单条件转移指令n简单条件转移指令共有10条指令。它们是根据5个标志位CF、ZF、SF、OF、PF的两种状态(1或0)而设置的。一般适用于测试某一次运算结果的状态,并根据不同的状态标志产生不同的分支进行处理。n下面分别举例说明。例4-5:假设AX中为一带符号数,求AX中数的绝对值。n分析:求一个数的绝对值时,首先要测试该数的正负。我们可以测试其最高位,也可以测试符号标志。因此以下两个程序段均可求出AX中数的绝对值。n程序段1:TEST AX,8000H JZ NEXT ;测试AX最高位,为零该数为正,转到NEXT NEG AX ;否则,AX为负,
12、求补运算 NEXT:n程序段2:AND AX,AX ;影响标志位 JNS NEXT ;测试AX的符号位,为正则转到NEXT NEG AX ;否则,AX为负,求补运算 NEXT:例4-6:计算X+Y,X和Y单元分别存放着一个16位有符号数。若结果有溢出,则转移到OVERFLOW处理。n分析:两个有符号数相加,影响OF的值。若OF置1,则产生溢出。n程序段如下:MOV AX,X ADD AX,Y JO OVERFLOW ;没有溢出,结果正确nOVERFLOW:;溢出处理例4-7:统计寄存器BX中1的个数。n分析:要统计寄存器BX中1的个数,可以通过移位指令将BX中的每一位依次移入CF中,若CF=1
13、则CL的值加1。这样就可以统计出BX中1的个数。n程序段如下:MOV CL,0;保存BX中1的个数,初值为0 AGAIN:AND BX,BX JZ EXIT,(BX)=0时,结束循环转EXIT SAL BX,1 ;将BX中的最高位移入CF中 JNC AGAIN ;如果CF=0转AGAIN INC CL ;否则,CL的值加1 JMP AGAIN ;转AGAIN处继续处理 EXIT:4.3.2 无符号数条件转移指令n这类指令往往跟在比较指令之后,视比较对象为无符号数。根据比较结果的不同状态,设置了高于(A-Above)、高于或等于(AE-Above or Equal)、低于(B-Below)、低于
14、或等于(BE-Below or Equal)四条指令。无符号数条件转移指令n JA/JNBE 用于两个无符号数a、b的比较,若ab则条件满足,实现转移。n JNA/JBE 用于两个无符号数a、b的比较,若ab则条件满足,实现转移。n JB/JNAE 用于两个无符号数a、b的比较,若ab则条件满足,实现转移。n JNB/JAE 用于两个无符号数a、b的比较,若ab则条件满足,实现转移。n四条指令的共同点是根据两个无符号数比较的结果,判断CF、ZF的状态是否满足转移条件,当满足条件时转移,否则顺序执行。适用于地址比较、循环次数比较或双精度数的低位字的比较等。例4-8:阅读下面程序段,若寄存器AL的
15、值分别取20H、5、0FFH和2,分析程序段的执行情况。n程序段如下:CMP AL,5 JA NEXT ADD AL,5 NEXT:n分析:本程序段使用了无符号数跳转指令JA,若(AL)5则转NEXT,否则顺序执行。n(1)(AL)=20H5,满足条件,跳至NEXT处执行。n(2)(AL)=5,不满足条件,顺序执行“ADD AL,5”。n(3)(AL)=0FFH,由于JA是无符号数跳转指令,对无符号数来说(AL)=0FFH5,满足转移条件,故跳转至NEXT处执行。n(4)(AL)=25,不满足条件,故顺序执行后继指令。例4-9:分析以下程序段:n MOV SI,0 ;SI0nJP:MOV WO
16、RD PTR SI,0 ;SI 0n ADD SI,2 ;SI(SI)+2n CMP SI,0F000H ;判断(SI)是否小于等 于0F000Hn JNA JP ;若小于等于,则转JP执行n n分析:该程序段的功能是将当前数据段中偏移地址为0 0F000H的全部字存储单元清0,其中SI为送数指针。n注意:在比较判断(SI)是否小于等于0F000H时,由于地址是无符号数,所以必须选用无符号数条件转移指令JNA,才能完成预定功能。4.3.3 带符号数条件转移指令n在程序设计中,有时需要把处理对象视为带符号数(补码表示)。当比较两个带符号数的大小时,要选用带符号数条件转移指令。带符号数条件转移指令
17、是根据条件标志ZF、SF、OF的特定组合来决定是否转移,共设置了大于、大于或等于、小于、小于或等于四条指令。带符号数条件转移指令n JG/JNLE 用于两个有符号数a、b比较。若ab,即符号标志SF与溢出标志OF具有相同状态(SF=OF)且零标志ZF=0时,条件满足,实现转移。n JNG/JLE 用于两个有符号数a、b的比较。若ab,即当SFOF或ZF=1时,条件满足,实现转移。n JL/JNGE 用于两个有符号数a、b的比较。若ab,即当SFOF时,条件满足,实现转移。n JNL/JGE 用于两个有符号数a、b的比较。若ab,即当SF=OF时,条件满足,实现转移。n四条指令的共同点是根据两个
18、带符号数比较运算的结果,组合SF、OF标志,并利用ZF标志确定转移与否。n下面举例说明条件转移指令的使用方法。例4-10:假设有两个双精度数a和b,分别存储在AX、BX和CX、DX中,分析下列程序段的功能。n程序段如下:CMP AX,CX JG UPPER JL LOWER CMP BX,DX JA UPPER LOWER:UPPER:图4-4 比较两个数大小算法流程图(AX)(CX)(AX)(DX)NNNYYY标号UPPER处标号LOWER处n分析:本程序段的功能是比较两个双精度数a和b的大小,若ab则转向UPPER执行,否则转向LOWER执行。程序段流程图如图4-4所示。例4-11:将例4
19、-9程序段中的JNA指令改成JNG指令,分析程序段功能。n程序段如下:MOV SI,0 ;SI0 JP:MOV WORD PTR SI,0 ;SI 0 ADD SI,2 ;SI(SI)+2 CMP SI,0F000H ;判断(SI)是否小于等于0F000H JNG JP ;若小于等于,则转JP执行 分析:n该程序段在进行比较判断时,选用了带符号数条件转移指令JNG。在第一次执行比较指令“CMP SI,0F000H ”时,(SI)=2,它与带符号数0F000H(即1000H)比较,显然21000H,不满足“JNG”的转移条件而顺序执行后继语句。这样就只能将0送入偏移地址为0的字单元中,无法实现将
展开阅读全文