转移指令的原理

news2024/11/26 16:40:11

文章目录

  • 转移指令的原理
    • 1. 操作符offset
    • 2. jmp指令
    • 3. 依据位移进行转移的jmp指令
    • 4. 转移的目的地址在指令中的jmp指令
    • 5. 转移地址在寄存器中的jmp指令
    • 6. 转移地址在内存中的jmp指令
    • 7. jcxz指令
    • 8. loop指令
    • 9. 根据位移进行转移的意义
    • 10. 编译器对转移位移超界的检测

转移指令的原理

1. 操作符offset

操作符offset在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址。

比如下面的程序:

assume cs:codesg

codeseg segment

    start:	mov ax,offset start ; 相当于 mov ax,0
    s:		mov ax,offset s   ; 相当于mov ax,3

codesg ends

end start

2. jmp指令

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

jmp指令要给出两种信息:

  • 转移的目的地址
  • 转移的距离(段间转移、段内短转移,段内近转移)

3. 依据位移进行转移的jmp指令

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

这种格式的 jmp 指令实现的是段内短转移,它对IP的修改范围为 -128~127,也就是说,它向前转移时可以最多越过128个字节,向后转移可以最多越过127个字节。

assume cs:codesg

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

end start

以上程序执行后, ax中的值为 1 ,因为执行 jmp short s 后 ,越过了add ax,1 ,IP 指向了标号 s处的 inc ax。也就是说,程序只进行了一次ax加1操作。

请添加图片描述

jmp short s指令的读取和执行过程:

1)(CS)=0BBDH,(IP)=0006,CS:IP指向EB 03(jmp short s的机器码);

2)读取指令码EB 03进入指令缓冲器;

3)(IP)=(IP)+所读取指令的长度=(IP)+2=0008,CS:IP指向add ax,1;

4)CPU指行指令缓冲器中的指令EB 03;

5)指令EB 03执行后,(IP)=000BH,CS:IP指向inc ax。

实际上,指令“jmp short 标号”的功能为(IP)=(IP)+8位位移。

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

2)short指明此处的位移为8位位移;

3)8位位移的范围为-128~127,用补码表示;

4)8位位移由编译程序在编译时算出。

还有一种和指令“jmp short 标号”功能相近的指令格式:jmp near ptr 标号,它实现的时段内近转移。

指令“jmp near ptr 标号”的功能为:(IP)=(IP)+16位位移。

指令“jmp near ptr 标号”的说明:

1)16位位移=“标号”处的地址-jmp指令后的第一个字节的地址;

2)near ptr指明此处的位移为16位位移,进行的是段内近转移;

3)16位位移的范围为 -32769~32767,用补码表示;

4)16位位移由编译程序在编译时算出。

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

指令 “jmp far ptr 标号” 实现的是段间转移,又称为远转移。

指令 “jmp far ptr 标号” 功能如下:

(CS)=标号所在段的段地址;

(IP)=标号所在段中的偏移地址。

far ptr指明了指令用标号的段地址和偏移地址修改CS和IP。

assume cs:codesg

codesg segment
    start:	mov ax,0
            mov bx,0
            jmp far ptr  s
            db 256 dup (0)
    s: 		add ax,1
    		inc ax
codesg ends

end start

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

指令格式:jmp 16位寄存器

功能:IP =(16位寄存器)

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

转移地址在内存中的jmp指令有两种格式:

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

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

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

示例:

mov ax,0123H
mov ds:[0],ax
jmp word ptr ds:[0]

执行后,(IP)=0123H

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 CS:IP 指向 0000:0123。

7. jcxz指令

jcxz指令为有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围都为-128~127。

指令格式:jcxz 标号 (如果(cx)=0,则转移到标号处执行。)

jcxz 标号 指令操作:

  • 当(cx)=0时,(IP)=(IP)+8位位移,8位位移=“标号”处的地址-jcxz指令后的第一个字节的地址;
  • 当(cx)=0时,什么也不做(程序向下执行)。

示例:

assume cs:codesg

codesg segment
    start:	mov cx, 0
            jcxz zero
            mov ax, 1
            jmp exit
    zero:   mov ax, 0
    exit:   nop
codesg ends

end start

8. loop指令

loop指令为循环指令,所有的循环指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。

对IP的修改范围都为-128~127。

指令格式:loop 标号

loop 标号 指令操作:

1)(cx)=(cx)-1;

2)如果(cx)≠0,(IP)=(IP)+8位位移。当(cx)=0,什么也不做(程序向下执行)。

9. 根据位移进行转移的意义

jmp short 标号,jmp near ptr 标号,jcxz 标号,loop 标号等几种汇编指令,它们对 IP的修改是根据转移目的地址和转移起始地址之间的位移来进行的。在它们对应的机器码中不包含转移的目的地址,而包含的是到目的地址的位移距离。

例如:

请添加图片描述

这段程序装在内存中的不同位置都可正确执行,因为 loop s 在执行时只涉及到 s的位移( - 4,前移 4个字节,补码表示为FCH),而不是s的地址。

如果loop s的机器码中包含的是s的地址,则就对程序段在内存中的偏移地址有了严格的限制;

因为机器码中包含的是 s 的地址,如果 s 处的指令不在目的地址处,程序的执行就会出错。

而loop s的机器码中包含的是转移的位移,就不存在这个问题了,因为,无论 s处的指令的实际地址是多少,loop指令的转移位移是不变的。

10. 编译器对转移位移超界的检测

根据位移进行转移的指令,它们的转移范围受到转移位移的限制,如果在源程序中出现了转移范围超界的问题,在编译的时候,编译器将报错。

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

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

相关文章

六种典型的商业间谍软件实例分析

近年来,随着数字化经济的快速发展,这也推动了商业间谍软件数量的急剧增长。目前,商业间谍软件的主要类型包括以下六种。 商业间谍软件是一种软件应用程序/脚本,也被称为“跟踪软件”、“监视软件”,主要功能包括非法数…

Kerberos 认证 javax.security.auth.logon.LoginException:拒绝链接 (Connection refused)

kerberos 服务重启之后异常 项目中用到了hive 和hdfs ,权限认证使用了Kerberos,因为机房异常,导致了Kerberos 服务重启,结果发现本来运行正常的应用服务hive 和hdfs 认证失败,报错信息是 典型的网络连接异常 排查思路…

【C语言终章】预处理详解(下)

【C语言终章】预处理详解(下) 当你看到了这里时,首先要恭喜你!因为这里就是C语言的最后一站了,你的编程大能旅途也将从此站开始,为坚持不懈的你鼓个掌吧! 🥕个人主页:开敲…

2023年蓝桥杯省赛——蜗牛

目录 题目链接:1.蜗牛 - 蓝桥云课 (lanqiao.cn) 思路 暴力贪心 代码实不了现 动态规划 代码实现 难点解释 总结 题目链接:1.蜗牛 - 蓝桥云课 (lanqiao.cn) 思路 暴力贪心 蓝桥杯反正是能暴力出来一个用例是一个,我真的被折磨了好久&…

10.python的字典dict(上)

10.python的字典dict(上) 什么是字典 在计算机科学中,字典是一种数据结构,用于存储键值对(key-value pair)的集合。每个键值对都由一个唯一的键和一个对应的值组成。字典能够快速地根据键找到对应的值,因此在很多编程…

探索----------------阿里云

目录 一、阿里云四大件 1、云服务器ECS 2、云数据库RDS 3、负载均衡SLB 4、对象存储OSS 5、其他的云计算产品 1)内容分发网络CDN 2)专有网络 VPC 二、linux发行版本 三、你平时对系统会怎么优化(五大负载) 1、cpu 使用率…

有什么好用的网页在线客服系统?选择指南与实用推荐

有什么好用的网页在线客服系统? 企业与客户之间的互动变得越来越重要。为了提高客户满意度和提升企业形象,许多企业开始使用网页在线客服系统。网页在线客服系统是一种实时的、便捷的沟通工具,可以帮助企业与客户建立更紧密的联系。 一、网…

黑马点评项目笔记 II

基于Stream的消息队列 stream是一种数据类型,可以实现一个功能非常完善的消息队列 key:队列名称 nomkstream:如果队列不存在是否自动创建,默认创建 maxlen/minid:设置消息队列的最大消息数量 *|ID 唯一id:…

C++刷题篇——07检测热点字符

一、题目 二、解题思路 1、使用map&#xff0c;key为元素&#xff0c;value为出现的次数 2、由于sort不适用于map&#xff0c;因此要将map的key、value放到vector中&#xff0c;再对vector排序 3、对map排序&#xff1a;方法1&#xff1a;使用二维数组vector<vector<>…

蓝桥杯习题

https://www.lanqiao.cn/problems/1265/learning/ 第一题---排序 给定一个长度为N的数组A&#xff0c;请你先从小到大输出它的每个元素&#xff0c;再从大到小输出他的每个元素。 输入描述&#xff1a; 第一行包含一个整数N 第二行包含N个整数a1,a2,a3,...an&#xff0c;表…

解决多模块项目报错,找不到程序包

本周&#xff0c;我遇到了一个常见的错误——“找不到程序包”。这个错误是由于模块间的依赖关系没有正确配置导致的。经过一系列的尝试和排查&#xff0c;我最终找到了解决问题的方法。下面&#xff0c;我将详细记录这次问题的处理过程&#xff0c;并总结其中的经验教训。 问…

C/C++ 之 GSL 数学运算库使用笔记

Part.I Introduction 本文主要记录一下笔者使用 GSL 过程当中所做的一些笔记。 Chap.I 传送门 一些传送门 GSL源码&#xff08;CMakeList 版本-Windows&#xff09;GSL源码&#xff08;configure 版本-Linux&#xff09;GSL 在线文档GSL 文档下载 Chap.II GSL 简介 GSL 全…

使用通用内部函数对代码进行矢量化

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV 如何使用 XML 和 YAML 文件的文件输入和输出 下一篇&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; ​ 目标 本教程的目标是提供使用通用内…

网络基础(二)——序列化与反序列化

目录 1、应用层 2、再谈“协议” 3、网络版计算器 Socket.hpp TcpServer.hpp ServerCal.hpp ServerCal.cc Protocol.hpp ClientCal.cc Log.hpp Makefile 1、应用层 我们程序员写的一个个解决我们实际问题&#xff0c;满足我们日常需求的网络程序&#xff0c;都是在…

书生·浦语2.0(InternLM2)大模型实战--Day01 趣味 Demo | 部署InternLM2-Chat-1.8B模型

课程介绍 了解完书生浦语InternLM2大模型实战–基本认知 后&#xff0c;就可以做 Homework-demo 啦 Day01的作业基本是按照GitHub链接完成 GitHub – 轻松玩转书生浦语大模型趣味 Demo 作业截图如下 基本作业是实战第一部分 进阶作业的后两个是实战的的第三、四部分 我把进阶…

【STM32 HAL库SPI/QSPI协议学习,基于外部Flash读取】

1、SPI协议 简介 SPI 协议是由摩托罗拉公司提出的通讯协议 (Serial Peripheral Interface)&#xff0c;即串行外围设备接口&#xff0c;是一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间&#xff0c;要求通讯速率较高的场合。 通信方式&#xff1a;同…

编程语言|C语言——C语言操作符的详细解释

这篇文章主要详细介绍了C语言的操作符&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值&#xff0c;需要的朋友们下面随着小编来一起学习学习吧 一、基础 1.1 算数操作符 - * / % - * / 这些操作符是我们…

Head First Design Patterns -代理模式

什么是代理模式 代理模式为另一个对象提供替身或者占位符&#xff0c;以便控制客户对对象的访问&#xff0c;管理访问的方式有很多种。例如远程代理、虚拟代理、保护代理等。 远程代理&#xff1a;管理客户和远程对象之间的交互。 虚拟代理&#xff1a;控制访问实例化开销大的对…

Unity类银河恶魔城学习记录11-10 p112 Items drop源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili ItemObject_Trigger.cs using System.Collections; using System.Collecti…

金融衍生品市场

金融衍生品市场 衍生金融品的作用衍生金融工具远期合约期货合约期权 衍生金融品的作用 套期保值&#xff08;Hedging&#xff09; 组合多头头寸(long position)与空头头寸(short position)例&#xff1a;股票与股指期货 投机 衍生金融工具 远期合约 定义&#xff1a;在将来…