Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1320795
  • 博文数量: 179
  • 博客积分: 4141
  • 博客等级: 中将
  • 技术积分: 2083
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-21 20:04
文章存档

2024年(1)

2019年(13)

2016年(1)

2014年(16)

2011年(8)

2010年(25)

2009年(115)

分类:

2009-03-22 11:03:23

Nasm源代码解析  表达式计算

        介绍表达式计算

功能模块:

1. expr功能模块:

算法简介:

现将实例放入tempexpr,然后再将tempexpr统一放入tempexprs中(本质上仅仅操作指针就可以了)。

2. 计算表达式算法简要介绍

注:由于这部分较为简单,我们只做简单介绍

/*

 * Grammar parsed is:

 *

 * expr  : bexpr [ WRT expr6 ]

 * bexpr : rexp0 or expr0 depending on relative-mode setting

 * rexp0 : rexp1 [ {||} rexp1...]

 * rexp1 : rexp2 [ {^^} rexp2...]

 * rexp2 : rexp3 [ {&&} rexp3...]

 * rexp3 : expr0 [ {=,==,<>,!=,<,>,<=,>=} expr0 ]

 * expr0 : expr1 [ {|} expr1...]

 * expr1 : expr2 [ {^} expr2...]

 * expr2 : expr3 [ {&} expr3...]

 * expr3 : expr4 [ {<<,>>} expr4...]

 * expr4 : expr5 [ {+,-} expr5...]

 * expr5 : expr6 [ {*,/,%,//,%%} expr6...]

 * expr6 : { ~,+,-,SEG } expr6

 *       | (bexpr)

 *       | symbol

 *       | $

 *       | number

 */

这些运算符号均有优先级别,而Nasm是通过递归来实现运算符号优先级的。具体参见代码。

 

代码注释:


/*
 * Unimportant cleanup is done to avoid confusing people who are trying
 * to debug real memory leaks
 */

/*
 * 释放 tempexprs 空间
 */

void eval_cleanup(void)
{
    while (ntempexprs)
        nasm_free(tempexprs[--ntempexprs]);
    nasm_free(tempexprs);
}

/*
 * Construct a temporary expression.
 */

static void begintemp(void)
{
    tempexpr = NULL;
    tempexpr_size = ntempexpr = 0;
}

/*
 * 添加 tempexpr 实例
 */

static void addtotemp(long type, long value)
{
    while (ntempexpr >= tempexpr_size)
    {
        tempexpr_size += TEMPEXPR_DELTA;
        tempexpr = nasm_realloc(tempexpr, tempexpr_size * sizeof(*tempexpr));
    }
    tempexpr[ntempexpr].type = type;
    tempexpr[ntempexpr++].value = value;
}

/* 将 tempexpr 作为一个实例添加进 tempexprs */
static expr *finishtemp(void)
{
    addtotemp(0L, 0L); /* terminate */
    while (ntempexprs >= tempexprs_size) {
        tempexprs_size += TEMPEXPRS_DELTA;
        tempexprs = nasm_realloc(tempexprs, tempexprs_size * sizeof(*tempexprs));
    }
    return tempexprs[ntempexprs++] = tempexpr;
}

阅读(2001) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~