NASM源代码分析--预处理数据结构
我是在读研究生,09年毕业,以前看过部分Linux源代码和BSD的TCP/IP协议,因为没有太全的资料,所以只看了比较重要的部分,没有看全。虽然看源代码是学编程最快捷的方法,但不得不承认看别人的代码有时候是一种煎药,特别是在没有详细的说明和注释的情况下。
由于之前用过一段时间的NASM用来编写一个小病毒,所以才有了看NASM源代码的想法。不过刚开始看NASM源代码的时候,确实有过一段低潮,因为除了源代码,就没有其他中文资料了,还好它的注释写得还是比较详细的。看完之后想留下点什么,所以就有了下面这些学习笔记,希望能给那些看NASM源代码的朋友一点帮助。
我是各学理科的,所以文笔不是很好,请大家谅解。当然这些记录肯定也有不对的地方,欢迎大家和我交流探讨,我的E-MAIL:huguozhu@gmail.com或huguozhu@sohu.com,谢谢大家。
本文是对前几篇文章的合计,没有新内容,预处理所有重要的数据结构都在这里了。
NASM源代码分析之预处理(1)
NASM源代码的整体框架,互联网上已经有资料介绍了,具体的大家可以参见《NASM源码阅读笔记》一文。
NASM编译源代码的时候,分为三种情况,分别是:
(1):只产生文件依赖关系(operating_mode = op_depend);
(2):只进行预处理(operating_mode = op_preprocess);
(3):预处理并生成目标代码(operating_mode = op_normal)。
第一种情况比较简单,代码量也比较少,很容易就看明白。第二种情况比第一种要难很多,而且涉及的数据结构也很多,刚开始看的时候很容易就看晕了。所以本人根据近段时间以来看代码的体会,总结了下面的内容,希望能给那些看NASM代码的朋友一些帮助。这也是我第一次用这种方式写下我的总结,肯定有不全,甚至时错误的地方,欢迎大家批评指正。我的QQ:79943558。
preprocess.c是处理预处理的最主要的文件,里面包括了几乎全部关于预处理的内容。其中最基本的结构是Token结构,代码如下:
struct Token
{
Token *next;
char *text; // 代表的Token内容,如"if","("
SMacro *mac; // 当指向的类型为TOK_SMAC_END有效
int type; // Token类型
};