吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1170|回复: 8
收起左侧

[求助] 一个指令反汇编的问题?

[复制链接]
女萝岩 发表于 2020-2-5 21:17
本帖最后由 女萝岩 于 2020-2-5 21:21 编辑

00441582  |.  8378 18 00    cmp     dword ptr [eax+18], 083781800被翻译成了cmp dword ptr[eax+18],0
我查看intel指令手册发现,觉得应该被翻译成cmp byte ptr[eax+18],0
理由如下:首先83是一个opcode查看one-byte opcode表
image.png
是Immidiate Group 1组,格式是Eb,Ib,意思是目的操作数是Eb格式的,源操作数是Ib格式的,Eb是啥意思呢?Ib是啥意思呢?先不用管,下面会解释。先看Immidiate Group 1是啥意思.在指令手册中找到这样一段话 image.png
意思是说有些one-byte opcode和two-byte opcode并不代表一条指令,而是代表一组指令,具体看“Opcode Extensions For One- And Two-byte Opcodes ”这一节。
image.png
具体是怎么扩展的呢?就是说one-byte opcode后面紧跟着的是一个MODR/M字节这个字节原来的结果是MOD域占第7、 6 BITREG/OPCODE域占第5 、4、 3BITR/M域占第2 、1、 0 BIT
REG/OPCODE域大多数情况下是用来编码一个操作数的,也可以用来编码OPCODE
回到8378180083是一个opcode,后面的0x78是MODR/M字节0x78化为二进制是0111 1000转化为MODR/M格式是01 111 000所以REG/OPCODE域是111所以83和这个111共同决定了对应的指令是CMP
也就是说被翻译成CMP Eb,IbEb是又两部分构成的,E和b,同理Ib是I和b


指令手册中关于E的说明是这样的:E  A ModR/M byte follows the opcode and specifies the operand. The operand is either ageneral-purpose register or a memory address. If it is a memory address, the address iscomputed from a segment register and any of the following values: a base register, anindex register, a scaling factor, a displacement.意思是说再opcode后面跟着ModR/M字节,这个字节决定了操作数类型,可以是通用寄存器也可以是一个由其它寄存器的表达式构成的一个内存地址。
指令手册中关于b的说明是这样的:b Byte, regardless of operand-size attributeb的意思就是一个字节,无论操作数是多少位的。
指令手册中关于I的说明是这样的:I Immediate data. The operand value is encoded in subsequent bytes of the instruction.意思是说I是表示立即数,这个立即数就在指令字节中就能找到。
所以CMP Eb,Ib中Eb的意思就是目的操作数无论是多少位的,比如用ebx这个32位寄存器寻址,最后也只取一个byte,我就是这里困惑,不知道我理解错了没。Ib是一个字节的立即数。
又因为MODR/M字节是MOD域占第7、 6 BITREG/OPCODE域占第5 、4、 3BITR/M域占第2 、1、 0 BIT
且MODR/M的当前值是 01 111 000查询一下MODR/M表
image.png
是disp8[eax],意思是eax要加上一个偏移值,那么83781800中的0x18就是偏移,最后的00就是立即数
所以最后被翻译成这样才对cmp byte ptr[eax+18],0
但是我看OD和IDA中的结果都是cmp dword ptr[eax+18],0
我哪里理解错了吗?好几天了,非常困惑。



发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

不苦小和尚 发表于 2020-2-5 22:20
楼主看的哪个手册呀,能不能分享一下
无闻无问 发表于 2020-2-5 22:36
看不懂英文,光看指令:如果地址要取byte,寄存器就不是eax,而是al,或ah吧
不苦小和尚 发表于 2020-2-5 22:53
E        操作数是REG/MEM        由ModRM的R/M提供寻址
G        操作数是REG        由ModRM的REG提供寻址
I        操作数是IMM        立即数体现在OPCode中
M        操作数是MEM        由ModRM的R/M提供寻址,且MOD!=11b



这里的Gb的大些“G"代表的是操作数的类型,例如 G代表REG

这里的Gb第小写“b”代表的是此操作数的 大小,例如b代表Byte

这里的Eb表示 操作数是寄存器或MAM,大小一个字节,Ib就代表一个字节的立即数
 楼主| 女萝岩 发表于 2020-2-6 10:32
不苦小和尚 发表于 2020-2-5 22:20
楼主看的哪个手册呀,能不能分享一下

Intel Architecture
Software Developer’s
Manual
Volume 2:
Instruction Set Reference

 楼主| 女萝岩 发表于 2020-2-6 10:54
无闻无问 发表于 2020-2-5 22:36
看不懂英文,光看指令:如果地址要取byte,寄存器就不是eax,而是al,或ah吧

我不知道你的意思我理解的对不对。
经过测试发现两种方式都是可以的。
0042B8FE      8078 18 00    cmp     byte ptr [eax+18], 0

0042B8FE      8378 18 00    cmp     dword ptr [eax+18], 0


 楼主| 女萝岩 发表于 2020-2-6 11:03
不苦小和尚 发表于 2020-2-5 22:53
E        操作数是REG/MEM        由ModRM的R/M提供寻址
G        操作数是REG        由ModRM的REG提供寻 ...

恩,对我有帮助,我似乎有了新思路,我再看看。
不苦小和尚 发表于 2020-2-6 12:51
Ib的意识是 不管操作数大小属性如何,内容只占一个字节
不苦小和尚 发表于 2020-2-6 14:27
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 12:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表