通过汇编语言了解程序的实际构成
1.汇编语言和本地代码是一一对应的
即使是用汇编语言编写的源代码, 最终也必须要转换成本地代码才能运行。 负责转换工作的程序称为汇编器, 转换这一处理本身称为汇编。 在将源代码转换成本地代码这个功能方面, 汇编器和编译器是同样的。用汇编语言编写的源代码, 和本地代码是一一对应的。因而,本地代码也可 以反过来转换成汇编语言的源代码。 持有该功能的逆变换程序称为反汇编程序, 逆变换这一处理本身称为反汇编
哪怕是用C语言编写的源代码,编译后也会 转换成特定CPU用的本地代码。 而将其反汇编的话, 就可以得到汇编语言的源代码, 并对其内容进行调查。不过,本地代码变换成 C语言源代码的反编译, 则要比反汇编 困难。这是因为, C语言的源代码同本地代码不是一一对应的,因此完全还原到原始的源代码是不太可能的
2.不会转换成本地代码的伪指令
汇编语言的源代码, 是由转换成本地代码的指令( 后面讲述的操作码)和针对汇编器的伪指令构成的。 伪指令负责把程序的构造及汇编的方法指示给汇编器(转换程序)。 不过伪指令本身是无法汇编转换成本地代码的。这里我们把代码清单 10-2中用到的伪指令部分摘出。
由伪指令segment和ends围起来的部分, 是给构成程序的命令和数据的集合体加上一个名字而得到的, 称为段定义 ①。 段定义的英文表达segment具有“区域”的意思。在程序中, 段定义指 的是命令和数据等程序的集合体的意思。 一个程序由多个段定义构成。
3.寄存器是CPU中的存储区域。 不过,寄存器并不仅仅具有存储指令和数据的功能,也有运算功能。 寄存器的名称会通过汇编语言的源代码指定给操作数。 内存中的存储区域是用地址编号来区分的。 CPU内的寄存器是用eax及ebx这些名称来区分的。此外, CPU内部也有程序员无法直接操作的寄存器。例如, 表示运算结果正负及溢出状态的标志寄存器及操作系统专用的寄存器等, 都无法通过程序员编写的程序直接进行操作。