222222222222

article/2025/9/14 6:49:12
转自:http://computerscience.ycool.com/post.1801408.html


Intel的IA32-x86体系结构CPU的每条指令都可能由以下六个域组成,并且它们在指令中的排列顺序是不能改变的。
  这六个域分别是:
            prefixes 
(1 Byte)
            code 
(1/2/3 Bytes;2字节指令是第一个指令码为0x0f,而一般3字节指令的第3字节是ModR/M的一部分)
            ModR/M 
(1 Byte)
            SIB 
(1 Byte)
            displacement 
(1/2/4 Bytes)偏移量
            immediate 
(1/2/4 Bytes)立即数
  在任何一条指令中code域必须出现,其他的域都是可选的。
  由于这六个域在指令中的排列顺序是固定的,所以反汇编机器码,就是一个对它们的依次识别过程。
  1、
对prefixes的识别  
  x86体系结构CPU的4类prefixes,它们分别为:
            lock/repeat prefix      :F0/F2,F3 (LOCK和REP)
            segment override prefixes      :2E,36,3E,26,64,65 (忽略段的前缀)
            operand-size override prefix        :66 (忽略操作数大小的前缀)
            address-size override prefix        :67 (忽略地址大小的前缀)  
  指令的prefixes可以由这几类prefixes组成,但是每类prefixes只能在指令中出现一次,至于每类prefixes在指令的出项顺序是没有要求的,这点和指令的六个域是不同的。当某类prefixes在同一指令中出现多次的时候,CPU在执行过程中,可能会出现不可预料的结果,至于会不会出现异常,Intel的官方手册中只用了这句话来说明:such use may cause unpredictable behavior.鬼知道会出项什么情况,因此算法必须对这类机器码具有识别能力。但是也可能异常情况不会发生,在反汇编过程,遇到同一类prefixes出现多次的情况,以最后出现的prefix为准,进行机器码识别。
  总结:
    (1)Prefixes是唯一的一个可能出现在code之前的域。
    (2)所有的Prefixes都只有1个字节。 
    (3)在一个OpCode中可能会有多个Prefixes
    (4)如果有多个Prefixes,那么它们的顺序可以打乱,不会有任何问题。
    (5)如果Prefixes不能对随它之后的OpCode起作用,那么它就会被忽略。
    2、对code和operand的识别 
    CPU在设计时,为了提高比特位的利用率,也为了保证一个code不是另一个code的前缀(否则CPU也无法译码),code的编码采用的是哈夫曼算法。code的最大长度是3个字节,当然可以是1个字节,也可以是2个字节,另外,对于某些特定的code,还有3个比特的信息也会用来表示code.这3比特在ModR/M的3、4和5位。当然每个code也最多只能有三个operand。
    对code的识别一般都是采用二维表格来驱动的。二维表格中记录了给各code的详细信息。
    ModR/M字节:这个字节指示了后面跟随的操作数的形式,它分成3个部分:第7-6位是Mod部分,第5-3位是Reg部分,第2-0位是R/M部分,其中Mod和R/M部分结合指示了指令操作数的寻址方式,而Reg部分主要是指示用到的寄存器,这个字节的解释要和主操作码结合起来。
    SIB字节:除了上面这个ModR/M字节外,有时候指令还需要一个字节来补充指操作数的寻址方式,这个字节也分成3个部分:第7-6位是scale部分,第5-3位是index部分,第2-0位是base部分;
    在翻译过程中,以指令的操作码为索引从相应的数组来输出对应的指令字符串,而接下来最主要的就是对操作数的翻译,所有的操作数都可以用:【寻址方式 + 操作数类型】来表示,寻址方式有A(直接地址),C(ModR/M字节的REG部分指示一个控制寄存器),D( ModR/M字节的REG部分指示一个调试寄存器),E(ModR/M字节指示的操作数是一个通用寄存器或一个内存地址),F(EFLAGS寄存器),G(ModR/M字节的REG部分指示一个通用寄存器),I(立即数),J(指令包含一个相对地址),M(ModR/M字节指示一个内存地址),O(没有ModR/M字节,后面的字或双字为偏移地址),P(ModR/M字节的REG部分指示一个4字节MMX寄存器),Q(ModR/M字节指示的操作数是一个MMX寄存器或一个内存地址),R(ModR/M字节的Mod部分指示一个通用寄存器),S(ModR/M字节的REG部分指示一个段寄存器),T(ModR/M字节的REG部分指示一个测试寄存器),V(ModR/M字节的REG部分指示一个128位XMM寄存器),W(ModR/M字节指示的操作数是一个128位XMM寄存器或一个内存地址),X(内存地址由DS:SI寄存器对表示),Y(内存地址由ES:DI寄存器对表示);操作数类型主要有b(字节),d(双字节),w(字),v(字或双字,根据操作数大小定)。 
    3、现在就可以根据下面的两个表来进行机器码识别了。例如,如果二进制序列是0x03,0x70,0xe8,则操作码是0x03,查指令表Table A-2是"add Gv,Ev",第2个字节0x70是ModR/M字节,二进制是01110000,则Mod部分是1,REG部分是6,R/M部分是0,查ModR/M字节表Table 2-2得到Gv操作数是esi,Ev操作数是[eax+disp8],disp8是8位的偏移量,则读下一个字节0xe8,由于这个字节是负数,取相反值是0x18,则Ev操作数是[eax-0x18],所以输出的最终指令是"add esi,[eax-0x18]"。
                      16bit ModR/M
                      32bit ModR/M
    4、扩展指令
    除了单字节指令和二字节指令外还有一部分指令是三字节的,这些指令称作扩展指令,扩展指令是把ModR/M字节当作操作码的一部分,根据指令属于的不同group和REG部分的值来查Intel Manual中表Table A-4翻译指令的,如操作码为0x80-0x83的指令就是属于group 1,然后根据REG的值来确定操作码的字符串,如REG为5则是"sub"指令。
    5、浮点数指令
    浮点数指令又叫逃逸码指令(escape opcode instructions。它是主操作码为0xd8-0xdf的指令,并且用这个主操作码分成几组,每组指令中又根据ModR/M字节的值分成值在0x00-0xbf范围中和不在这个范围中两部分,在这个范围中的指令根据ModR/M字节字节中的REG部分进行索引,得到相应的指令;不在这个范围中的指令则按照ModR/M字节的值查找相应的表得到指令,ModR/M字节中的高4位是行号,低4位是列号。


相关文章:
  • » x86结构机器码识别及其反汇编

http://chatgpt.dhexx.cn/article/uDNW01Bx.shtml

相关文章

2222222222222

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

2222

markdown编辑器被很多人声称是可以取代word的文字编辑器,其优点我们在这就不再过多赘述了,但对于一些初次接触的人来说,或多或少都有还些不适应,其主要原因在于一些常见的功能突然不知道怎么实现,所以,这篇…

练习2222222

将整数转换为相应的一个字符数组。 分析&#xff1a;从个位提取数字&#xff0c;组合字符 符号位的处理 12345>“12345” 查找介于n1与n2&#xff08;0<n1<n2<32768&#xff09;之间所有满足下列条件的整数&#xff1a;(1)该数的十进制表示中有且仅有两个相同的数…

MyCat分片规则之ASCII码取模范围分片

一、简介 上一篇文章介绍了如何在MyCat中实现取模范围分片&#xff0c;其实还有一个分片方式与它很相似&#xff0c;那就是本节讲解的ASCII码取模范围分片。 实现方式&#xff1a;与取模范围算法类似&#xff0c;支持数值、符号、字母取模。根据配置的分片字段&#xff0c;截…

pandorabox php7,新路由3newifi D2专用潘多拉PandoraBox固件SFE快速转发超强信号不掉速eeprom...

今天就分享一个这次给新路由3(newifi3) PandoraBox 潘多拉固件下载刷的第三方固件潘多拉PandoraBox固件 PandoraBox是什么?PandoraBox 是基于LEDE/OpenWrt框架高度定制的中文本地化固件,应用层与OpenWrt高度兼容,但内核相关部分与OpenWrt/LEDE不同。 以前按照这个方案改了eep…

亲测可用小米刷旧版开发版固件,刷入华硕、潘多拉固件

准备 小米路由器青春版 *1、网线 *1、电脑 *1 准备文件&#xff1a;小米路由器青春版刷机.zip 最主要的还是小米路由器青春版的老版开发版固件 刷入开发版ROM 解压提供的压缩包 登录你的小米路由器&#xff08;192.168.31.1&#xff09; 然后选择升级系统、手动升级选择“…

已刷高格固件的路由器如何更换为潘多拉固件

此方法适用于从任意固件改刷其他插件 方法步骤&#xff1a; 第一步 进入breed模式 拨电-按住reset键-插电-&#xff08;看到电源灯连闪松开reset键一般通电3~5秒即可&#xff09; 第二步 电脑插网线到LAN口-打开浏览器-清理缓存-输入网址&#xff1a;192.168.1.1&#xff0…

小米mini路由器刷breed不死鸟和潘多拉固件

前言 开启小米路由器ssh, 这一步浪费我很长时间&#xff0c;因为目前的开发版都对ssh升级进行了md5校验&#xff0c;导致官方升级方法总是失败&#xff0c;所以换成老版本的 路由器固件就行了。 步骤 下载 0.4.36 mini路由器开发版固件 地址, 然后直接在路由器后台管理的web…

极路由HC5661a刷潘多拉固件后配置python环境运行脚本登陆dr.com校园网

极路由hc5661a刷openwrt并配置python&#xff0c;本文是网上搜索的方法经过本人亲测可用于hc5651的方法&#xff0c;非原创 提前先说&#xff0c;如果之前没有刷路由器刷openwrt经验的&#xff0c;看教程自己进行配置仍然会遇到许多问题耗费许多时间&#xff08;比如我&#x…

潘多拉 搭建 php服务器,OpenWrt/LEDE/潘多拉固件4G网卡上网之【HiLink模式上网教程】...

OpenWrt/LEDE/潘多拉固件4G网卡上网之【HiLink模式上网教程】 时间&#xff1a;2019-07-21 16:38:33 / 来源&#xff1a;你好多多DIY / 作者&#xff1a;多多 本教程以多多本店的OPENWRT 4G网卡路由器和华为4G网卡为例&#xff0c;其他固件和网卡可能会有少许不同&#xff0c;非…

优酷路由宝刷潘多拉固件最详细教程+最新版+赚钱插件

我的优酷路由器是最新版的固件,所以刷机钱要回滚版本。 1,首先把浏览器(360浏览器调成兼容模式) 2、先刷固件 luyoubao_818_downgrade.bin 链接:http://pan.baidu.com/s/1kVoDF2f 密码:6524 登陆后台 http://192.128.11.1 在 更多设置—系统升级—手动升级—上传固件。然后…

小米路由3刷华硕潘多拉固件教程及软件相关

前言 当初为了方便前后入手了两个小米路由3&#xff0c;刚开始没有注意&#xff0c;以为是网络问题&#xff0c;后来升级了50M宽带&#xff0c;时间一长毛病越来越明显&#xff0c;首先是5G的问题&#xff0c;经常搜索不到&#xff0c;然后就把2.4G与5G合并了&#xff0c;然后…

潘多拉路由器php,Padavan潘多拉固件ap模式openwrt固件应该如何设置有线AP模式

如上图&#xff0c;家里有一个闲置的路由器刷的是潘多拉固件&#xff0c;最近就想把这个闲置的路由器利用起来&#xff0c;接到软路由下面做一个纯AP使用。但是到设置的时候就犯难了。 上图那么多选项不知道选那个&#xff0c;还有都有什么区别。 潘多拉固件&#xff0c;做纯AP…

小米路由器mini 刷潘多拉固件教程

自己的小米路由器mini想安装各种各样的插件&#xff0c;实现远程下载&#xff0c;免广告&#xff0c;SS&#xff0c;多拨各种各样的功能。但是自带的路由器固件不支持这些功能&#xff0c;只能自己动手刷个其他固件。具体刷机教程如下&#xff0c;楼主已经成功刷入固件&#xf…

小米路由器3潘多拉固件刷机教程

小米路由器的官方固件优化不够好&#xff0c;很多人都出现限速、断流的现象。我之前也出现过限速的情况&#xff0c;最后没办法只能设置路由器定时重启。前几天突发奇想把定时重启关了&#xff0c;发现路由器居然连着好几天都没啥问题&#xff0c;我以为从此以后就能安心用了&a…

pandora固件运行c语言,潘多拉固件设置单线多播教程

由于小编手懒&#xff0c;就直接在网上找了教程&#xff0c;在这里转载过来。 1、进入路由管理界面后点击左侧的“接口”&#xff0c;选择“WAN”。 2、点击“协议”选项栏里的“DHCP客户端”改为“PPPoE”,点击“切换协议”。 3、在“PAP/CHAP用户名”输入你宽带的用户名&…

pandorabox 潘多拉固件路由器作为无线打印机服务器记录

为了省下无线打印机服务器的一两百元&#xff0c;我开始了路由器的折腾之旅 首先我想到了最熟悉老毛子固件&#xff0c;老毛子固件里确实有打印机选项&#xff0c;而且提供了下载print.exe的网址&#xff0c;我兴高采烈的下载下来&#xff0c;试用之后却发现极其不稳定&#xf…

async和await的作用

词法定义 async async 是“异步”的简写&#xff0c; async 用于申明一个异步的 function await await 可以认为是 async wait 的简写&#xff0c;await 用于等待一个异步方法执行完成。 特点&#xff1a; asayc的用法&#xff0c;它作为一个关键字放到函数前面&#xff0c…

Vue中async和await的使用

在使用vue中如果返回的值是一个Promise对象&#xff0c;那我们就可以用async和await简化这段代码 async是作为一个关键词放在函数的最前面&#xff0c;而await是放在async函数里面的&#xff0c;async表示这个函数是异步的&#xff0c;await是等待的意思&#xff0c;它的后面我…

async与await

1.基本概念:async await号称异步的终极解决方案&#xff0c;async await之后再无回调. 2.基本使用: async用于修饰一个函数, 表示一个函数是异步的. 如果async函数内没有await, 那么async没有意义的, 全是同步的内容. 只有遇到了await开始往下, 才是异步的开始. 我们用代码…