程序控制指令.ppt_第1页
程序控制指令.ppt_第2页
程序控制指令.ppt_第3页
程序控制指令.ppt_第4页
程序控制指令.ppt_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

1 3 3 5程序控制指令 控制转移指令分为 转移指令循环控制指令调用和返回指令中断指令 2 表4 6控制转移类指令 3 续表 2 4 续表 3 5 续表 4 6 转移指令的实质 改变IP 或者CS和IP 的内容 对标志位flags的影响 所有转移指令不会影响标志位flags 分类 分为无条件转移和条件转移两种 1 转移指令 7 1 无条件转移指令 JMP本指令无条件转移到指定的目标地址 以执行从该地址开始的程序段 根据设置CS IP的方法 JMP指令可实现短 近 远距离跳转 指令分成4种情况 段内直接转移 JMPdisp指令中给出的8 16位的位移量加到IP CS保持不变 段内间接转移 JMPreg memreg mem中的16位偏移地址送IP CS保持不变 段间直接转移JMPsegment offset指令中给出的16位的段和16位的偏移地址送到CS和IP 段间间接转移JMPmem32mem32中的16位的段和16位的偏移地址送到CS和IP 8 转移的目标地址由指令直接给出 指令中给出的目标地址实际上是一个相对于IP的位移量 JMPdisp 位移量转移范围汇编语言中格式8位 128 127JMPSHORTOPRD 短距离16位 32768 32767JMPNEARPTROPRD或OPRD 近距离注意 disp的助记符写为新IP 而disp的机器码为位移量d 新IP 原IP 位移量d 例 JMP0120H 直接转向0120H 缺省为NEAR JMPSHORTLP 转向LPJMPNEARPTRBBB 转向BBB由于是段内转移 故转移后CS内容保持不变 段内直接转移 9 无条件段内转移 直接转移 JMPLable转移目标地址 段基地址CS不变 偏移地址IP 当前IP 位移量 16位 JMPLable Label 代码段 位移量 近地址标号 CS IP 10 段内间接转移转移的目标地址由寄存器或存储单元的内容给出 例1 JMPSI 近距离若 SI 1200H 则指令执行后 IP 1200H 于是转向代码段的偏移地址1200H处开始执行 注意 目标地址以段内偏移的形式给出 而不是相对于IP的位移量 所以它是一个16位的操作数 11 无条件段内转移 间接转移 JMPBXJMPWORDPTR BX JMPBX 代码段 数据段 BX 1200 XXH XXH IP 指令码 CS IP 12 例2 JMP BX DI 设指令执行前 DS 3000H BX 1300H DI 1200H 32500H 2350H 则指令执行后 IP 2350H在汇编语言中 段内间接寻址通常写成 JMPWORDPTR BX DI 表示所取得的目标地址是一个字 13 段间直接转移在指令中直接给出要转移到的目的段地址和偏移地址 例 JMP2000H 1000H 远距离执行时 IP 1000H CS 2000H注意 直接地址为符号地址时 段间直接转移指令中的符号地址前应加操作符FARPTR 例 JMPFARPTRfar label 远距离其中的far label为远类型的标号 14 无条件段间转移 直接转移 JMPFARPTRLable 远地址标号 JMP Label 代码段1 代码段2 XXH XXH XXH XXH IP CS CS IP 15 转移的目的地址 段和偏移 在两个相邻的字存储单元中 例如 JMPDWORDPTR SI 远距离设指令执行前 DS 4000H SI 1212H 41212H 1000H 41214H 4A00H则指令执行后 IP 1000H CS 4A00H于是转到4B000H处开始执行指令 例中的DWORDPTR表示转移地址是一个双字 段间间接转移 16 无条件段间转移 间接转移 JMPDWORDPTR BX XXH XXH XXH XXH BX IP CS JMP 指令码 代码段1 代码段2 数据段 CS IP 17 4000 1212 41212 DS SI 00 10 00 4A 41212412134121441215 1000 4A00 IP CS 段间间接转移操作示意图 11111111 11101100 JMPDWORDPTR SI 的机器码 DS SI 18 条件转移指令可实现程序的条件分支 条件转移指令根据标志位的状态来决定是否进行分支转移 格式 JXXlabel xx为条件名称缩写指令的转移范围为 128 127字节 短跳转 主要的条件转移指令参见p142表3 7 2 条件转移指令 JXX 19 根据单个标志位设置的条件转移指令JB JC 低于 或CF 1 则转移JNB JNC JAE 不低于 或CF 0 高于或等于 则转移JP JPE 奇偶标志PF 1 偶 则转移JNP JPO 奇偶标志PF 0 奇 则转移JZ JE 结果为零 ZF 1 则转移JNZ JNE 结果不为零 ZF 0 则转移JS SF 1 则转移JNS SF 0 则转移JO OF 1 则转移JNO OF 0 则转移 20 这类指令主要用来判断两个数的大小 一般指令序列为 CMPdist src 比较Jxxlabel 根据比较结果转移判断无符号数的大小JA高于则转移 dist src 转移条件为 CF 0 ZF 0JNA JBE低于或等于则转移 dist src 转移条件为 CF 1 ZF 1 根据组合条件设置的条件转移指令 21 JG 大于则转移 dist src 转移条件为 SF OF 0 ZF 0JGE 大于或等于则转移 dist src 转移条件为 SF OF 0 ZF 1JL 小于则转移 dist src 转移条件为 SF OF 1 ZF 0JLE 小于或等于则转移 dist src 转移条件为 SF OF 1 ZF 1 判断有符号数的大小 22 根据CX内容来决定是否转移的转移指令JCXZlabel若 CX 0 则转移到label处开始执行 23 条件转移指令举例 以十六进制数形式显示BX中的内容 MOVBX 1234HMOVCH 4 CH做循环计数器ROT MOVCL 4 CL做移位计数器ROLBX CL 将最高4位移到低4位MOVAL BLANDAL 0FH 取出低4位ADDAL 30H 转换为ASCII码CMPAL 39H 与 9 比较JBEDISP 若 AL 9 则转显示ADDAL 7 若 AL 9 再加7转为 A F DISP MOVDL AL DL 字符MOVAH 2INT21H 显示输出DECCH 4个十六进制数显示完否 JNZROT 没有 循环MOVDL 48H H MOVAH 2INT21H 最后显示 H 24 2 循环控制指令 用在循环程序中以确定是否要继续循环 循环次数通常置于CX中 转移的目标应在距离本指令 128 127的范围之内 短跳转 循环控制指令不影响标志位 25 1 LOOP格式 LOOPlabel类比串前缀REP操作 CX 1 CX 若 CX 0 则转至label处执行 否则退出循环 执行LOOP后面的指令 注 LOOP指令与下面的指令段等价 DECCXJNZlabel 26 2 LOOPZ LOOPE 类比串前缀REPZ E格式 LOOPZlabel操作 CX 1 CX 若 CX 0 ZF 1 则转至label处执行 否则退出循环 执行LOOP后面的指令 3 LOOPNZ LOOPNE 类比串前缀REPNZ NE格式 LOOPNZlabel操作 CX 1 CX 若 CX 0 ZF 0 则转至label处执行 否则退出循环 执行LOOP后面的指令 27 例1 给1A000H开始的256个内存单元均减去1 若发现某个单元减为0则立即退出循环 其后的单元不再减1 程序段如下 逻辑地址为1A00 0H MOVAX 1A00HMOVDS AX 1A00H段MOVDI 1MOVCX 256GOON INCDIDECBYTEPTR DI LOOPNZGOONHLT 28 例2 在8000H开始的长度为1000字节的字符串中查找 S 若找到 把其偏移地址记录在ADDR中 否则ADDR单元置为0FFFFH MOVDI 8000HMOVCX 1000MOVAL S MOVADDR 0FFFFHGOON SCASBLOOPNZGOON 两条可并为REPNZSCASBJNZDONEDECDIMOVADDR DIDONE HLT 29 3 过程调用和返回指令 过程 子程序 一段具有特定功能的 供其它程序调用的公用程序 特点调用子程序时 IP 或CS IP 的内容被压入堆栈栈顶 从子程序返回时 栈顶的内容又被弹出到IP 或CS IP 子程序执行结束后一般均要返回调用程序 一次定义 多次调用 可带参数调用 以完成不同的功能 优点程序代码短 结构清晰 便于编程 调试 修改和阅读 两条相关指令 子程序调用指令CALL子程序返回指令RET 30 断点 入口地址 用于调用一个子过程 调用前须保护断点地址 断点 CALL的下一条指令地址CS IP 再跳转到子程序入口地址 子程序入口地址 子程序的第一条指令地址CS IP 或CS IP 子过程执行结束后要返回原调用处继续执行原程序 断点恢复 RET指令 调用指令CALL与转移指令JMP的比较 RET CALL CALL子程序入口地址 JMP子程序入口地址 PUSHCALL的下一条指令地址 CALL指令功能 31 主程序调用子程序的执行过程 将调用指令的下一条指令的地址 断点 压入堆栈 CALL指令 相当于乎PUSH下一条指令的地址 IP或CS IP 获取子过程的入口地址 子过程第1条指令的偏移地址 CALL指令 相当于乎JMP入口地址 CS IP 或CS IP 执行子过程 含相应参数的保存及恢复 其它指令 将断点偏移地址由堆栈弹出 返回原程序 RET指令 相当于乎POPIP或CS IP 32 一般格式 CALLsub sub为子程序的入口根据子程序入口的寻址方式 子程序调用有4类 段内直接调用子程序的偏移地址直接由CALL指令给出 格式 CALLnear proc 近调用CALL执行时 它首先将IP内容压栈 然后把指令中给出的位移量加到IP上得到新IP 跳转到子程序入口地址 注意 汇编以后的调用地址是相对于CALL的下一条指令的位移量 例 CALL0120H 子程序偏移地址由指令给出 1 调用指令CALL 33 位移量由汇编程序在汇编时进行计算 如下例 CS 0102CALL0120H 3字节CS 0105 则位移量为 0120 0105H 001BH于是CALL0120H的机器码为E81B00CS 0102E8CS 01031BCALL0120HCS 010400CS 0105 34 子程序的偏移地址在寄存器或存储器中 格式 CALLmem16 reg16 近调用CALL执行时 它首先将IP内容压栈 然后把指定的寄存器 存储器的内容送入IP得到新IP 跳转 例 CALLBX 子程序地址由BX给出CALLWORDPTR SI 子程序地址在存储器中 段内间接调用 35 IPHIPL 代码段 数据段 CALLWORDPTR SI 指令的操作图示 假定 DS 8000H SI 1200H 81200H 81201H 36 子程序的段地址和偏移地址直接由CALL指令给出 格式 CALLfar proc far proc为远过程的地址 远调用指令的操作为 CS内容压栈 IP内容压栈 CS 段地址 IP 偏移地址例 CALL2000H 1000HCALLTIMER TIMER为远过程 段间直接调用 保护断点 跳转 37 子程序的段和偏移地址为存储器的连续4个单元中的内容 格式 CALLmem32 远调用指令的操作为 含保护断点和跳转两步 SP SP 2 SP 1 SP CS CS压栈CS mem32 2 SP SP 2 SP 1 SP IP IP压栈IP mem32 例 CALLDWORDPTR DI 调用地址在 DI DI 1 DI 2 DI 3四个存储单元中 低字内容为偏移地址 高字内容为段地址 段间间接调用 38 CALL 代码段 数据段 IPHIPL CSHCSL DI DI 1 DI 2 DI 3 段间间接调用示意图 CALLDWORDPTR DI 39 例 下面的程序执行后 AX DX CS 2000HMOVAX 2012H2003HMOVCX 200CH 无此指令 2006HPUSHCX2007HCALL4000H200AHADDAX BX200CHADDAX DX200EHHLT CS 4000HMOVBX 200AHPOPDXRET 40 段内返回指令RET的操作为 恢复子程序执行前IP的内容 相当于POPIP段间返回指令RET的操作为 恢复子程序执行前IP和CS的内容 相当于POPCS IP另有一种带立即数的返回指令 RETn 其中n为偶数 表示从栈顶弹出地址后另外丢弃的字节数 例 RET4 返回后再丢弃栈顶的4个字节 2 返回指令RET 41 中断的定义 CPU执行程序时 由于发生了某种随机的事件 外部或内部 引起CPU暂时中断正在运行的程序 转去执行一段特殊的服务程序 称为中断服务程序或中断处理程序 以处理该事件 该事件处理完后又返回被中断的程序继续执行 这一过程称为中断 中断源分类 外部中断 内部中断内部中断 软件中断 CPU内部执行程序 INTn或INTO 时自身产生的中断 外部中断 硬件中断 CPU以外的设备 部件产生的中断 用于处理外设与CPU间的通信 4 中断指令 42 中断指令用于产生软件中断 以执行一段特殊的中断处理过程 即中断服务子程序 中断指令的主要作用 1 调用操作系统 OS 提供的特殊子程序 系统功能调用 2 实现一些特殊功能 如调试程序时单步运行 断点等 3 调用基本I O系统 BIOS 提供的硬件低层服务 8086 8088CPU在程序中允许安排一条中断指令来引起一个中断过程 这种中断叫内部中断 或叫软中断 被中断的指令地址处称为 断点 有关中断的详细情况将在第六章讨论 中断指令共有三条 1 INTn执行类型n的中断服务程序 n 0 255 2 INTO执行溢出 OF 中断的中断服务程序 INT4 3 IRET从中断服务程序返回调用程序 43 中断INTn与过程CALL段间间接调用 中断是随机事件或异常事件引起 调用则是事先已在程序中安排好 响应中断请求不仅要保护断点地址 还要保护FLAGS内容 调用指令在指令中直接给出子程序入口地址 中断指令只给出中断向量码n 入口地址则在向量码n指向的内存单元中 CALL INT RET IRET 44 1 INTn 格式 INTn说明 n 4 中断向量地址 该向量地址中的内容即为中断服务程序入口地址 段 偏移 入口地址也称为 中断向量 0000 n 4 XXH XXH YYH YYH 中断服务程序入口的偏移地址 IP 中断服务程序入口的段地址 CS 中断类型码n 0 255 内存 中断向量 中断向量地址 45 INT指令的操作 将FLAGS压入堆栈 相当于PUSHFLAGS将INT指令下一条指令的地址压栈 即把CS和IP的内容压栈 相当于PUSHCS IP取中断服务程序入口地址送入CS 和IP 相当于JMPCS IP INT指令只影响IF和TF 对其余标志位无影响INT指令可用于调用系统服务程序 如INT21H 46 INT指令的操作例 INT21H 软中断 IPL IPH CSL CSH SP 1200 FLAGSL FLAGSH SP 11FA 执行INT21H指令后 保护断点 堆栈 执行INT21H指令前 1 先做 保护标志FLAGS和保护断点地址CS IP 47 2 再做 跳转到子程序 入口地址CS IP 执行INT21H指令后 CS IP 因为n 21H 所以n 4 84H 下图中 0 0084H 2000H 1123H所以 CS 2000HIP 1123H 0000 0084H 23H 11H 00H 20H IP CS 0000 21H 4 48 格式 INTOINTO检查溢出标志OF 如果OF 1 则启动一个类型4的中断过程 如果OF 0 不做任何操作 通常INTO指令安排在有符号数算术运算指令后面 如IMULDXINTO 若溢出 则启动INT4 否则往下执行MOVRESULT AXMOVRESULT 2 DX 2 溢出中断INTO 相当于 INT4 49 用于从中断服务程序返回被中断的程序 IRET负责恢复断点 CS和IP 和恢复标志寄存器FLAGS内容 任何中断服务程序不管是外部中断引起的 还是内部中断引起的 最后都要用IRET返回 IRET指令执行的操作为 栈顶内容弹出到IP 栈顶内容弹出到CS 栈顶内容弹出到FLAGS 3 中断返回指令IRET 50 表4 7处理器控制类指令 3 3 6处理器控制指令 51 续表 2 52 3 3 6处理器控制指令 1 标志操作指令用来设置标志位的状态 1 CF设置指令CLC0 CFSTC1 CFCMCCF变反 2 DF设置指令CLD0 DF 串操作的指针移动方向从低到高 STD1 DF 串操作的指针移动方向从高到低 3 IF设置指令CLI0 IF 禁止INTR中断 STI1 IF 开放INT

温馨提示

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

评论

0/150

提交评论