(九)汇编语言——转义指令的原理

news2024/11/20 0:22:08

(九)汇编语言——转移指令的原理

文章目录

  • (九)汇编语言——转移指令的原理
    • 转移指令
      • 作用
      • 分类
        • 转移行为
        • 转移距离
        • 转移指令
    • 操作符offset
    • jmp指令
      • 功能
      • 原理
      • 段间转移
      • 段内转移
        • 短转移
          • 原理
        • 长转移
          • 原理
      • 位移越界
      • 转移地址
        • 寄存器
        • 内存
          • 段内转移
          • 段间转移
    • jcxz指令
      • 功能
    • loop指令
      • 功能
    • loop指令
      • 功能
    • 总结

接下来我们要介绍的是有关汇编语言里面的转移指令,其实对于转移指令我们已经接触过了,那就是之前用来改变CS地址的 jmp 指令,还有循环指令 loop ,其实都属于转移指令,但是之前我们并没有详细介绍原理,所以我们接下来就详细介绍一下他们的原理,并且介绍一些其他的转移指令,帮助我们的程序更加的优美与饱满,好啦,就让我们开始进入今天的学习内容吧!

转移指令

一般情况下指令是顺序地逐条执行的,而在实际中,经常需要改变程序的执行流程,所以这个时候,转移指令就显得十分重要了。

作用

转移指令,可以控制CPU执行内存中某处代码的指令;也可以修改IP,或同时修改CS和IP的指令。

分类

转移指令可以按照转移行为、转移距离和转移指令去分类,我们就来看看是如何进行分类的吧!

转移行为

按照转移行为去分类,大致可以分为:

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

转移距离

按照转移距离去分类,大概可以分为:

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

转移指令

按照转移指令去分类,大概可以分为:

  • 无条件转移指令(如:jmp)
  • 条件转移指令(如:jcxz)
  • 循环指令(如:loop)
  • 过程
  • 中断

操作符offset

这个操作符offset,主要的功能就是取得标号的偏移地址,我们举个例子。

assume cs:codeseg
codeseg segment
start: mov ax,offset start    ;相当于  mov ax,0
	s: mov ax,offset s        ;相当于  mov ax,3
codeseg ends
end start

jmp指令

jmp指令的话,我们之前简单介绍过,接下来,我们来详细的介绍一下这个指令。

功能

无条件转移,可以只修改IP,也可以同时修改CS和IP。但是呢,我们使用jmp指令的话,需要给出两种信息:第一就是转移的目的地址,其次就是转移的距离,具体分为以下三种:

  • 段间转移(远转移):jmp 2000:1000
  • 段内短转移:jmp short 标号;IP的修改范围为-128~127,8位的位移
  • 段内近转移:jmp near ptr 标号;IP的修改范围为-32768~32767,16位的位移

原理

为了我们讲解关于jmp指令的原理,我们举一个例子来讲解,这样应该比较好理解一点。

assume cs:codesg
codesg segment 
start:mov ax,0
	  jmp short s
	  add ax,1
    s:inc ax

    mov ax,4c00h
    int 21h
codesg ends
end start

我们将这段代码放到debug里面去看一下,具体的机器指令。

在这里插入图片描述

我们可以看到,jmp的后面跟着的确实是0008,也就是s处的地址,但是机器指令却是EB03,我们主要就是研究一下这个机器指令。

EB03,主要就是03,它代表着什么含义呢?其实这个03的含义是:下一条指令加上03,我们看下一条指令的地址刚好是0005,加上03,刚好就是0008,也就是下一条指令的地址。所以我们说,这个机器码,其实不是地址,而是位移。

我们再来仔细看一下这段代码的执行过程:

  1. (IP)=0003,CS:IP指向EB03(jmp的机器码)
  2. 读取指令码EB03进入指令缓冲器;
  3. (IP)=(IP)+所读取指令的长度=(IP)+2=0005,CS:IP指向add ax,0001;
  4. CPU执行指令缓冲器中的指令EB03;
  5. 指令EB05执行后,(IP)=(IP)+03=0008H,CS:IP指向inc ax

段间转移

远转移:jmp far ptr 标号,实现的是段间转移。far ptr指明了跳转到的目的地址,即包含了标号的段地址CS和偏移地址IP。也就是说,远转移指令的机器码是包含了CS和IP的。

段内转移

段内转移主要分为两种,一个是短转移,一个就是近转移,接下来我们来介绍一下。

短转移

短转移:“jmp short标号”;功能:(IP)=(IP)+8位位移

原理
  1. 8位位移=“标号”处的地址 - jmp指令后的第一个字节的地址(也就是位移);
  2. short指明此处的位移为8位位移;
  3. 8位位移的范围为-128~127,用补码表示;
  4. 8位位移由编译程序在编译时算出。

长转移

近转移:指令“jmp near ptr 标号”;功能:(IP)=(IP)+16位位移

原理
  1. 16位位移=“标号”处的地址 - jmp指令后的第一个字节的地址也就是位移);
  2. near ptr指明此处的位移为16位位移,进行的是段内近转移;
  3. 16位位移的范围为-32769~32767,用补码表示;
  4. 16位位移由编译程序在编译时算出。

位移越界

这个其实很好理解,比如8位的位移,但是位移距离却是16位的,就会出现这种情况,这种情况是会报错的,程序也无法运行,所以我们选用指令的 时候需要注意。

转移地址

上面的都是转移地址为标号的情况,接下来我们来介绍一下其他的几种情况。

寄存器

指令格式:jmp 16位寄存器,这个和标号是类似的,就不再详细介绍了。

内存

也是分为段内转移和段间转移,我们来一一介绍。

段内转移

jmp word ptr 内存单元地址,就是从内存单元地址处开始存放着一个字,是转移的目的偏移地址。

段间转移

jmp dword ptr 内存单元地址,就是从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。

jcxz指令

指令格式:jcxz标号,简而言之,就是如果cx寄存器为0,就跳转。所以我们说jcxz是有条件转移指令。

功能

如果(cx)=0,则转移到标号处执行,当(cx)≠0时,什么也不做(程序向下执行)

当(cx)=0时,(IP)=(IP)+8位位移)

  • 8位位移=“标号”处的地址 - jcxz指令后的第一个字节的地址;
  • 8位位移的范围为-128~127,用补码表示;
  • 8位位移由编译程序在编译时算出。

loop指令

这个之前介绍过了,就简单介绍一下。指令格式:loop 标号

功能

如果(cx)≠0,(IP)=(IP)+8位位移

  • 8位位移=“标号”处的地址-loop指令后的第一个字节的地址
  • 8位位移的范围为-128~127,用补码表示
  • 8位位移由编译程序在编译时算出

算出。

loop指令

这个之前介绍过了,就简单介绍一下。指令格式:loop 标号

功能

如果(cx)≠0,(IP)=(IP)+8位位移

  • 8位位移=“标号”处的地址-loop指令后的第一个字节的地址
  • 8位位移的范围为-128~127,用补码表示
  • 8位位移由编译程序在编译时算出

总结

加油,冲冲冲!!!!!!!!!

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

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

相关文章

【Linux基础】Linux中的时区和时间

基本概念 首先介绍Linux中会用到的时间概念: UTC:Universal Time Coordinated,协调世界时,又称世界统一时间,世界标准时间,国际协调时间。它是一个与时区相关的时间,目前将世界时区分为24个。…

【练习】Day04(未完成版)

努力经营当下,直至未来明朗! 文章目录一、选择二、编程1. 数组中的第K个最大元素2. 组合总数III答案1. 选择2. 编程普通小孩也要热爱生活! 一、选择 下面代码运行结果是( ) public class Test{public int add(int a…

传统图像特征描述及提取方法

图像特征描述 图像特征是一幅图像区别于另一幅图像的最基本特征,是其可以作为欸标志性的属性。 图像特征分为两大类: 自然特征:图像本身都具有内在的图像特征(如图像的大小、颜色、轮廓、边缘、纹理等) 人为特征:便于…

【Linux】基础 IO

文章目录一、文件相关基础知识二、文件操作1、语言层面的文件操作与操作系统层面的文件操作的关系2、C语言文件操作3、操作系统文件操作3.1 比特位传递选项3.2 文件相关系统调用3.3 文件操作接口的使用三、文件描述符1、什么是文件描述符2、文件描述符的分配规则四、重定向1、什…

Docker三剑客——Docker Compose

目录 一、概述 二、Docker Compose工作流程 三、安装Docker Compose 四、Docker Compose管理命令 (1)docker-compose build (2)docker-compose kill (3)docker-compose logs (4&#xff…

unity 实现千人同屏

作为开发人员,我们总是关注性能,包括CPU和GPU。随着场景变得越来越大越来越复杂,保持良好的性能变得越来越有挑战性,尤其是当我们添加越来越多的角色时。我和我在上海的同事在帮助客户时经常遇到这个问题,所以我们决定…

springcloud-gateway

网关zuul: https://github.com/Netflix/zuul/wiki Spring Cloud 网关gateway:Spring Cloud Gateway Spring Cloud Gateway Cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用的Zuul网关; 但在2.x版本中,zuul的升级—…

【韩顺平Linux】学习笔记4

【韩顺平Linux】学习笔记4一、Linux组的介绍1.1文件/目录所有者1.2 组的创建1.3 其它组1.4 权限的基本介绍1.5 权限说明案例1.6 修改权限-chmod1.7 修改文件/目录所有者-chown/-chgrp二、crond任务调度三、at定时任务一、Linux组的介绍 在Linux中,每个用户都属于一个…

AtCoder Beginner Contest 284.(A--E)

AtCoder Beginner Contest 284A - Sequence of Strings1、问题2、代码B - Multi Test Cases1、问题2、代码C - Count Connected Components1、问题:2、思路:——并查集、DFS3、代码方法1:并查集方法2:DFSD - Happy New Year 20231…

Linux内核学习笔记——内核页表隔离KPTI机制(源码分析)

KPTI(Kernel PageTable Isolation)全称内核页表隔离,它通过完全分离用户空间与内核空间页表来解决页表泄露。 KPTI中每个进程有两套页表——内核态页表与用户态页表(两个地址空间)。 内核态页表只能在内核态下访问,可以创建到内核和用户的映射&#xf…

单体的 TienChin 和微服务的 TienChin 有何异同?

有不少小伙伴希望松哥能整一个微服务的实战项目,微服务这块技术点其实松哥是讲过很多了,图文版的教程视频版的教程都有,不过确实缺乏一个项目,所以我在想等 TienChin 项目搞完之后,和小伙伴们也来一起搞一个微服务的项…

nacos2.0客户端注册流程分析

版本介绍 copy几个jar包出来康康把 spring-cloud-starter-alibaba-nacos-config-2021.0.4.0.jar spring-cloud-starter-alibaba-nacos-discovery-2021.0.4.0.jar nacos-client-2.0.4.jar 注册流程 读取Spring Boot装载配置文件 spring.factories,找到启动类 Nac…

一步一步学爬虫(4)数据存储之Elasticsearch搜索引擎存储

Elasticsearch搜索引擎存储1. Elasticsearch 介绍2. Elasticsearch 相关概念3. 准备工作3.1 下载程序3.2 解压缩,配置文件修改4. 创建索引5. 删除索引6. 插入数据7. 更新数据8. 删除数据9. 查询数据10. 总结想查数据,就免不了搜索,而搜索离不…

【微信小程序】全局数据共享

小程序中的全局数据共享方案在小程序中可以使用mobx-miniprogram配合mobx-miniprogram-bindings实现全局数据共享。● mobx-miniprogram用来创建Store实例对象● mobx-miniprogram-bindings用来把Store中的共享数据或方法,绑定到组件或页面中使用npm install --save…

Python虚拟环境

学习视频:安装不算完事,只有理解了虚拟环境才算真正掌握 Python 环境 同类笔记:Python虚拟环境 目录 一、什么是虚拟环境 二、虚拟环境相关工具的使用和原理 创建虚拟环境 虚拟环境目录分析 虚拟环境的激活 虚拟环境做了什么 退出虚…

【论文精读】360MVSNet

今天读的是发表在WACV2023上的MVS文章,该文章提出了基于全景相机的MVS pipeline。 文章链接:点击前往 代码链接:暂未开源。 文章目录Abstract1. Introduction2. Related works3. Method3.1 Feature Extraction3.2 360 Spherical Sweeping3.2.…

【经典笔试题2】

test1 test2 test3 test4 test5 test1 int main() {int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);printf( "%d,%d", *(a 1), *(ptr - 1));return 0; } 程序的结果是什么?首先分析代码,a是数组名,是数组首元素…

详解Web服务器与http https协议工作过程

Web服务器 URL URI URL是URI的一个子集 www www所用的协议 http请求报文分析 状态码(空行:最后一 个响应头部之后是一个空行,发送回车符和换行符,通知服务器以下不再有响应头部。) 网址解析 网址注释实例 HTT…

从工厂方法到注解的小例子

目录一、背景介绍二、思路&方案三、过程过程图一过程图二过程图三过程图四(运行时的图)代码四、总结五、升华一、背景介绍 上篇"自定义注解和注解解析器",通过小例子介绍了自定义注解的运用;本篇继续基于小例子来实现工厂方法,以及注解实…

linux Regmap API

1.针对 I2C 和 SPI 设备寄存器的操作都是通过相关的 API 函数进行操作的。这样 Linux 内核中就会充斥着大量的重复、冗余代码,但是这些本质上都是对寄存器的操作,所以为了方便内核开发人员统一访问I2C/SPI 设备的时候,为此引入了 Regmap 子系…