免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
3
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00程序设计版块每日发帖之星
日期:2016-06-22 06:20:00程序设计版块每日发帖之星
日期:2016-06-28 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-09-18 09:24 |只看该作者 |倒序浏览
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
3
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00程序设计版块每日发帖之星
日期:2016-06-22 06:20:00程序设计版块每日发帖之星
日期:2016-06-28 06:20:00
2 [报告]
发表于 2015-09-18 09:39 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
3 [报告]
发表于 2015-09-18 09:55 |只看该作者
你需要了解什么?
这里的opcode不过是一种编码格式而已,从前面的编码信息就可以推出一条指令的长度以及各段意义。
我之前已经举了个例子,如何知道printf的参数个数了,类比啊。
我找了个,你看看以下的
http://bbs.pediy.com/showthread.php?p=1291221

论坛徽章:
3
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00程序设计版块每日发帖之星
日期:2016-06-22 06:20:00程序设计版块每日发帖之星
日期:2016-06-28 06:20:00
4 [报告]
发表于 2015-09-18 10:13 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:032015年亚洲杯之中国
日期:2015-04-22 15:52:45
5 [报告]
发表于 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, 下载次数: 86)

111111.png

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
6 [报告]
发表于 2015-09-18 12:07 |只看该作者
83 D1 03

83说明是单字节opcode, 查找intel文档2c的附录表格A-2,第8行第3列,内容是Immediate Grp 1(1A),Ev,Ib
Ev是说,后续的ModR/M会说明操作数是寄存器还是内存(及其寻址方式);
Ib是说,单字节的立即数操作数;
1A是说,具体的指令,根据ModR/M的bit3~5,去指令组1中查找。

D1是ModR/M, D1=1101_0001=11-010-001:
* Reg/OpCode=010=2,查表A-6,指令组1的2号指令是ADC
* Mod=3, R/M=1,参考文档2a的表2-2,Mod=3说明操作数是寄存器,R/M=1说明是cx

ModR/M的值同时也表明,后面没有SIB和Displacement(参考2a的Table 2-2)
因此03是立即数

综上,命令是adc $03, %cx

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:15程序设计版块每日发帖之星
日期:2015-09-21 06:20:002015亚冠之卡尔希纳萨夫
日期:2015-09-22 14:11:11程序设计版块每日发帖之星
日期:2015-09-25 06:20:00每日论坛发贴之星
日期:2015-09-25 06:20:00
7 [报告]
发表于 2015-09-22 18:43 |只看该作者
都开始研究机器码了

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
8 [报告]
发表于 2015-09-22 22:54 |只看该作者
回复 1# keymirage

adc cx, 0x3        83 D1 03->  sign-extended imm8 to r/m16 (03 00)
adc cx, ??          83 D1 83 ->  sign-extended imm8 to r/m16 (83 FF)
It will be "adc cx, 0xFF83"

adc cx, 0x83        81 D1 83 00
   

http://x86.renejeschke.de/html/file_module_x86_id_4.html
81 /2 iw         ADC r/m16, imm16         Add with carry imm16 to r/m16
83 /2 ib         ADC r/m16, imm8         Add with CF sign-extended imm8 to r/m16

论坛徽章:
3
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00程序设计版块每日发帖之星
日期:2016-06-22 06:20:00程序设计版块每日发帖之星
日期:2016-06-28 06:20:00
9 [报告]
发表于 2015-10-07 15:09 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
3
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00程序设计版块每日发帖之星
日期:2016-06-22 06:20:00程序设计版块每日发帖之星
日期:2016-06-28 06:20:00
10 [报告]
发表于 2015-10-07 15:10 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP