高级语言程序的汇编解析
在高级语言中,如C和PASCAL等等,我们不再直接对硬件资源进行操作,而是面向于问题的解决,这主要体现在数据抽象化和程序的结构化。例如我们用变量名来存取数据,而不再关心这个数据究竟在内存的什么地方。这样,对硬件资源的使用方式完全交给了编译器去处理。不过,一些基本的规则还是存在的,而且大多数编译器都遵循一些规范,这使得我们在阅读反汇编代码的时候日子好过一点。这里主要讲讲汇编代码中一些和高级语言对应的地方。
1. 普通变量。通常声明的变量是存放在内存中的。编译器把变量名和一个内存地址联系起来(这里要注意的是,所谓的“确定的地址”是对编译器而言在编译阶段算出的一个临时的地址。在连接成可执行文件并加载到内存中执行的时候要进行重定位等一系列调整,才生成一个实时的内存地址,不过这并不影响程序的逻辑,所以先不必太在意这些细节,只要知道所有的函数名字和变量名字都对应一个内存的地址就行了),所以变量名在汇编代码中就表现为一个有效地址,就是放在方括号中的操作数。例如,在C文件中声明:
int my_age;
这个整型的变量就存在一个特定的内存位置。语句 my_age= 32; 在反汇编代码中可能表现为:
mov word ptr [007E85DA], 20
所以在方括号中的有效地址对应的是变量名。又如:
char my_name[11] = "lianzi2000";
这样的说明也确定了一个地址,对应于my_name. 假设地址是007E85DC,则内存中[007E85DC]=’l’,[007E85DD]=’i’, etc. 对my_name的访问也就是对这地址处的数据访问。
指针变量其本身也同样对应一个地址,因为它本身也是一个变量。如:
char *your_name;
这时也确定变量"your_name"对应一个内存地址,假设为007E85F0. 语句your_name=my_name;很可能表现为:
mov [007E85F0], 007E85DC ;your_name的内容是my_name的地址。
2. 寄存器变量