陈剖建NASM源代码分析之预处理(1)交博汇
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类型
};
Token在《编译原理》(龙书中⽂版P18-第8⾏)中的定义是:在⼀个产⽣式中,像if和括号这样的词法元素称为记号(token)。
在NASM中,token指代的就是源程序中最⼩的元素。
其中,type的类型包括有:
enum
{
TOK_WHITESPACE = 1, // 空格
TOK_COMMENT, // 注释
TOK_ID, // 变量名,如语句:count dd 0x13, count即为TOK_ID
TOK_PREPROC_ID, // 预处理名,以形如 %1或% 1或%{...},
TOK_STRING, // 以单引号('')或双引号("")包括的字符(串)
TOK_NUMBER, // 数字
TOK_SMAC_END, // 单⾏宏结束
TOK_OTHER, // >>, <<, >=, %%, &&, !=,<>或逗号,句号等
TOK_SMAC_PARAM, // 宏参数
贝克曼梁TOK_INTERNAL_STRING // 于TOK_STRING类似,只是没有引号
};pdh
当NASM对源⽂件进⾏预处理时,先将之Token化,Token化函数为preprocess.c/tokenise(char *line)。
例如语句:inc al;
经过tokenise处理之后分为四个token元素,分别为: 1 inc, 2 空格,3 al, 4; 。
持续更新中......三苯基氢氧化锡