如何将二进制机器码转换成汇编指令_汇编笔记(四)长文警告

本文深入探讨8086CPU的转移指令,包括无条件转移、条件转移、循环和过程。通过实例解析不同类型的转移指令,如 jmp、loop、call 和 ret,讲解其工作原理、位移计算和内存地址处理。同时,文章介绍了编译器对转移位移超界的检测,以及如何解决寄存器冲突问题,展示了汇编语言在程序设计中的模块化思想和参数传递策略。
摘要由CSDN通过智能技术生成

a8c1b5326677be17f46878c23467b2be.png

转移指令的原理

可以修改IP,或同时修改CS和IP的指令通称为转移指令。

8086CPU的转义行为有一下几类。

  • 只修改IP时,称为段内转移,比如:jmp ax

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

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

  • 短转移IP的修改范围为-128~127。

  • 近转移的IP的修改范围为-32768~32767。

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

  • 无条件转移指令(如:jmp)

  • 条件转移指令

  • 循环指令(如:loop)

  • 过程

  • 中断

这些转移指令的区别在于前提条件不同,但转移的原理是相同的。

我们在这里通过深入学习无条件转移指令jmp来理解CPU执行转移指令的基本原理

操作符offset

offset的功能是取的标号的偏移地址,该指令由编译器执行。

9de2ab30982421a972874f7f0a411008.png

jmp指令

jmp为无条件转移指令,可以只修改IP,也可以同时修改CS和IP。

jmp指令需要给出两种信息:

  • 转移的目的地址

  • 转移的距离(段间转移、段内段转移、段内近转移)

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

jmp short 标号(转到标号处执行指令)

我们从一段汇编程序开始。

7031e1b29e5e4b433856f3dadf42ffb3.png

观察这段汇编指令对应的机器码,汇编指令中的[idata]立即数,不论是否是数据还是内存单元的偏移地址,都会在对应的机器指令中出现,CPU执行的机器指令,它必须要处理这些数据和地址。

注意jmp指令一行,机器指令中不包含转移的目的地址。

多次测试可以发现,CPU执行jmp指令的时候不需要转移的目的地址。

回忆CPU执行指令的过程。

  • 从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;

  • (IP)=(IP)+所读取指令的长度,指向下一条指令

  • 执行指令,跳到第一步,重复这个过程

jmp指令对应的机器码EB03中的’03‘其实是转移的位移。

jmp short 标号的功能为:(IP)=(IP)+8位移。

  • 8位位移=标号处的地址-jmp指令后第一个字节的地址;

  • short 指明此处的位移长度

  • 8位移范围为-128~127,用补码表示(计算机中没有加法,正数二进制取反加一得到负数的二进制)

  • 8位位移在编译算出

类似的指令jmp near ptr 标号,实现的是段内近转移,不过它的位移范围是-32768~32767。

这里简单介绍下这个位移范围如何得到,这和补码的含义有关,正数的补码就是其本省,负数的补码是在原码的基础上,符号位(第一位)不变,其余各位取反,最后+1,8位位移的范围只能11111111~01111111(-128~127),16位位移也类似。

转移的目的地址在指令中的jmp指令

eb5af041be128a093ba64d7b68774978.png

前面说的jmp far ptr 标号指令,对应的机器码为”EA 0801 6C07”,这里我特意空格分隔开,方便观察。

“EA 0801 6C07”是在指令中的内存中的排列顺序,高地址“6C07”是转移的段地址:076C,低地址的“0801”是偏移地址”0108”

转移地址在寄存器中的jmp指令

指令格式:jmp 16位 reg,功能(IP)=(16位reg),这里不在详述。

转移地址在内存中的jmp指令

  • jmp word ptr 内存单元地址(段内转移)

功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。

内存单元地址可用寻址方式的任一格式给出。

  • jmp dword ptr 内存单元地址(段间转移)

功能:从内存中单元地址处存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。

jcxz指令

jcxz指令为有条件转移指令࿰

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python图像处理是一项非常有趣的技能,这项技能可以使您能够更好地理解计算机视觉、数字信号处理、深度学习和其他各种应用程序。学习Python图像处理的第一步是掌握基本的Python语言和编程知识,例如变量、循环、条件语句和函数等。 学习Python图像处理工具包也是非常重要的,这些工具包包括 Pillow、OpenCV、SciPy、scikit-image等。这些工具包提供了一系列函数和方法,使您可以方便地操作图像、从图像中提取特征和执行模式识别。Pillow是Python Imaging Library的升级版,支持在Python 3.x版本的平台上使用。OpenCV是一个强大的计算机视觉库,提供各种算法和函数来处理图像和视频文件。SciPy提供了广泛的科学计算功能,包括图像处理。Scikit-image是一个基于Python的用于图像处理和计算机视觉的库。 Python图像处理的学习过程需要不断地进行实践,应该尝试不同的图像处理技术、算法和工具包来理解每个技术的优势和劣势。还应该尽量积累有关图像处理的知识(例如神经网络、模式识别和计算机视觉的数学原理)。可以使用在线编程环境或者自己安装Python和相关工具包来进行实践。实践的过程中,一定要保持耐心、自信和专注,因为Python图像处理涉及到很多细节和不同的实现方式。 另外,可以通过阅读相关的书籍、参加培训班和参与Python图像处理社区等方式,来了解更多Python图像处理的知识和技术。阅读书籍可以从入门到进阶的学习,培训班可以有专业人士教授,Python图像处理社区可以互相交流学习。 学习Python图像处理需要不断地实践和努力,但是通过掌握基本的Python语言和编程知识、了解Python图像处理工具包和积累相关的知识,您一定可以成为Python图像处理的专家。加油!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值