一、如何计算ModRM

0X88 MOV Eb,Gb G:通用寄存器
0X89 MOV Ev,Gv E:寄存器/内存
0X8A MOV Gb,Eb b:字节
0X8B MOV Gv,Ev v:Word(16位),doubleword(32位),quadword(64位)

当指令中出现内存操作对象的时候,就需要在操作码后面附加一个字节来进行补充说明,这个字节被称为ModR/M。该字节的8个位被分成了三部分

7 ~ 6 5~3 2~0
Mod Reg/Opcode R/M

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



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

二、计算ModRM(案例)

0X88	MOV Eb,Gb-->MOV Eb AL
解释:b表示字节且01换成二进制的3,4,5位为000所以查表可知为AL
88 01 00 000 01-->MOV byte ptr ds:[ecx],al
解释:01换成二进制,分成三部分分别查表,通过6,7和0,1,2为查表可知为ecx
0X89	MOV Ev,Gv-->MOV Eb EAX
89 01 00 000 01-->MOV dword ptr ds:[ecx],EAX
0X8A	MOV Gb,Eb-->MOV Gb al
8A 01 00 000 01-->MOV al,byte ptr ds:[ecx]
0X8B	MOV Gv,Ev-->MOV EAX Ev
8B 01 00 000 01-->MOV EAX,dword ptr ds:[ECX]

经典变长指令-ModRM的更多相关文章

  1. 经典变长指令ModR/M

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

  2. 经典变长指令SIB

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

  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. Jenkins优化

    目录 一.修改 JVM 的内存配置 二.修改jenkins 主目录 一.修改 JVM 的内存配置 Jenkins 启动方式有两种方式,一种是以 Jdk Jar 方式运行,一种是将 War 包放在 To ...

  2. View的简单说明

    一)三个结构体:CGPoint.CGSize.CGRect 1. CGPoint struct CGPoint { CGFloat x; CGFloat y; }; typedef struct CG ...

  3. 解放生产力「GitHub 热点速览 v.21.51」

    作者:HelloGitHub-小鱼干 解放生产力一直都是我们共同追求的目标,能在摸鱼的空闲把赚了.而大部分好用的工具便能很好地解放我们的生产力,比如本周特推 RedisJSON 不用对 JSON 做哈 ...

  4. shell判断新字符串列表是否在老字符串列表中

    for sn in `cat 12.30-new`;do if ! [[ `cat 12.30-old` =~ $sn ]];then echo $sn; fi; done

  5. js 将二维数组转为一维数组

    方法一 使用ES的最新语法:Array.prototype.flat(). flat([dept]),参数 dept 为数组的深度,默认为1,根据传入的深度将数组展开. 对于不确定深度的数组,可以传入 ...

  6. Linux(Centos)配置vsftp使用账号密码(虚拟用户)登录ftp进行文件上传和修改

    安装vsftp yum install vsftpd -y 安装完成之后进入vsftp的配置文件夹 cd /etc/vsftpd/ 文件夹内容如下 [root@VM-0-12-centos vsftp ...

  7. 【LeetCode】156. Binary Tree Upside Down 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 迭代 日期 题目地址:https://leet ...

  8. 【LeetCode】133. Clone Graph 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS BFS 日期 题目地址:https://le ...

  9. 【LeetCode】996. Number of Squareful Arrays 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 回溯法 日期 题目地址:https://leetco ...

  10. 【LeetCode】518. Coin Change 2 解题报告(Python)

    [LeetCode]518. Coin Change 2 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目 ...