免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3721 | 回复: 0
打印 上一主题 下一主题

[其他] 对指令长度不一的实例分析 [复制链接]

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:032015年亚洲杯之中国
日期:2015-04-22 15:52:45
1 [报告]
发表于 2015-09-18 11:47 |显示全部楼层
本帖最后由 hanxin83 于 2015-09-18 11:55 编辑

又跟过来劝楼主不要研究这个的......啊, 不对, 是来回复一下的.
  1. 1)
  2. adc cx, 0x3        83 D1 03     
  3. adc cx, 0x83        81 D1 83 00

  4. 2)
  5. adc ecx, 0x3         66 83 D1 03
  6. 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, 还是一个字节的立即数.


以此类推.....

111111.png (153.57 KB, 下载次数: 87)

111111.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP