汇编转移指令的原理

计算机组成原理第四章--指令系统第二部分:基本的汇编语言和函数调用 本文详细地介绍了一些常用的基本汇编代码,以及其背后的硬件知识,包括函数调用栈的运行原理等,通过本文的学习可以对C++函数的调用理解达到一个新的境界。 阅读详情

1.操作符offset

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

比如下面程序:

assume cs:codesg

codesg segment

start:mov ax,offset start 相当于mov ax,0

    s:mov ax,offset s 相当于mov ax,3

codesg ends

end start

在上面的程序中,offset操作符取得了标号start和s的偏移地址0和3,所以指令mov ax,offset start相当于指令mov ax,0,因为start是代码段中的标号,它所标记的指令是代码段中的第一条指令,偏移地址为0。

mov ax,offset s相当于指令mov ax,3,因为s是代码段中的标号,它所标记的指令是代码段中的第二条指令,第一条指令长度是3,则s的偏移地址为3。


2.jmp指令

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

jmp指令要给出俩种信息:

1)转移的目的地址

2)转移的距离(段间转移、段内转移)

不同的给出母的地址的方法和不同的转移位置,对应有不同格式的jmp指令。下面我们给出母的地址的不同方法为主线,讲解jmp指令的主要应用格式和CPU执行转移指令的基本原理。


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

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

assume cs:code
code segment
	
start:
	mov ax,0
	mov bx,0
	jmp short s
	add ax,1
s:
	inc ax
code ends
end start 


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

CPU不是神仙,它只能处理人们提供给它的东西,jmp指令的机器码中不包含转移的目的地址,那么CPU如何知道将IP改为多少呢?所以,在jmp指令的机器码中,一定包含了某种信息,使得CPU可以将它当做修改IP的数据,这种信息试是什么呢?我们一步步地分析。

我们先简单回忆一下CPU执行指令的过程
(1)从CS:IP指向的内存单元中读取指令,读取指令进入指令缓冲器
(2)(IP)=(IP)+读取指令的长度,从而指向下条指令
(3)执行指令,转移1重复执行
按照这个步骤,我们参照图9.2看一下,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

从上面的过程我们看到,CPU将指令EB 03读入后,IP指向了下一条指令,即CS:0008处的add ax,1,接着执行EB 03。如果EB 03没有对IP进行修改的话,那么接下来CPU将执行add ax,1,可是CPU执行EB 03确实是一条修改IP的转移指令,执行后(IP)=000BH,CS:IP指向inc ax,CS:0008处的add ax,1没有执行。

CPU在执行EB 03的时候根据什么修改IP,使其指向目标指令呢?就是根据指令码中的03。注意,要转移的目的地址是CS:000B,而CPU执行EB 03时,当前的(IP)=0008,如果将当前IP值加3,使(IP)=000BH,CS:IP就可指向目标指令。在转移指令EB 03中并没有告诉CPU要转移的目的地址,却告诉了CPU要转移的位移,即将当前IP向后移动3个字节。

原来如此,在jmp short 标号指令所对应的机器码中,并不包含转移的目的地址,而包含的是转移的位移。这个位移,是编译器根据汇编指令中的标号计算出来的。

实际上,指令jmp short 标号的功能是:(IP)=(IP)+8位位移。
指令jmp near ptr 标号的功能:(IP)=(IP)+16位位移。实现段内近转移。

4.转移的目的地址在指令中的jmp指令
前面讲的jmp指令,其对应的机器指令中并没有转移的目的地址,而是相对于当前IP的转移位移。
指令jmp far ptr 标号实现的段间转移,又称远转移,功能如下:
(CS)=标号所在的段地址,(IP)=标号在段中的偏移地址。
far ptr指明了指令用标号的段地址和偏移地址修改CS和IP。


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)=(内存地址)

7.jcxz指令
jcxz指令是有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围:-128~127。
指令格式:jcxz 标号 (如果(cx)=0,转移到标号处执行)
操作:当(cx)=0时,(IP)=(IP)+8位位移
如果(cx)!=0,什么也不做,继续向下执行。它的功能相当于:if((cx)==0) jmp short 标号











【汇编语言】转移指令的原理(二) —— 一步到位:jmp 指令的四种跳转方式 本文主要讲解了jmp指令的四种跳转方式,比如转移地址在内存中的转移,依据位移的转移等等 阅读详情

相关推荐

汇编学习笔记----转移指令及子程序原理

/*******8086CPU执行指令的步骤********/ 极重要: 1、从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器 2、(IP)=(IP)+所读取指令的长度,从而指向下一条指令 3、执行指令,转到第一步,重复这三步 (注意:CPU是先指向要执行指令的下一条指令再开始执行指令) /******offset:获取标记地址******/ 获得伪代码中的标记地址后,我

fengxiaoke_fxk的专栏 1736

汇编语言中短转移指令jmp short指令偏移地址计算

汇编语言中,jmp short指令是8位转移指令,可以修改ip寄存器的范围为-128~127 (8位补码的表示范围,因为偏移地址计算使用的是补码) 短转移指令的机器码格式为EB??,其中??表示8位偏移地址,接下来研究??的计算方法。 一、公式介绍 要计算jmp short的偏移地址,我们要记住公式: 偏移地址=标记处的偏移地址-CPU读完该jmp指令后的ip寄存器值 二、方法步骤 1.后跳转 我们引入MASM中的代码片段 DATAS SEGMENT DATAS ENDS CODES SEGMENT

CaiYuxingzzz的博客 7323

基于Python实现的捕鱼达人小游戏源代码+使用说明

摘要: 本文介绍了一款自制的捕鱼达人小游戏,使用Python3和Pygame模块开发。游戏包含完整的资源文件(图片、音效、字体)和源码结构(11个功能模块),实现了大炮移动射击、特殊子弹、炸弹、难度递增等核心玩法。安装需配置Python环境和Pygame模块,运行main.py即可启动游戏。游戏支持键盘控制(方向键移动、空格射击、1键放炸弹),默认时长600秒,包含开始菜单、游戏界面和结束界面。所有代码均有详细注释,项目已开源并提供下载链接。(150字)

2301_76484015的博客 665

汇编语言 转移指令及其原理

汇编语言 jmp offset jcxz loop等转移指令的原理

ylh的博客 2547

【论文精读】DisCo: Graph-Based Disentangled Contrastive Learning for Cold-Start Cross-Domain Recommendat

源域中具有相似偏好的用户在目标域中可能会表现出不同的兴趣。因此,直接迁移嵌入可能会引入不相关的源域协同信息。提出了一个基于图的解耦对比学习框架,以捕捉细粒度的用户意图并过滤掉不相关的协同信息,从而避免负迁移。 具体而言,对于每个域,我们使用多通道图编码器来捕捉多样化的用户意图。然后,我们在嵌入空间中构建亲和图,并执行多步随机游走以捕捉高阶用户相似性关系。将一个域视为目标域,我们提出了一种以用户相似性为指导的解耦意图对比学习方法,以优化跨域的用户意图桥接。

qq_52342142的博客 1227

基于Apache SeaTunnel构建CDC数据同步管道

Apache SeaTunnel是一个数据集成开发平台,其发展经历了几个重要阶段:ETL时代(90年代):面向结构化数据库的数据同步,用于构建数据仓库。MPP和分布式技术流行:使用技术如Hive进行数据仓库的构建。此阶段主要使用mapreduce程序进行数据搬运和转换。数据湖技术流行:重视数据集成,强调先同步数据至数据湖仓储,再进行业务面向的转换和设计。CDC,即变更数据捕获,是一种捕获数据库变更事件(如插入、更新、删除)的技术。

weixin_54625990的博客 2172

汇编语言指令解释

数据类型 ************************************************************************************************** 十进制        二进制        十六进制 0        0000        0 1        0001        1 2        0010        2        3        0011        3    4      

LHL62411570的专栏 2499

代付系统/代付系统源码/支付宝代付系统/API代付系统

简介: 其他站买的,没有做测试,源码是JAVA的,附带了安装文档,需要的拿无售后 源码下载地址https://www.skpan.cn/2QnIARSZDxG 代付系统/代付系统源码/支付宝代付系统/API代付系统 系统流程: 后台开通代理——开通商户——商户做代付(后台手工提交和 api 提交两种方式) 1、纯代付系统 2、支持个人支付宝全自动 3、支持单笔/批量/API接口方式代付 4、支持白名单、谷歌验证 5、收付款模式采用自动回调/自动转账 一、运营平台 商户管.

刀客源码网 5573

汇编语言总结笔记

汇编语言初识(一) 开始学习汇编语言,对相关的所学知识做个总结,希望对自己可以有所提高。 1、在计算机中数的表示方式 因为计算机中只能存储二进制数,所以一般都是通过二进制直接进行存储,但是为了方便阅读和程序员的编码简单化,就出现了八进制、十进制、十六进制,一般在汇编的学习过程中以二、十、十六进制为主。 四种数据的表示形式符号是:B(二进制)、O(八进制),D(十进制),

liuy88141的博客 1万+

嵌入式设备系统日志记录及调试技巧_嵌入式日志系统(1),如何成为杰出的程序员

这里面我使用的芯片为哈弗体系,全局常量存储编译器默认分配在flash,需要注意如果使用片内flash时,注意存储调试等级的flash块不要与代码区重合,要不然修改调试等级擦除flash块同时PC指针指向当前块的代码区,会导致仪器死机;这个也是之前用的比较多的,以上代码是模仿linux 内核的写法,可以比较好的做到日志信息分层,编译时相加对应的编译开关即可。但有个弊端就是,切换debug等级时,需要重新编译且需更新固件,而嵌入式设备出现异常后更新固件往往复位后,故障有时很难复现,调试起来比较浪费时间。

2401_84240431的博客 1292

Python | 集合(set)运算之intersection()

简介 在做力扣题的时候,有一个思路是要求解两个字符串的交集。 一般来说,求解交集的思路是遍历两个字符串,判断有无相等,有相等则添加到交集中,直到循环结束。 但是这样做,会增加很多的不必要的遍历:比如说,当一个字符串中有多个相同的元素时,该元素会被遍历多次。 因此,在求解时,我们可以先将字符串转换为set集合类型。集合中存储的元素没有顺序,且互异(即元素不可重复)。 算例 求字符串m“abcdaaa” 与 字符串n“bcddses”是否存在交集 首先将字符串转换为set类型: m = set(m) n

lovetaozibaby的博客 1万+

[从零学习汇编语言] - 转移指令原理详解

文章目录前言一、转移指令原理1.1 计算机如何识别数据和指令1.2 转移 前言 点赞再看,养成习惯! 关注晓龙oba公众号,获取更多电子书及学习资源。 该系列博文基于王爽老师 <汇编语言 第四版> 一书,需要的同学链接自取: 链接:https://pan.baidu.com/s/1NAgD1Z15LtK1BuH92xmICA 提取码:xlzb 另外书中提到的DosBox软件不想去官网下载的小伙伴也可以自取: 链接:https://pan.baidu.com/s/1O6PnLb_hN-WU

xiaoai1994的博客 3730

YOLOv8改进 | 主干篇 | 利用MobileNetV1替换Backbone(轻量化网络结构)

本文给大家带来的改进机制是MobileNetV1,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。这些模型基于简化的架构,并利用深度可分离卷积构建轻量级深度神经网络,其引入了两个简单的全局超参数,用于在延迟和准确性之间进行有效的权衡。实验表明,MobileNets在资源和准确性的权衡方面表现出色,并在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中展现了其有效性,这个模型非常适合轻量化的读者来使用。适用检测目标:轻量化网络结构适合轻量化的读者。

Snu77的博客 3966

汇编语言 第九章-转移指令的原理

jmp为无条件转移,可以只修改IP,也可以同时修改CS和IP;jmp指令要给出两种信息:转移的目的地址转移的距离(段间转移、段内短转移,段内近转移格式:jmp short 标号(转到标号处执行指令)这种格式的 jmp 指令实现的是段内短转移,它对IP的修改范围为 -128~127,也就是说,它向前转移时可以最多越过128个字节,向后转移可以最多越过127个字节。8086CPU的转移指令分为以下几类:1.无条件跳转指令(如:jmp)2.条件跳转指令3.循环指令(如:loop)

2302_80490510的博客 1299

面试问题总结——关于OpenCV(一)

整理了一下网上和我面试中遇到的关于OpenCV相关的问题。 其中因为我的简历中有个项目用到了特征点检测相关的知识,所以整理了SIFT/SURF和FLANN。 有些知识点也不深入,对于写的不对的地方,欢迎指正。 关于OpenCV的内容 1.OpenCV中cv::Mat的深拷贝和浅拷贝问题   深拷贝:分配新内存的同时拷贝数据,当被赋值的容器被修改时,原始容器数据不会改变。   浅拷贝:仅拷贝数据,当被赋值容器修改时,原始容器数据也会做同样改变。 OpenCV的Mat时,有几种赋值方式分别为:   深.

boss-dog 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

[汇编语言]转移指令的原理

汇编语言 转移指令的原理

Protein_zmm的博客 1171

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【8086汇编语言】——转移指令原理

摘要:本文介绍了x86汇编中的转移指令分类和执行原理。转移指令分为段内转移(仅修改IP)和段间转移(修改CS和IP),其中段内转移又分为短转移(-128~127)和近转移(-32768~32767)。重点分析了jmp指令的两种形式:jmpshort标号(段内短转移)和jmpnearptr标号(段内近转移),通过具体代码示例展示了jmp指令的机器码组成和执行过程,解释了8位位移的计算方法(目标地址-jmp指令后第一个字节地址)。文中还列出了无条件跳转、条件跳转等转移指令类型。

ylmiraclelife的博客 438

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

《汇编语言》王爽 第9章 转移指令的原理 实验8 实验9

《汇编语言》——王爽 实验8、实验9参考答案

2301_79165408的博客 1592

【汇编语言】转移指令的原理(三) —— 汇编跳转指南:jcxz、loop与位移的深度解读

本文主要介绍了jcxz和loop指令,以及为什么要有根据位移进行转移这个东西,有什么实际意义。

2301_80191662的博客 2368

汇编——第九章转移指令的原理

汇编——第九章转移指令的原理 ** 可以修改IP,或者同时修改CS 和IP 的指令统称为转移指令。**概括来讲,转移指令就是可以控制CPU执行内存种某处代码的指令。 9.1 操作符 offset 9.2 jmp 指令 jmp为无条件转移指令,可以只修改IP也可以同时修改CS和IP。 jmp指令要给出两种信息: (1)转移的目的地址 (2)转移的距离(段间转移、段内短转移、段内近转移) 9.3 ...

wxy2635618879的博客 246

汇编语言之转移指令和原理

 1、引言 可以修改IP,或同时修改CS和IP的指令统称为转移指令。概括地讲,转移指令就是可以控制CPU执行内存 中某处代码的指令。 8086CPU的转移行为有以下几类: 1. 同时修改CS和IP时,称为段间转移,比如:jmp 100:2a7。 2. 只修改IP时,称为段内转移,比如:jmp ax。 由于转移指令对IP的修改范围不同,段内转移又分为“短转移”和“近转移”。 3.

码莎拉蒂 8056

《汇编语言》第九章 转移指令的原理

第九章 转移指令的原理 第九章 转移指令的原理 9.0 转移的分类: 9.1 操作符 offset 9.2 jmp指令 9.3 依据位移进行转移的jmp指令 9.4 转移的目的指令在指令中的jmp指令 9.5 转移地址在寄存器中的jmp指令 9.6 转移地址在内存中的jmp指令。 9.7 jcxz指令 9.8 loop指令 9.9 根据位移进行转移的意义 9.10 编译器对转移位移超界的检测...

OneTrianee的博客 525

汇编指令和机器码一一对应_读《汇编语言》第三版 第九章 转移指令的原理

可以修改IP,或同时修改CS和IP的指令统称为转移指令。简单点说,转移指令就是可以控制CPU执行内存中某处代码的指令。(CS代码段寄存器与IP指令指针寄存器) 8086CPU的转移行为有以下几类。 由于转移指令对IP修改的范围不同,段内转移又分为如下: 8086CPU的转移指令分为以下几类: 这些转移指令的前提条件可能不同,但转...

weixin_39721000的博客 861

王爽 《汇编语言》 读书笔记 九 转移指令的原理

第九章  转移指令的原理 可以修改,或同时修改CS和IP的指令统称为转移指令。 只修改IP   jmp ax 同时修改CS和IP   jmp  1000:0 无条件转移指令jmp 条件转移指令 循环指令 过程 中断 9.1 操作符 offset 由编译器处理的符号 取得标号的偏移地址 start : mov ax, offset start s: m

sesiria的博客 494

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

第九章 转移指令的原理 9.1 操作符offset 操作符offset在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址 9.2 jmp指令 jmp为无条件转移,可以只修改IP,也可以同时修改CS和IP; jmp指令要给出两种信息: 转移的目的地址 转移的距离(段间转移、段内短转移,段内近转移) 9.3 依据位移进行转移的jmp指令 jmp short 标号(转到标号处执行指...

qq_44671752的博客 440

转移指令的原理(学习汇编)

1.可以修改IP,或同时修改CS和IP的指令统称转移指令。有两种类型转移: (1)只修改IP是段内转移,如:jmp ax (2)修改CS和IP是段间转移,如:jmp 1000:0 2.操作符offset是一个伪指令,它的功能是取得标号的偏移地址。 3.jmp为无条件转移,可以只修改IP,也可以同时修改CS和IP的值,jmp指令要给出两个信息: (1)转移...

weixin_30716725的博客 160
上一篇: 汇编基础知识
下一篇: ret和call的原理
OS技术解密
博客等级 码龄16年 3760粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值