笔记的由来 能上图的咱不废
初次学习16汇编语言(DOS汇编) 第二课硬编码(机器码)
C语言入门水平
16位命令行调试器
计算机硬件的工作原理
汇编语言基础知识
十六进制转换二进制
看一下百度百科即可(不用深入了解)
https://baike.baidu.com/item/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86/7681289?fr=aladdin
汇编语言 即第二代计算机语言(第一代就是机器码)
由于机器码都是0和1难以理解和记忆,所以后来我们使用一些容易理解和记忆的字母,单词来代替一个特定的指令,比如:用ADD代表数字逻辑上的加减,MOV代表数据传递等等,通过这种方法,我们很容易去阅读已经完成的程序或理解程序正在执行的功能,对现有程序的BUG修复以及维护变得更加简单,但是CPU不认识字母符号,这时候就需要一个专门的程序把这些字符变成计算机能够认识的指令(机器码)
把字符变成计算机能够认识的指令,这个过程就是汇编,反之把机器码变成字符的过程叫做反汇编
可以理解为一个功能库
反汇编引擎是很多工具的基础 如:调试器 自动分析工具 自动HOOK( Detours) 等等
首先我们先要了解以下知识并且分析机器码
由于8086真机我已经买不到了 所以我们只能在XP虚拟机中使用模拟的调试器 命令行中输入Debug 即可打开模拟的调试器
我们先看一下反汇编代码和机器码在调试器中的什么位置
输入U命令 查看反汇编
蓝色的部分是地址 红色的部分是机器码 粉红色的部分是反汇编代码
操作码(必要)
由于机器指令太多 无法进行全部分析 本文就以Mov的第一种为例子来进行分析
MOV指令的第一种是 从寄存器到寄存器或者从寄存器到内存或者从内存到寄存器
如何分析:首先我们在Debug通过A命令进行输入汇编代码 然后我们输入MOV指令的第一种的汇编代码 先输入几个从寄存器到寄存器的指令 每个指令都要改变源操作数 输入完成后复制到文本编辑工具里面进行十六进制转换二进制后进行对比 看每一条指令和上一条指令都有什么变化 变化的部分肯定就是源操作数的部分 下面笔者会进行演示
先在Debug里面使用A命令 输入指令MOV目的操作数不变,我们改变源操作数(这样就可以看出源操作数)
然后把圈出来的部分复制出来(拖白点击右键可以复制)
把16进制的机器码转换为2进制
大眼一看我们发现只有这一部分不一样 是不是可以说明这一部分是源操作数
然后我们仔细观察发现 后面6位的前3位表示源操作数 后3位表示目的操作数
因此我们可以得知 AX为000 CX为001 DX为010 BX为011 SP 为100 BP为101 SI为110 DI为111
它们的顺序是 AX CX DX BX SP BP SI DI
我们来验证一下我们分析的对不对
预测MOV SI,DI 的机器码为 1000 1001 1111 1110 十六进制89FE
进行上机验证89FE MOV SI,DI 我们分析的是正确的
接着我们继续分析 这一次我们看一下寄存器8位的和16位的有什么区别
继续输入指令MOV目的操作数不变,我们改变源操作数 把16位寄存器换成8位寄存器 看下图即可
输入完成后 复制黏贴到文件编辑工具上 进行十六到二的转换
转换完成发现8位和16位的操作数部分没有什么区别 还是后面6位的前3位表示目的操作数 后3位表示源操作数
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2021-9-27 00:37
被旺仔_小可爱编辑
,原因: