预处理过程
switch ( operating_mode )
{
case op_depend:
...
break;
case op_preprocess:
{
char *line; // getline()返回值
char *file_name = NULL; // 用于函数src_get()
long prior_linnum=0; // prior_linnum->以前已经处理的行数;
int lineinc=0; // 本次处理的行数
if (*outname) // outname输出文件,有参数 -o 指定
{
ofile = fopen(outname, "w"); // 打开输出文件,权限为“写”
if (!ofile) // 不能打开输出文件,报错并退出
report_error (ERR_FATAL | ERR_NOFILE,"unable to open output file `%s'", outname);
}
else
ofile = NULL;
// 当前汇编代码的位置,包括代码所在段和段偏移,known表示是否清楚当前代码的段和偏移
location.known = FALSE;
// 为预处理初始化各个变量,实际运行的函数是pp_reset()(具体讨论)
preproc->reset (inname, 2, report_error, evaluate, &nasmlist);
while ( (line = preproc->getline()) ) // 从源程序获取一行代码并处理(具体讨论)
{
// linnum->当前已经处理的行数; prior_linnum->以前已经处理的行数; lineinc->本次处理的行数
long linnum = prior_linnum += lineinc;
int altline = src_get(&linnum, &file_name);
if (altline)
{
if (altline==1 && lineinc==1)
nasm_fputs("", ofile);
else
{
lineinc = (altline != -1 || lineinc!=1);
fprintf(ofile ? ofile : stdout, "%%line %ld+%d %s/n",
linnum, lineinc, file_name);
}
prior_linnum = linnum;
}
nasm_fputs(line, ofile); // 将预处理后的该行代码输出到输出文件中。
nasm_free (line);
}
nasm_free(file_name);
preproc->cleanup(); // 预处理完成,清理内存
if (ofile)
fclose(ofile);
if (ofile && terminate_after_phase)
remove(outname);
}
break;
case op_normal:
...
break;
}
static void pp_reset (char *file, int apass, efunc errfunc, evalfunc eval,
ListGen *listgen)
{
int h;
er