NASM源代码分析--预处理过程

 

预处理过程
 
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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值