首页
社区
课程
招聘
[旧帖] [原创]关于汇编到机器码的部分见解 0.00雪花
发表于: 2013-8-13 10:05 1235

[旧帖] [原创]关于汇编到机器码的部分见解 0.00雪花

2013-8-13 10:05
1235
论坛里的KSSD是有介绍了的
不过
hsly110
我完全没看懂= = 。
不过也谢谢他,没他我真找不到哪有下那什么表的。
yangbostar
这篇解说了
对ax 的操作和对eax的操作的区别(不单指eax,ax,反正就是通用寄存器,后文也就这么说了)
在此感谢他为我引路
但他还没解说al这类的
本来我想来本论坛问问的,结果没人回答,自己昨天研究了3个小时,总算有点头绪了。

add cl,1
在指令码表中对应这一段
80    /0 ib  ADD r/m8,imm8           Add
他的代码是
(为了方便,用10进制表示,数学不好,抱歉。)
{128,193,1}
128 为 80H
193
他的数值是由
192+cl的编码值(1)
顺便发下编码值表
           AL = 0 AX = 0 EAX = 0
           CL = 1 CX = 1 ECX = 1
           DL = 2 DX = 2 EDX = 2
           BL = 3 BX = 3 EBX = 3
           AH = 4 SP = 4 ESP = 4
           CH = 5 BP = 5 EBP = 5
           DH = 6 SI = 6 ESI = 6
           BH = 7 DI = 7 EDI = 7
由此可以推得
128,192,1是
add al,1
(实际编译中通常编译为)
04 01
04       ib  ADD AL,imm8             Add  因为这句
再如
add al,cl
这类
在码表中
对应
02    /r     ADD r8,r/m8             ADD
编码变为
{2,193}
cl 同样是192+1
(偏一下题, 192哪来的我也不知道,有大大知道望解说下)

还有这类
add [eax],cl
在码表中对应的是
00    /r     ADD r/m8,r8             ADD
add [eax],cl
对应的结果是
{0,8}
很多人会疑惑,为什么这里会是8?
这个一开始我也困惑了很久,因为
add [eax],al
对应的编码为
{0,0}
但你仔细看码表
           AL = 0 AX = 0 EAX = 0
           CL = 1 CX = 1 ECX = 1
           DL = 2 DX = 2 EDX = 2
           BL = 3 BX = 3 EBX = 3
           AH = 4 SP = 4 ESP = 4
           CH = 5 BP = 5 EBP = 5
           DH = 6 SI = 6 ESI = 6
           BH = 7 DI = 7 EDI = 7
从0到7正好8位数字。
也就是说
这个数是由
操作数如al*8+被操作数[eax]得到的结果
这样一算
add [ecx],al

{0,1}
测试结果的确是
{0,1}

好了,讲解完了,本人也菜鸟一枚,只是对这个有点感兴趣。可能讲的有点乱,请见谅。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//