经典变长指令SIB
前言
ModR/M字段是用来进行内存寻址的,可当地址形如DS:[EAX + ECX*2 + 12345678]时,仅仅靠ModR/M字段,是描述不出来的。
这时就在ModR/M后面增加一个SIB字节,与ModR/M字段共同描述。
上一节说到opcode决定了是否有ModR/M字段,而opcode和ModR/M字段一起决定了SIB字段

可以看到再ModR/M后面,SIB这个值是否有取决于ModR/M的具体取值,其实就是上一节说的esp那个位置,ModR/M是空出来
SIB结构

首字母命名Scale Index Base SIB
SIB的描述方式为
Base + Index*2**Scale (Scale描述2Scale,所以只能为 *1 *2 *4 *8)
SIB图表
1、当Index = 100 时,Index被0替代,此时只有Base有效
2、当Base = 101 时,Base被0替代,此时只用Index有效

具体解析
0x89 2C 14
先看opcode 0x89
说明基本格式是MOV Ev, Gv : Gv与我当前的x32dedug决定了是32位的通用寄存器,具体是哪一个通用寄存器还要看ModR/M的3,4,5部分
ModR/M字段展开
00 101 100
5号寄存器
现在可以确定是 mov dword ptr ds:[xxxx],EBP
然后Mod R/M是00 100 决定了改指令有SIB字段

看SIB字段
00 010 100
对应的是S I B
用Base + Index*2**Scale这个公式
B:100 对应的是ESP

I:010 以及B:00 对应是EDX

整个下来是mov dword ptr ss:[ESP+EDX],EBP

这里为什么没有偏移呢,这个值还是由ModR/M字段说明,可以看到Mod为00,没有偏移,如果Mod为01或者10 ,后面依旧要更上1个字节的偏移或4个字节的偏移,这里不明白可以看上一节ModR/M的那张表

0x 89 AC 15
先看opcode 0x89
说明基本格式是MOV Ev, Gv : Gv与我当前的x32dedug决定了是32位的通用寄存器,具体是哪一个通用寄存器还要看ModR/M的3,4,5部分
ModR/M字段展开
10 101 100
5号寄存器
现在可以确定是 mov dword ptr ds:[xxxx],EBP
然后Mod R/M是10 100 决定了改指令有SIB字段

看SIB字段
00 010 101
对应的是S I B
用Base + Index*2**Scale这个公式
B:100 对应的是EBP

I:010 以及B:00 对应是EDX

整个下来是mov dword ptr ss:[EBP+EDX+一个dword偏移],EBP

这里为什么又有偏移:

经典变长指令SIB的更多相关文章
- 经典变长指令ModR/M
变长指令 不是所有的指令都是,看到opcode就知道有多长(定长指令),当指令中出现内存操作对象的时候,就需要在操作码后面附加一个字节来进行补充说明,这个字节被称为ModR/M. 该字节的8个位被分成 ...
- 经典变长指令-ModRM
一.如何计算ModRM 0X88 MOV Eb,Gb G:通用寄存器 0X89 MOV Ev,Gv E:寄存器/内存 0X8A MOV Gb,Eb b:字节 0X8B MOV Gv,Ev v:Word ...
- 经典变长指令-RegOpcode
一.回顾Mod/M结构 Intel 64 and IA-32 Architectures Instruction Format ModR/M结构图 Mod与R/M共同描述E的意义(内存或者通用寄存器) ...
- 经典定长指令-修改EIP
1.0x70~0x7F EIP无法像通用寄存器那样用mov来修改,只能通过类似于jz,JNB,JNE JBE,call等的跳转指令来进行修改 条件跳转,后跟一个字节立即数的偏移(有符号),共两个字节. ...
- C++中的变长参数
新参与的项目中,为了使用共享内存和自定义内存池,我们自己定义了MemNew函数,且在函数内部对于非pod类型自动执行构造函数.在需要的地方调用自定义的MemNew函数.这样就带来一个问题,使用stl的 ...
- C++内存分配及变长数组的动态分配
//------------------------------------------------------------------------------------------------ 第 ...
- (一)预定义宏、__func__、_Pragma、变长参数宏定义以及__VA_ARGS__
作为第一篇,首先要说一下C++11与C99的兼容性. C++11将 对以下这些C99特性的支持 都纳入新标准中: 1) C99中的预定义宏 2) __func__预定义标识符 3) _Pragma操作 ...
- CSAPP阅读笔记-变长栈帧,缓冲区溢出攻击-来自第三章3.10的笔记-P192-P204
一.几个关于指针的小知识点: 1. malloc是在堆上动态分配内存,返回的是void *,使用时会配合显式/隐式类型转换,用完后需要用free手动释放. alloca是标准库函数,可以在栈上分配任 ...
- Scala 变长参数
如果Scala定义变长参数 def sum(i Int*), 那么调用sum时,可以直接输入sum(1,2,3,4,5) 但是不可以sum(1 to 5) 必须要将1 to 5 强制为seq sum( ...
随机推荐
- 同城速递 & 同城跑腿 & 竞品分析
同城速递 & 同城跑腿 & 竞品分析 toC / toB 闪送 https://www.ishansong.com/ https://www.tianyancha.com/compan ...
- Vue SSR in Action
Vue SSR in Action https://ssr.vuejs.org/ https://ssr.vuejs.org/api/ https://ssr.vuejs.org/guide/data ...
- SPC空投搅动市场,NGK算力持有者或成大赢家!
要说公链3.0的顶级代表是谁,恐怕非NGK公链莫属.NGK公链自诞生以来,便在区块链市场掀起了一波又一波热潮,并不断地打造着属于自己独有的生态体系.从NGK公链到Baccarat,再到呼叫河马,几乎每 ...
- 适合Linux嵌入式项目的代码构建与依赖管理工具——cazel
前言 我们知道,现在有很多流行的优秀代码构建工具,如CMake.jetkins.bazel等.这些不同的构建工具在其应用的领域起到了举足轻重的作用. 但是,如果仔细研究就会发现,在嵌入式领域,构建工具 ...
- vscode 配置表
{ "git.ignoreMissingGitWarning": true, "editor.multiCursorModifier": "ctrlC ...
- winform捕捉全局异常
/// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static void Main() { try { //设置应 ...
- 痞子衡嵌入式:自识别特性(Auto Probe)可以让i.MXRT1060无需FDCB也能从NOR Flash启动
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是自识别特性(Auto Probe)可以让i.MXRT1060无需FDCB也能从NOR Flash启动. 接着上篇文章 <了解i.M ...
- Django-用户权限,用户角色使用指南
RBAC(Role-Based Access Control,基于角色的访问控制)就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成"用户 ...
- 8.Vue组件三---slot插槽
主要内容: 1. 什么是插槽 2. 组件的插槽 3. 插槽的使用方法 4. 插槽的具名 5. 变量的作用域 6. slot的作用域 一. 什么是插槽呢? 1. 生活中的插槽有哪些呢? usb插槽, ...
- js一周时间表
<div class="datetext"> <img class="dateLeft" src="./images/dateLef ...