变长指令

不是所有的指令都是,看到opcode就知道有多长(定长指令),当指令中出现内存操作对象的时候,就需要在操作码后面附加一个字节来进行补充说明,这个字节被称为ModR/M。

该字节的8个位被分成了三部分:

其中,Reg/Opcode(第3、4、5位,共3个字节)描述指令中的G部分,即寄存器

Mod(第6、7位)和R/M(第0、1、2位)共同描述指令中的E部分,即寄存器/内存

因特尔白皮书:

MOV变长指令

0x88  MOV Eb, Gb          G:通用寄存器

0x89  MOV Ev, Gv           E:寄存器/内存

0x8A  MOV Gb, Eb           b:字节

0x8B  MOV Gv, Ev           v:Word, doubleword or quadword(这个看操作系统,是多少位就多少位)

0x88

0x88 01

MOV Eb, Gb: Gb决定了是8位的通用寄存器,具体是哪一个通用寄存器还要看ModR/M的3,4,5部分

01:00   000    001

前两位是Mod ;3,4,5位是Reg/Opcode;0,1,2位是R/M

由上面可以知道 Reg/Opcode部分是 000,相当于0号寄存器,即[EAX],但是由于是8位,所以是AL

012位和67位组合起来是00 001

是[ECX],所以这条指令应该是:mov byte ptr ds:[ECX],AL

0x88 15

MOV Eb, Gb: Gb决定了是8位的通用寄存器,具体是哪一个通用寄存器还要看ModR/M的3,4,5部分

01:00   010    101

前两位是Mod ;3,4,5位是Reg/Opcode;0,1,2位是R/M

由上面可以知道 Reg/Opcode部分是 001,相当于2号寄存器,即[ECX],但是由于是8位,所以是CL

012位和67位组合起来是00 101

可以看到这里并不是我们想的EBP,这是因为EBP指向栈底,而[EBP]通常存储上一个EBP,所以[EBP]无数据操作意义,Inter将这个编码废弃,改为立即数寻址

例如当操作指令为88 81 12 34 56 78时,其对应的汇编为MOV BYTE PTR DS:[ECX+78563412],AL

disp32实际上是个偏移

再看这几个 ESP都没有对应的值

这是因为:ESP指向栈顶,是浮动的,不确定的,Inter将这个编码废弃,由另外的格式来说明。

还是看一下

0x89

0x89 03

MOV Ev, Gv : Gv与我当前的x32dedug决定了是32位的通用寄存器,具体是哪一个通用寄存器还要看ModR/M的3,4,5部分

01:00   000    011

前两位是Mod ;3,4,5位是Reg/Opcode;0,1,2位是R/M

由上面可以知道 Reg/Opcode部分是 000,相当于0号寄存器,即EAX

012位和67位组合起来是00 011

所以是[EBX],这条指令是:mov dword ptr ds:[ebx],eax

这里只列举一个,这个指令与0x88区别就是位数的差别

0x8A

0x8A 07

MOV Gb, Eb: Gb决定了是8位的通用寄存器,具体是哪一个通用寄存器还要看ModR/M的3,4,5部分

01:00   000    111

前两位是Mod ;3,4,5位是Reg/Opcode;0,1,2位是R/M

由上面可以知道 Reg/Opcode部分是 000,相当于0号寄存器,即EAX,但我们这里是byte所以是al

012位和67位组合起来是00 111

是EDI,这条指令命令为:mov al,byte ptr ds:[edi]

0x8B

0x8B 26

MOV Gv, Ev : Gv与我当前的x32dedug决定了是32位的通用寄存器,具体是哪一个通用寄存器还要看ModR/M的3,4,5部分

01:00  100  110

前两位是Mod ;3,4,5位是Reg/Opcode;0,1,2位是R/M

由上面可以知道 Reg/Opcode部分是 100,相当于5号寄存器,即ESP

012位和67位组合起来是00 110

esi,mov esp,dword ptr ds:[esi]

0x8B 66 12

MOV Gv, Ev : Gv与我当前的x32dedug决定了是32位的通用寄存器,具体是哪一个通用寄存器还要看ModR/M的3,4,5部分

01:01  100  110

前两位是Mod ;3,4,5位是Reg/Opcode;0,1,2位是R/M

由上面可以知道 Reg/Opcode部分是 100,相当于5号寄存器,即ESP

012位和67位组合起来是01 110

[esi+12],mov esp.dword ptr ds:[esi+12]

总结

当Mod = 00时,ModR/M字节通过寄存器直接进行内存寻址

当Mod = 01时,ModR/M字节通过寄存器+I8进行内存寻址(I为立即数,即8位立即数)

当Mod = 10时,ModR/M字节通过寄存器+I32进行内存寻址

当Mod = 11时,ModR/M字节直接操作两个寄存器

经典变长指令ModR/M的更多相关文章

  1. 经典变长指令SIB

    前言 ModR/M字段是用来进行内存寻址的,可当地址形如DS:[EAX + ECX*2 + 12345678]时,仅仅靠ModR/M字段,是描述不出来的. 这时就在ModR/M后面增加一个SIB字节, ...

  2. 经典变长指令-ModRM

    一.如何计算ModRM 0X88 MOV Eb,Gb G:通用寄存器 0X89 MOV Ev,Gv E:寄存器/内存 0X8A MOV Gb,Eb b:字节 0X8B MOV Gv,Ev v:Word ...

  3. 经典变长指令-RegOpcode

    一.回顾Mod/M结构 Intel 64 and IA-32 Architectures Instruction Format ModR/M结构图 Mod与R/M共同描述E的意义(内存或者通用寄存器) ...

  4. 经典定长指令-修改EIP

    1.0x70~0x7F EIP无法像通用寄存器那样用mov来修改,只能通过类似于jz,JNB,JNE JBE,call等的跳转指令来进行修改 条件跳转,后跟一个字节立即数的偏移(有符号),共两个字节. ...

  5. C++中的变长参数

    新参与的项目中,为了使用共享内存和自定义内存池,我们自己定义了MemNew函数,且在函数内部对于非pod类型自动执行构造函数.在需要的地方调用自定义的MemNew函数.这样就带来一个问题,使用stl的 ...

  6. C++内存分配及变长数组的动态分配

    //------------------------------------------------------------------------------------------------ 第 ...

  7. (一)预定义宏、__func__、_Pragma、变长参数宏定义以及__VA_ARGS__

    作为第一篇,首先要说一下C++11与C99的兼容性. C++11将 对以下这些C99特性的支持 都纳入新标准中: 1) C99中的预定义宏 2) __func__预定义标识符 3) _Pragma操作 ...

  8. CSAPP阅读笔记-变长栈帧,缓冲区溢出攻击-来自第三章3.10的笔记-P192-P204

    一.几个关于指针的小知识点: 1.  malloc是在堆上动态分配内存,返回的是void *,使用时会配合显式/隐式类型转换,用完后需要用free手动释放. alloca是标准库函数,可以在栈上分配任 ...

  9. Scala 变长参数

    如果Scala定义变长参数 def sum(i Int*), 那么调用sum时,可以直接输入sum(1,2,3,4,5) 但是不可以sum(1 to 5) 必须要将1 to 5 强制为seq sum( ...

随机推荐

  1. Python Web Frameworks

    Python Web Frameworks top 10 Python web frameworks Django (Full-stack framework) Flask (Micro framew ...

  2. H5 APP 页面移动端适配方案

    H5 APP 页面移动端适配方案 https://segmentfault.com/a/1190000011586301 https://juejin.im/post/5cbdee71f265da03 ...

  3. git & Angular git commit 规范

    git & Angular git commit 规范 https://github.com/angular/angular/commits/master https://github.com ...

  4. git stash & git stash pop

    git stash & git stash pop $ git checkout feature/select-seat-system $ git checkout feature/app-d ...

  5. Masterboxan INC发布印尼电商市场报告

    据海外媒体报导,Masterboxan INC(编号:20151264097)发布了印尼电商市场观察报告,指出印尼电商市场仍然有很大的发展潜力. Masterboxan INC表示,与发达国家从 PC ...

  6. NGK Global莫斯科路演:关注内存暴涨和Defi新项目-Baccarat

    此次路演由莫斯科演讲师Andrew首先致辞.首先安德鲁回顾了NGK近些年发展的整体情况,表示,NGK技术团队一直在认真的做事并将更加注重技术方案的改进,为行业提供更好的技术解决方案是NGK的愿景,NG ...

  7. ffmpeg中的日志控制、保存日志到指定文件、处理进度查询

    ffmpeg默认就会输出一些日志,包含编译的工具(gcc版本).可用的组件(--enable-xxxx).组件版本号码,如下图 这些信息是默认输出的,每次执行合作都会打印在控制台中,如果不想看这些信息 ...

  8. 启动Turtlesim,输入roscore命令,报错

    Error: Traceback (most recent call last):   File "/opt/ros/indigo/lib/python2.7/dist-packages/r ...

  9. [计算机图形学]Blinn-Phong光照模型

    目录 一.前言 二.原理 三.代码 一.前言 Blinn-Phong光照模型以Phong模型为基础的,提供比Phong更柔和.更平滑的高光,而且由于Blinn-Phong的光照模型省去了计算反射光线的 ...

  10. 第48天学习打卡(HTML 行内元素和块元素 列表 表格 视频和音频 页面结构分析 iframe内联框架 表单语法 )

    行内元素和块元素 块元素 ​ 无论内容多少,该元素独占一行 ​ (p.h1-h6) 行内元素 ​ 内容撑开宽度,左右都是行内元素的可以排在一行 ​ (a.strong.em...) 列表 什么是列表 ...