通过call指令来学习指令摘要表的细节

 
E8 cw

cw 表示E8后面跟随2 字节 (什么数不知道)

 rel16  指在与指令同一代码段内的相对地址偏移

D ,指向Instruction Operand Encoding 表中的D列, 他告诉我们 操作数1 是一个0FFSET

N.S. 在64位模式下,某些指令需要使用“地址覆盖前缀”(address override prefix),但这并不被所有处理器支持。如果在64位模式下使用地址覆盖前缀,可能会导致特定处理器型号的执行行为出现不一致或错误。

Valid 表示兼容模式和传统模式下,这个指令是有效的

Description: 调用指令”(Call)是一种“近跳”(near jump)指令,它的目标地址是相对于下一条指令的偏移量(displacement)

可以看到在32位的情况下,默认的操作数大小为 32位, 所以我门需要添加 66前缀,改变操作数的大小


E8 cd

cd 表示后跟4字节

 rel32 :指在与指令同一代码段内的相对(relative )地址偏移
Description:它的目标地址是相对于下一条指令的偏移量(displacement)

在相对寻址中,可以上下寻址, 相对偏移可以是正数,往下跳,如果是负数,往上跳

 下面的例子中,FFFF FFFA 表示十进制的 -6 ,也就是相对 77261B78 偏移-6 的地址就是77261B72

 


9A cp 


cp:在操作码后跟随的值的字节大小为6字节

 ptr16:32:冒号左边的值是一个16位选择子或用于代码段寄存器的值。右侧的值对应目标段内的偏移量。
Description: 远跳转 ,绝对( absolute,),地址在操作数中给出

请留意这个汇编代码的编写格式 call far 0x0023:0x77261B72
在32位 保护模式中,段的base都是从0开始,所以目标段内的偏移量是0x77261B72
在opcode 的后6个字节中,72 1B 26 77 23 00 ,是按照小端序排列的

 不知道你注意到没有, 在执行这个远跳转时, 除了返回的rip ,还有一个参数被压入栈中 ---23

 如果我执行 77261B72 这个地址的ret指令,你猜会发生什么事情.

堆栈将无法平衡!!!!!!!!!!!!!!!!!!!!!!!!!!

 并且,23 到底是什么东西
 

请翻阅 英特尔手册 第一卷的 6.4.2 Far CALL 和 RET 操作 将会找到答案

 FF /2

/2  表示mod/rm字段 中 reg字段==2
r/m32表示一个32位通用寄存器或内存操作数,用于指令的操作数大小属性为32位的情况。32位通用寄存器包括 EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI。在64位模式下,通过使用 REX.R 前缀,还可以访问 R8D 到 R15D 这些32位寄存器。
M  表示 在 Instruction Operand Encoding 表 的M列中, Operand 1 在 ModRM字段的:r/m 字段中,并且将被读取(r)
Description:近跳转,绝对 ,间接, 地址在r/m32中给出

翻阅 写文章-CSDN创作中心关于opcode从零开始的补充2-CSDN博客 写文章-CSDN创作中心   中 2.1.3 ModR/M and SIB Bytes章节
中的表 Table 2-2. 32-Bit Addressing Forms with the ModR/M Byte


 

我通过表,构造了如下的 指令 ,注意我没有通过汇编代码生成,都是使用 二进制代码编写
所以请你注意汇编指令的书写方式


请你注意  绝对的 间接的绝对的 跳转  的跳转两种方式的不同
 

 FF/3

/3表示mod/rm字段 中 reg字段==3
 m16:32表示包含一个由两个数字组成的远指针的  内存操作数。冒号左边的数字表示段选择符,右边的数字表示段内偏移量。
M和上面的意义相同
Description在64位模式下,RIP(指令指针寄存器)的更新规则如下
如果选择子(selector)指向一个门(gate):此时,RIP 的值将被设置为从该门中获取的64位位移(displacement)。
如果选择子没有指向门,则 RIP 将被设置为从指令中引用的远指针(far pointer)中获取的32位偏移(offset),并进行零扩展(zero extended)到64位。

 在构建 m16:32 时, 你需要在内存地址中构建一个 6字节的数,
这个数和使用绝对寻址的形式需要一样
并将地址放入eax寄存器中


下面的代码帮助你记忆

char buff[6];
	*(DWORD*)&buff[0] = 0x77261b72;	//段内偏移

	*(WORD*)&buff[4] = 0x23;		//段选择子
__asm
	{
		call fword ptr[buff];
	}

 可以看到,我们没有 跨特权级,在调用call之后 堆栈中
esp==>返回地址
esp==>原来的cs段选择子

 

下一篇描述  jump指令
如有问题,请联系qq1490900437

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RL学习笔记-马尔可夫过程

参考资料:蘑菇书、周博磊老师课程 在强化学习中,智能体与环境交互是通过马尔可夫决策过程来表示的,因此马尔可夫决策过程是强化学习的基本框架。 马尔可夫性质 指一个随机过程在给定现在状态及所有过去状态情况下,其未来状态的条件…

Golang | Leetcode Golang题解之第506题相对名次

题目: 题解: var desc [3]string{"Gold Medal", "Silver Medal", "Bronze Medal"}func findRelativeRanks(score []int) []string {n : len(score)type pair struct{ score, idx int }arr : make([]pair, n)for i, s : …

BERT语言模型详解【Encoder-Only】

NLP-大语言模型学习系列目录 一、注意力机制基础——RNN,Seq2Seq等基础知识 二、注意力机制【Self-Attention,自注意力模型】 三、Transformer图文详解【Attention is all you need】 四、大语言模型的Scaling Law【Power Low】 五、大语言模型微调方法详解【全量微调、PEFT、…

Android Studio 导入/删除/新建库的模块(第三方项目) - Module

文章目录 一、导入module项目 Module空项目如何导入Project工程项目二、删除module项目三、新建module项目(不常用) 一、导入module项目 首先,你必须要有一个工程(Project),才可以打开项目(Module) 第一步骤:右键项目依次点击 New -> Module 1、工…

LLM | 论文精读 | 基于大型语言模型的自主代理综述

论文标题:A Survey on Large Language Model based Autonomous Agents 作者:Lei Wang, Chen Ma, Xueyang Feng, 等 期刊:Frontiers of Computer Science, 2024 DOI:10.1007/s11704-024-40231-1 一、引言 自主代理(…

AI 提示词(Prompt)入门 :ChatGPT 4.0 高级功能指南

这段时间 GPT4 多了很多功能,今天主要是增加了 GPTs Store 的介绍和 创建 GPTs 的简单方法,那么我们开始吧,文末有彩蛋。 这里主要讲解如下几个点: 1: ChatGPT 4.0 插件的使用 2:ChatGPT 4.0 高级数据分…

【已解决】【hadoop】【hive】启动不成功 报错 无法与MySQL服务器建立连接 Hive连接到MetaStore失败 无法进入交互式执行环境

启动hive显示什么才是成功 当你成功启动Hive时,通常会看到一系列的日志信息输出到控制台,这些信息包括了Hive服务初始化的过程以及它与Metastore服务连接的情况等。一旦Hive完成启动并准备就绪,你将看到提示符(如 hive> &#…

大数据Azkaban(二):Azkaban简单介绍

文章目录 Azkaban简单介绍 一、Azkaban特点 二、Azkaban组成结构 三、Azkaban部署模式 1、solo-server ode(独立服务器模式) 2、two server mode(双服务器模式) 3、distributed multiple-executor mode(分布式多…

FPGA第 13 篇,使用 Xilinx Vivado 创建项目,点亮 LED 灯,Vivado 的基本使用(点亮ZYNQ-7010开发板的LED灯)

前言 在FPGA设计中,Xilinx Vivado软件是一款功能强大的设计工具,它不仅支持硬件描述语言(HDL)的开发,还提供了丰富的图形化设计界面,方便用户进行硬件设计、调试和测试。这里我们将详细介绍,如…

RabbitMQ 高级特性——事务

文章目录 前言事务配置事务管理器加上Transactional注解 前言 前面我们学习了 RabbitMQ 的延迟队列,通过延迟队列可以实现生产者生产的消息不是立即被消费者消费。那么这篇文章我们将来学习 RabbitMQ 的事务。 事务 RabbitMQ 是基于 AMQP 协议实现的,…

Gstreamer的webrtcbin插件

1、输入参数 static GOptionEntry entries[] {{"peer-id", 0, 0, G_OPTION_ARG_STRING, &peer_id, "String ID of the peer to connect to", "ID"},{"server", 0, 0, G_OPTION_ARG_STRING, &server_url, "Signalling se…

unity项目导出安卓工程后,在AndroidStudio打包报错:unityLibrary:BuildIl2CppTask‘.

下面这个是我在unity开发者社区提问后,他们回答得: 解决方案:我这边按照这几个方案检查了下,NDK和JDK都没问题,最后重启电脑才解决的,应该是文件被锁定了,我用的windows系统的。 验证&#xff…

一篇文章快速认识YOLO11 | 旋转目标检测 | 原理分析 | 模型训练 | 模型推理

本文分享YOLO11的旋转目标检测任务,在原始目标检测中,添加多一个角度预测,实现定向边界框检测。 其中旋转角度算法设计中,通过回归预测实现的。 目录 1、旋转目标检测概述 2、YOLO11中的OBB数据格式 3、分析模型配置参数 4、…

dmsql日志分析工具部署与使用DM8/DM7

dmsql日志分析工具部署与使用DM8/DM7 1 环境介绍2 JAVA 环境变量配置2.1 Os Kylin 10 JAVA 环境变量配置2.2 Windos7 JAVA环境变量配置 3 数据库配置3.1 数据库初始化参数3.2 数据库创建表 4 配置DMLOG日志分析工具4.1 Kylin v10 配置DMLOG日志分析工具4.2 执行日志分析4.3 Win…

Node-RED的面板的认识及操作

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 📘 文章引言 📟 面板…

jvm虚拟机介绍

Java虚拟机(JVM)是Java语言的运行环境,它基于栈式架构,通过加载、验证、准备、解析、初始化等类加载过程,将Java类文件转换成平台无关的字节码,并在运行时动态地将其翻译成特定平台的机器码执行。 JVM的核心…

如何尽早地发现并抵御 DDoS 攻击?

近半年,随着软硬件服务的廉价化、规模化,国内外云厂商频繁遭受不明原因的大规模网络攻击,给很多网站带来了不良的影响。其实,DDoS 攻击这把「达摩斯之剑」一直高悬在各家互联网公司的头顶,虽然很多互联网企业对 DDoS 攻…

「C/C++」C++ STL容器库 之 std::list 双向链表容器

✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

使用飞桨AI Studio平台训练数据,并进行图像识别分析得牡丹花测试

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL&#xff0…

arcgis js 怎么加载geoserver发布的wms服务

arcgis js api加载wms服务,官方的参考样例: WMSLayer | Sample Code | ArcGIS Maps SDK for JavaScript 4.30 | Esri Developer 按照官方样例加载比较奇怪,我们平常习惯用url或者json的方式加载,稍微改一下就行,如下…