第九章 转移指令的原理

可以修改IP或同事修改CS和IP和指令统称为转移指令.概括地讲,转移指令就是可以控制CPU执行内存中某处代码的指令.

8086CPU的转移行为有以下几类:

  • 只修改IP时,称为段内转移,比如:jmp ax
  • 同时修改CS和IP时,称为段内转移,比如:jmp: 1000:0

由于转移指令对IP的修改范围不同,段内转移又分为:短转移和近转移

  • 短转移IP的修改范围为-128~127
  • 近转移IP的修改范围为-32768~32767

8086CPU的转移指令分为以下几类

  • 无条件转移指令
  • 条件转移指令
  • 循环指令
  • 过程
  • 中断

9.1 操作符offset

操作符offset在汇编语言中是由编译器处理的符号,他的功能是取得标号的偏移地址.比如下面的程序:

assume cs:codeseg
codeseg segmentstart: mov ax,offset st arts:mov ax,offset s
codesg ends
end start

9.2 jump指令

jmp为无条件转移指令,可以只修改IP,也可以同时修改CS和IP
jmp指令要给出两种信息:

  1. 转移的目的地址
  2. 转移的距离(段间转移,段内短转移,段内近转移)
    不同的给出的目的地址的方法,和不同的转移位置,对应有不同格式的jmp指令.

9.3 根据位移进行转移的jmp指令

jmp short 标号(转到标号处执行指令)
这种格式的jmp指令实现的是段内短转移,他对IP的修改范围为-128~127,也就说,它向前转移是可以最多越过128个字节,向后转移可以最多越过127个字节.jmp指令中的"short"符号,说明指令进行的是短转移.jmp指令中的"标号"是代码段中的标号,指明了指令要转移的目的地,转移指令结束后,CS:IP应该指向标号处的指令.

比如:
程序9.1

assume cs:codeseg
codeseg segment
start:  mov ax,0jmp short sadd ax,1
s:  inc axcodeseg ends
end start

CPU在执行jmp指令的时候并不需要转移目的地址.两个程序中的jmp指令的转移地址并不一样,一个是cs:0008,另一个是cs:000B,如果机器指令中包含了转移的目的地址的话,那么他们对应的机器码应该是不同的.可是他们对应的机器码都是EB03,这说明在机器指令中并不包含转移的目的地址.如果机器指令中不包含目的地址的话,那么也就是说,CPU不需要这个目的地址就可以实现对IP的修改.

CPU不是神仙,他只能处理你提供给他的东西,jmp指令的机器码中不包含转移的目的地址,那么,CPU如何知道将IP改为多少呢?所以,在jmp指令的机器码中,一定包含了某种信息,使得CPU可以将它当作修改IP的依据.

很简单,只需要知道两个指令所在段地址的差值即可!而EB03就是将IP平移3个字节的意思.

还有一种和"jmp short标号"功能相近的指令格式,jmp near ptr标号,它实现的是段内近转移.

"jmp near ptr标号"的功能为:(IP)=(IP)+16位位移

开发日记-20190915 关键词 汇编语言王爽版 第九章相关推荐

  1. 开发日记-20190915 关键词 汇编语言王爽版 第十一章

    第十一章 标志寄存器 CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理器,个数和结构都可能不同)具有以下三种作用. (1)用来存储相关的指令的某些执行结果 (2)用来为CPU执行相关的指令提供 ...

  2. 开发日记-20190915 关键词 汇编语言王爽版 第十章

    第十章 CALL和RET指令 call 和ret指令都是转移指令,他们都修改IP,或同时修改CS和IP.他们经常被共同用来实现子程序的设计. 10.1 ret和retf ret指令用栈中的数据,修改I ...

  3. 开发日记-20190915 关键词 汇编语言王爽版 第十三章

    第十二章 内中断 任何一个通用的CPU,比如8086,都具备一种能力,可以在执行完当前正在执行的指令之后,检测到从CPU外部传送过来或内部产生的一种特殊信息,并且可以立即对所接收的信息进行处理.这种特 ...

  4. 开发日记-20190915 关键词 汇编语言王爽版 第十二章

    第十二章 内中断 任何一个通用的CPU,比如8086,都具备一种能力,可以在执行完当前正在执行的指令之后,检测到从CPU外部传送过来或内部产生的一种特殊信息,并且可以立即对所接收的信息进行处理.这种特 ...

  5. 开发日记-20190913 关键词 汇编语言王爽版 第一章

    Preface 最近手机坏了,感觉心里挺不是滋味的,在各种方面,特别是钱!直到今天,我才知道钱真的是一种很重要的东西,以及苹果公司到底有多恶心. 真的很奇怪,为什么世界上就没有任何一家公司能和苹果公司 ...

  6. 开发日记-20190914 关键词 汇编语言王爽版 第二章

    第二章 寄存器 一个典型的CPU由运算器,控制器,寄存器(CPU工作原理)等器件构成,这些器件靠内部总线相连.前一章所说的总线,相对于CPU内部来说是外部总线.内部中心实现CPU内部各个器件之间的联系 ...

  7. 开发日记-20190914 关键词 汇编语言王爽版 第四章

    第四章 第一个程序 4.1 一个源程序从写出到执行的过程 第一步:编写汇编源程序 使用文本编辑器,用汇编语言编写汇编源程序 这一步工作的结果是产生一个储存源程序的文本文件. 第二步:对源程序进行编译程 ...

  8. 开发日记-20190914 关键词 汇编语言王爽版 第七章第八章

    第七章 更灵活的定位内存地址的方法 7.1 and和or指令 (1)and指令:逻辑与指令,按位进行与运算 (2)or指令:逻辑或指令,按位进行或运算 7.2 关于ASCII码 一个文本编辑过程中,就 ...

  9. 开发日记-20190914 关键词 汇编语言王爽版 第六章

    第六章 包含多个段的程序 前面的程序中,只有一个代码段.现在有一个问题是,如果程序需要用其他空间来存放数据,使用哪里呢?在第五章中,我们说0:200~0:2FF是相对安全的,可这段空间的容量只有256 ...

最新文章

  1. cordova入门——cordova环境配置
  2. Rectangle Area
  3. Windows程序闪退Windows日志捕获Kernelbase模块错误
  4. 【Pytorch神经网络理论篇】 23 对抗神经网络:概述流程 + WGAN模型 + WGAN-gp模型 + 条件GAN + WGAN-div + W散度
  5. python消息中间件activemq_消息中间件ActiveMQ和JMS基础
  6. 1438. 绝对差不超过限制的最长连续子数组
  7. 8、技术分析fastJson使用
  8. 《机器学习Python实践》第6章——数据理解
  9. access通过身份证号提取性别_从身份证号码中提取出生年月,性别等都不掌握,那就真的Out了...
  10. 手机电脑投屏软件_手机投屏电脑,电脑控制手机,推荐这款良心免费的软件
  11. 3.3 神策数据分析平台
  12. 医院his系统机房服务器,医院 HIS系统建设项目 硬件部署方案.docx
  13. 功能测试Ⅲ——缺陷及缺陷管理
  14. Java模拟Http请求封装工具类
  15. Redis 微博微信场景使用案例
  16. LTSPICE使用教程:入门指导
  17. Prometheus 告警配置以及抑制规则inhibit_rules 说明
  18. 半加器 全加器 Verilog描述
  19. 记录使用Elasticsearch报错:FORBIDDEN/12/index read-only / allow delete (api)];]; nested exception is Elasti
  20. 为什么点开桌面计算机那这么慢,电脑桌面刷新反应很慢怎么办?电脑桌面刷新很慢解决方法...

热门文章

  1. strings 命令——ELF文件格式与“链接和装载”
  2. gdb coredump
  3. nginx 常见参数以及重定向参数配置
  4. 电子班牌系统服务器,电子班牌管理系统
  5. aho-corasick php,GitHub - coralh/php-akm: Ahocorasick keyword match. Supports php7 and php5
  6. c# mysql 触发器 实时,C#-.Net SqlDataAdapter和SQL Server中的触发器
  7. linux注册硬盘中断,基于Linux底层硬盘中断辅助代码的分析与设计
  8. linux mysql5.7.11安装_centos 7 安装mysql 5.7.11
  9. 华为正式发布鸿蒙智慧屏,华为正式发布鸿蒙OS操作系统 智慧屏将率先使用
  10. 论述Linux文件系统,linux文件系统概述