- 论坛徽章:
- 3
|
本帖最后由 hanxin83 于 2015-09-18 11:55 编辑
又跟过来劝楼主不要研究这个的......啊, 不对, 是来回复一下的.- 1)
- adc cx, 0x3 83 D1 03
- adc cx, 0x83 81 D1 83 00
- 2)
- adc ecx, 0x3 66 83 D1 03
- adc ecx, 0x83 66 81 D1 83 00 00 00
复制代码 这个需要对照指令集看的. 参见Opcode Map, 以你的adc cx, 0x83 81 D1 83 00 为例
解出81, 不是前缀, 看一下
81对应的地方, 是个比较特殊的东东, 要用mod r/m字段扩展的, 我们找到它
意思说, 你去看3,4,5这三个位, 根据这个区分不同的协议, D1的那三位是010, 所以是ADC指令.
Ev, Iz啥意思? 咱解读一下
E A ModR/M byte follows the opcode and specifies the operand. The operand is either a general-purpose
register or a memory address. If it is a memory address, the address is computed from a segment register
and any of the following values: a base register, an index register, a scaling factor, a displacement.
v Word, doubleword or quadword (in 64-bit mode), depending on operand-size attribute.
Iz就不贴资料了, 显然是指可变长度的立即数, 默认是16, 没有66前缀, 所以立即数是16位的.
得出源操作数是16位的立即数.
目标操作数, Ev解释起来就是: 这条指令后面有一个mod r/m字节, 表示操作数是寄存器或内存寻址, D1, mod字段为11, 表示寄存器.
r/m字段里取是哪个寄存器了....1表示cx.
16位立即数的ADC, 目标是cx, 自然就是adc cx, 立即数了, 去后面取两位就是0300咯.
至于上面反问的为何不是.....根据前缀和指令就知道立即数尺寸了.
那个83 D1 03的呢? 83指令直接指明是Ev, Ib, 直接说明是byte的立即数了.
66 83 D1 03呢, 66是操作数尺寸前缀, 表明是32位的, 即ecx了, 而83仍然是Ib, 还是一个字节的立即数.
以此类推..... |
|