转移指令jmp和跳转指令call

【-1】写在前面

以下内容文字描述来自于 王爽老师的《汇编语言》教材,建议大家都买一本,哈哈。不是我打广告,确实人家写的好,应该支持。我只是附上了自己的图片和理解而已。

【0】先上干货

只修改ip,称为段内转移,如jmp ax
修改cs和ip,称为段间转移,如 jmp 1000:0

【1】分类

转移指令分为:
无条件转移,如jmp
条件转移
循环指令, loop
过程
中断

【2】我们的jmp

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

对ip的修改范围在-128~127;

[attention] : cpu在执行jmp指令时,并不需要转移的目的地址, 而是包含转移的位移;
这里写图片描述

2.2) jmp near ptr 标号

它实现的是段内近转移, 只不过对ip的修改范围在 -32768~32767;
这里写图片描述

2.3)jmp far ptr 标号

它实现的是段间转移,又称远转移; far ptr 指明了指令用标号的段地址和偏移地址修改cs和ip;
这里写图片描述

2.4)转移地址在内存中

  • 2.4.1)jmp word ptr 内存单元地址(段内转移)
    function:从内存单元地址处开始存放一个字,是转移的目的偏移地址;
    如,

    mov ax,0123h
    mov [bx], ax
    jmp word ptr [bx]
    执行后, (ip) = 0123h
    

    这里写图片描述

  • 2.4.2)jmp dword ptr 内存单元地址(段间转移)
    功能:内存中存放两个字,高地址处的字存放转移的目的段地址;低地址处存放目的偏移地址;
    (cs) = 内存单元地址 + 2
    (ip) = 内存单元地址
    如:

    mov ax,0123h
    mov ds:[0], ax
    mov word ptr ds:[2],0
    jmp dword ptr ds:[0]
    执行后, (cs) = 0; (ip) = 0123h 。
    

    这里写图片描述
    [Complementary]
    MOV AX, WORD PTR [BX] ; 要有逗号
    将DS:BX指向的内存地址中的16位数读到AX里面。
    MOV是数值传送指令,AX是目的操作数,WORD PTR表示后面的储存单元是字类型,[BX]表示用BX的值来寻址,默认段地址是DS的值。

【3】我们的call

3.0)谈谈ret和retf

  • 3.0.1)执行ret 相当于执行:

    (ip) = (ss) * 16+ (sp);
    (sp) = (sp) + 2;
    
  • 3.0.2)执行retf, 相当于执行:

    (ip) = (ss) * 16+ (sp) ;
    (sp) = (sp) + 2 ;
    cs = ss * 16 + sp ;
    sp = sp + 2 ;
    
  • 3.0.3)执行ret,相当于执行 pop IP

    这里写图片描述

  • 3.0.4)执行retf,相当于执行 pop IP; pop CS
    这里写图片描述
    (所以retf 返回的时候要先将cs压栈)

3.1)依据位移进行转移的call 指令

相当于——将当前的IP或CS和IP压入栈,然后转移;
call指令除了不能实现短转移之外,其他和jmp相同;

  • 3.1.1)cpu执行call时,相当于进行:

    push ip
    jmp near ptr 标号
    
  • 3.1.2)also, 相当于:

    sp = sp - 2
    ss *16 +sp = ip
    ip = ip + 16位位移
    

    这里写图片描述
    这里写图片描述

3.2)转移的目的地址在指令中的call指令

call far ptr 标号实现的是段间转移;
  • 3.2.1)cpu 执行call far ptr 标号时,相当于进行

    push cs
    push ip
    jmp far ptr 标号
    
  • 3.2.2)also 相当于

    sp = sp - 2
    ss * 16 + sp = cs
    sp = sp - 2
    ss * 16 + sp = ip
    cs = 段基地址
    ip = 偏移地址
    

    这里写图片描述

3.3)转移地址在register中的call指令

指令格式:call 16为reg
功能:

sp = sp -2
ss * 16 + sp = ip
ip = 16位regalso 相当于
push ip
jmp 16位reg

这里写图片描述

3.4)转移地址在内存中的call指令

  • 3.4.1)call word ptr 内存单元地址
    相当于

    push ip
    jmp word ptr 内存单元地址
    
  • 3.4.2)call dword ptr 内存单元地址
    相当于:

    push cs
    push ip
    jmp dword ptr 内存单元地址
    

    这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332216.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jmeter负载测试测试_使用Apache JMeter负载测试Web应用程序

jmeter负载测试测试Apache JMeter是用于模拟Web应用程序上的用户负载以测试性能的出色工具。 您可以通过指定用户数量和请求间隔来轻松地构建测试计划,然后JMeter将为每个用户生成一个线程并访问您的Web应用程序。 在测试结束时,您将获得一份性能摘要报告…

Windows下安装Nutch

Nutch安装 一、需求部份 a) Nutch是Java开发的所以需要下载Java JDK 下载地址http://java.sun.com/javase/downloads/index.jsp b) Nutch的演示搜索页面是Jsp的需要Tomcat做服务器 下载地址:http://jakarta.apache.org/tomcat/ c) Nutch的脚本都是用Linux的Shell写的…

python子进程关闭fd_gpg –passphrase-fd无法使用python 3子进程

以下脚本encrypt_me.py(modified from another post)使用gpg加密自身并以装甲形式打印出密文.但它只适用于python2.7但不适用于python3?你知道它在python3上运行时有什么问题吗?import subprocessimport shleximport osimport sysin_fd, out_fd os.pipe…

程序编码(机器级代码+汇编代码+C代码+反汇编)

【-1】相关声明 本文总结于csapp; 了解详情,或有兴趣,建议看原版书籍;【0】程序编码 GCC调用了一系列程序,将源代码转化成可执行代码的流程如下: (1)C预处理器扩展源代码&#xf…

angular1.2.27_Angular 8 + Spring Boot 2.2:立即构建一个CRUD应用程序!

angular1.2.27“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。 如果您已经成为Java开发人员超过15年,那么您可能还记得何时…

ssm中怎么用location.href跳到controller层_聊聊自动驾驶中的功能开发

在知乎上看过不少大牛写的自动驾驶技术介绍文章,大多谈到的是AI, Deep Learning, Computer Vision等等感知(Perception)层面的。但在各个传感器(雷达、摄像头、激光雷达等)探测到目标信息及周围环境后,车辆该如何做出反应?自动驾驶的大脑该怎…

MyEclipse详细使用教程

第一部分MyEclipse的基本使用 一.提示:MyEclipse的透视图按钮:可以切换不同的透视图(位于右上角) 1.建立一个工程 ----File—new—project—选项含有Javaproject,webproject等等—输入工程名字如myproject&…

控制语句(if-else+循环+switch)汇编规则

【1】说说条件码 最常用的的条件码有: CF:进位标志 (无符号溢出)ZF:零标志SF:符号标志(结果为负数)OF:溢出标志 (补码溢出, 有符号溢出&#xf…

zxing qr区域判断_如何在Java中使用Zxing和JFreeSVG创建QR Code SVG?

zxing qr区域判断在本文中,我们将研究如何使用Zxing QR代码生成库和JFreeSVG库在Java中创建QR Code SVG图像。 QR码生成 下面的代码使用Zxing库创建一个表示QR Code的java.awt.image.BufferedImage对象: public static BufferedImage getQRCode(String …

审批流_怎样让审批工作流和应用数据分离?

在企业行政管理中,审批是最常遇到的场景。传统管理中,人们会有纸张审批,而现在市场上已有大量的线上审批软件,他们帮助企业完成审批电子化,审批速度更快,信息也能留档。然而大部分审批软件都不够灵活&#…

java 反射api_反射是最重要的Java API

java 反射api前几天我在想-这是最重要的Java API。 哪种SE和EE API可以使大多数Java生态系统成为可能,而哪些API不能重新创建为第三方库。 正如您可能已经猜到标题一样,我认为它是Reflection API 。 是的,它不可避免地是每个项目的直接或间接…

前端校验表单项内容是否合规的JS脚本代码

用途:校验ip地址的格式 输入:strIP:ip地址 返回:如果通过验证返回true,否则返回false; */ function isIP(strIP) { if (isNull(strIP)) return false; var re/^(\d).(\d).(\d).(\d)$/g //匹配IP地址的正则表达式 if(r…

过程(栈帧结构是干货)

【0】写在前面 过程(栈帧结构是干货);本文总结于csapp, 加上自己的理解;【1】栈帧结构 每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。 过程调用&#xf…

山东小学信息技术课本 python 五年级_山东教育出版社小学信息技术五年级上册教案 全册.doc...

山东教育出版社小学信息技术五年级上册教案 全册电子备课教学案学年度 第一学期学科 信息技术年级 五年级姓名教师个人备课情况统计一览表 项目?精备课二次备课课堂检测课后反思交流平台 篇数月份第( )月第( )月第( )月第( )月备注:为便于自查,此表由教…

apache ranger_Apache Ranger插件的美丽简洁

apache ranger如果您在这里,您已经知道什么是Apache Ranger 。 这是在Hadoop框架中管理安全性的最流行(即使不是唯一)的方法。 它与Active Directory,Kerberos和其他各种身份验证集成在一起,但是我认为最有趣的功能是其…

可重定位目标文件

【0】GCC将源代码转化成可执行代码的流程 (1)C预处理器cpp扩展源代码,插入所有用#include命令指定的文件,并扩展声明的宏;(2)编译器ccl产生两个源代码的汇编代码:*.s;&a…

经典颜色的RGB值

红 RED    品红Magenta(热情)    CMYK:C15 M100 Y20 K0   RGB: R207 G0 B112    洋红Carmine(大胆)   CMYK: C100 M0 Y60 K10   RGB: R215 G0 B64    宝石红Ruby(富贵)   CMYK…

python中for x in range_python教程:对 [lambda x: x*i for i in range(4)] 理解

题目:lst [lambda x: x*i for i in range(4)]res [m(2) for m in lst]print res实际输出:[6, 6, 6, 6]想要输出 [0, 2, 4, 6] 应该怎么改?如下:lst [lambda x, ii: x*i for i in range(4)]res [m(2) for m in lst]print res这…

adf.test_在ADF 12.2.1.3中使用基于JSON的REST Web服务

adf.test以前,我曾发布过有关在ADF中使用基于ADF BC的REST Web服务的信息。 现在,本文讨论使用通用数据控件使用基于JSON的REST Web服务。 您还可以查看有关Web服务的先前文章,以获取更多信息。 在ADF 12.2.1中使用应用程序模块快速创建SOA…

JSON字符串封装成Bean对象/JSON串反序列化成实体类对象/JSON字符串转换成Java对象

文章目录使用阿里巴巴的 JSON使用 ObjectMapperJSON字段与实体类属性不一致首先,我们建立一个实体类,这里简单定义了 name、sex、age 三个属性,以及 get、set、tostring方法。public class Student {private String name;private String sex;…