亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? eval.c

?? 32位匯編編譯器nasm源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* eval.c    expression evaluator for the Netwide Assembler
 *
 * The Netwide Assembler is copyright (C) 1996 Simon Tatham and
 * Julian Hall. All rights reserved. The software is
 * redistributable under the licence given in the file "Licence"
 * distributed in the NASM archive.
 *
 * initial version 27/iii/95 by Simon Tatham
 */

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <ctype.h>

#include "nasm.h"
#include "nasmlib.h"
#include "eval.h"
#include "labels.h"

#define TEMPEXPRS_DELTA 128
#define TEMPEXPR_DELTA 8

static scanner scan;            /* Address of scanner routine */
static efunc error;             /* Address of error reporting routine */
static lfunc labelfunc;         /* Address of label routine */

static struct ofmt *outfmt;     /* Structure of addresses of output routines */

static expr **tempexprs = NULL;
static int ntempexprs;
static int tempexprs_size = 0;

static expr *tempexpr;
static int ntempexpr;
static int tempexpr_size;

static struct tokenval *tokval; /* The current token */
static int i;                   /* The t_type of tokval */

static void *scpriv;
static loc_t *location;         /* Pointer to current line's segment,offset */
static int *opflags;

static struct eval_hints *hint;

extern int in_abs_seg;          /* ABSOLUTE segment flag */
extern long abs_seg;            /* ABSOLUTE segment */
extern long abs_offset;         /* ABSOLUTE segment offset */

/*
 * Unimportant cleanup is done to avoid confusing people who are trying
 * to debug real memory leaks
 */
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;
}

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;
}

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;
}

/*
 * Add two vector datatypes. We have some bizarre behaviour on far-
 * absolute segment types: we preserve them during addition _only_
 * if one of the segments is a truly pure scalar.
 */
static expr *add_vectors(expr * p, expr * q)
{
    int preserve;

    preserve = is_really_simple(p) || is_really_simple(q);

    begintemp();

    while (p->type && q->type &&
           p->type < EXPR_SEGBASE + SEG_ABS &&
           q->type < EXPR_SEGBASE + SEG_ABS) {
        int lasttype;

        if (p->type > q->type) {
            addtotemp(q->type, q->value);
            lasttype = q++->type;
        } else if (p->type < q->type) {
            addtotemp(p->type, p->value);
            lasttype = p++->type;
        } else {                /* *p and *q have same type */
            long sum = p->value + q->value;
            if (sum)
                addtotemp(p->type, sum);
            lasttype = p->type;
            p++, q++;
        }
        if (lasttype == EXPR_UNKNOWN) {
            return finishtemp();
        }
    }
    while (p->type && (preserve || p->type < EXPR_SEGBASE + SEG_ABS)) {
        addtotemp(p->type, p->value);
        p++;
    }
    while (q->type && (preserve || q->type < EXPR_SEGBASE + SEG_ABS)) {
        addtotemp(q->type, q->value);
        q++;
    }

    return finishtemp();
}

/*
 * Multiply a vector by a scalar. Strip far-absolute segment part
 * if present.
 *
 * Explicit treatment of UNKNOWN is not required in this routine,
 * since it will silently do the Right Thing anyway.
 *
 * If `affect_hints' is set, we also change the hint type to
 * NOTBASE if a MAKEBASE hint points at a register being
 * multiplied. This allows [eax*1+ebx] to hint EBX rather than EAX
 * as the base register.
 */
static expr *scalar_mult(expr * vect, long scalar, int affect_hints)
{
    expr *p = vect;

    while (p->type && p->type < EXPR_SEGBASE + SEG_ABS) {
        p->value = scalar * (p->value);
        if (hint && hint->type == EAH_MAKEBASE &&
            p->type == hint->base && affect_hints)
            hint->type = EAH_NOTBASE;
        p++;
    }
    p->type = 0;

    return vect;
}

static expr *scalarvect(long scalar)
{
    begintemp();
    addtotemp(EXPR_SIMPLE, scalar);
    return finishtemp();
}

static expr *unknown_expr(void)
{
    begintemp();
    addtotemp(EXPR_UNKNOWN, 1L);
    return finishtemp();
}

/*
 * The SEG operator: calculate the segment part of a relocatable
 * value. Return NULL, as usual, if an error occurs. Report the
 * error too.
 */
static expr *segment_part(expr * e)
{
    long seg;

    if (is_unknown(e))
        return unknown_expr();

    if (!is_reloc(e)) {
        error(ERR_NONFATAL, "cannot apply SEG to a non-relocatable value");
        return NULL;
    }

    seg = reloc_seg(e);
    if (seg == NO_SEG) {
        error(ERR_NONFATAL, "cannot apply SEG to a non-relocatable value");
        return NULL;
    } else if (seg & SEG_ABS) {
        return scalarvect(seg & ~SEG_ABS);
    } else if (seg & 1) {
        error(ERR_NONFATAL, "SEG applied to something which"
              " is already a segment base");
        return NULL;
    } else {
        long base = outfmt->segbase(seg + 1);

        begintemp();
        addtotemp((base == NO_SEG ? EXPR_UNKNOWN : EXPR_SEGBASE + base),
                  1L);
        return finishtemp();
    }
}

/*
 * Recursive-descent parser. Called with a single boolean operand,
 * which is TRUE if the evaluation is critical (i.e. unresolved
 * symbols are an error condition). Must update the global `i' to
 * reflect the token after the parsed string. May return NULL.
 *
 * evaluate() should report its own errors: on return it is assumed
 * that if NULL has been returned, the error has already been
 * reported.
 */

/*
 * 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
 */

static expr *rexp0(int), *rexp1(int), *rexp2(int), *rexp3(int);

static expr *expr0(int), *expr1(int), *expr2(int), *expr3(int);
static expr *expr4(int), *expr5(int), *expr6(int);

static expr *(*bexpr) (int);

static expr *rexp0(int critical)
{
    expr *e, *f;

    e = rexp1(critical);
    if (!e)
        return NULL;

    while (i == TOKEN_DBL_OR) {
        i = scan(scpriv, tokval);
        f = rexp1(critical);
        if (!f)
            return NULL;
        if (!(is_simple(e) || is_just_unknown(e)) ||
            !(is_simple(f) || is_just_unknown(f))) {
            error(ERR_NONFATAL, "`|' operator may only be applied to"
                  " scalar values");
        }

        if (is_just_unknown(e) || is_just_unknown(f))
            e = unknown_expr();
        else
            e = scalarvect((long)(reloc_value(e) || reloc_value(f)));
    }
    return e;
}

static expr *rexp1(int critical)
{
    expr *e, *f;

    e = rexp2(critical);
    if (!e)
        return NULL;

    while (i == TOKEN_DBL_XOR) {
        i = scan(scpriv, tokval);
        f = rexp2(critical);
        if (!f)
            return NULL;
        if (!(is_simple(e) || is_just_unknown(e)) ||
            !(is_simple(f) || is_just_unknown(f))) {
            error(ERR_NONFATAL, "`^' operator may only be applied to"
                  " scalar values");
        }

        if (is_just_unknown(e) || is_just_unknown(f))
            e = unknown_expr();
        else
            e = scalarvect((long)(!reloc_value(e) ^ !reloc_value(f)));
    }
    return e;
}

static expr *rexp2(int critical)
{
    expr *e, *f;

    e = rexp3(critical);
    if (!e)
        return NULL;
    while (i == TOKEN_DBL_AND) {
        i = scan(scpriv, tokval);
        f = rexp3(critical);
        if (!f)
            return NULL;
        if (!(is_simple(e) || is_just_unknown(e)) ||
            !(is_simple(f) || is_just_unknown(f))) {
            error(ERR_NONFATAL, "`&' operator may only be applied to"
                  " scalar values");
        }
        if (is_just_unknown(e) || is_just_unknown(f))
            e = unknown_expr();
        else
            e = scalarvect((long)(reloc_value(e) && reloc_value(f)));
    }
    return e;
}

static expr *rexp3(int critical)
{
    expr *e, *f;
    long v;

    e = expr0(critical);
    if (!e)
        return NULL;

    while (i == TOKEN_EQ || i == TOKEN_LT || i == TOKEN_GT ||
           i == TOKEN_NE || i == TOKEN_LE || i == TOKEN_GE) {
        int j = i;
        i = scan(scpriv, tokval);
        f = expr0(critical);
        if (!f)
            return NULL;

        e = add_vectors(e, scalar_mult(f, -1L, FALSE));

        switch (j) {
        case TOKEN_EQ:
        case TOKEN_NE:
            if (is_unknown(e))
                v = -1;         /* means unknown */
            else if (!is_really_simple(e) || reloc_value(e) != 0)
                v = (j == TOKEN_NE);    /* unequal, so return TRUE if NE */
            else
                v = (j == TOKEN_EQ);    /* equal, so return TRUE if EQ */
            break;
        default:
            if (is_unknown(e))
                v = -1;         /* means unknown */
            else if (!is_really_simple(e)) {
                error(ERR_NONFATAL,
                      "`%s': operands differ by a non-scalar",
                      (j == TOKEN_LE ? "<=" : j == TOKEN_LT ? "<" : j ==
                       TOKEN_GE ? ">=" : ">"));
                v = 0;          /* must set it to _something_ */
            } else {
                int vv = reloc_value(e);
                if (vv == 0)
                    v = (j == TOKEN_LE || j == TOKEN_GE);
                else if (vv > 0)
                    v = (j == TOKEN_GE || j == TOKEN_GT);
                else            /* vv < 0 */
                    v = (j == TOKEN_LE || j == TOKEN_LT);
            }
            break;
        }

        if (v == -1)
            e = unknown_expr();
        else
            e = scalarvect(v);
    }
    return e;
}

static expr *expr0(int critical)
{
    expr *e, *f;

    e = expr1(critical);
    if (!e)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人黄色片在线观看| 欧美另类高清zo欧美| 99re热这里只有精品免费视频| 91麻豆6部合集magnet| 欧美一区二区三区视频| 国产精品成人午夜| 日本 国产 欧美色综合| 成人午夜av在线| 91精品国产综合久久久久久久久久| 久久蜜臀精品av| 天天综合天天做天天综合| 成人美女在线观看| 日韩一区二区三| 亚洲综合自拍偷拍| 成人av电影免费在线播放| 日韩一区二区免费在线观看| 一区二区三区成人| 91在线精品一区二区| 久久亚洲二区三区| 视频在线在亚洲| 欧美亚洲自拍偷拍| 国产精品成人一区二区艾草 | 老司机精品视频在线| 91在线精品秘密一区二区| 国产欧美一区二区精品性色| 蜜臀久久99精品久久久画质超高清 | 亚洲一区精品在线| av激情成人网| 国产三级精品视频| 国产一区二区精品久久91| 欧美一卡2卡三卡4卡5免费| 亚洲综合色视频| 色噜噜狠狠成人网p站| 中文字幕中文在线不卡住| 国产精品亚洲一区二区三区在线 | 成人精品免费视频| 久久久久久99精品| 国产在线视频一区二区| 欧美α欧美αv大片| 久久成人综合网| 精品三级在线观看| 国产尤物一区二区| 中文字幕国产一区二区| 粉嫩绯色av一区二区在线观看 | 麻豆国产精品官网| 日韩视频一区二区三区在线播放| 首页欧美精品中文字幕| 日韩一区二区电影在线| 免费成人在线网站| 精品国产免费人成电影在线观看四季 | 欧美美女视频在线观看| 天堂在线亚洲视频| 精品区一区二区| 国产中文字幕精品| 国产欧美日韩综合| 91蜜桃在线免费视频| 亚洲美女淫视频| 欧美日本一道本在线视频| 日本中文字幕一区二区视频 | 一二三四社区欧美黄| 欧美蜜桃一区二区三区| 免费的成人av| 国产欧美日韩卡一| 欧亚一区二区三区| 久草这里只有精品视频| 国产喷白浆一区二区三区| 色综合久久中文综合久久97| 日韩精品视频网| 国产日韩精品一区二区三区| 色哟哟国产精品| 开心九九激情九九欧美日韩精美视频电影| 久久精品一区二区三区不卡| 91看片淫黄大片一级在线观看| 亚洲国产乱码最新视频| 精品国产伦一区二区三区观看体验| av在线不卡电影| 日韩和欧美一区二区| 中文文精品字幕一区二区| 欧美在线free| 国产精品12区| 视频一区欧美精品| 国产精品美女久久久久aⅴ| 欧美色区777第一页| 国产精品18久久久久久久网站| 一区二区三区四区在线免费观看| 精品国产乱码久久久久久牛牛| 91蝌蚪porny九色| 国产99久久久国产精品潘金| 亚洲一区国产视频| 国产精品三级在线观看| 精品欧美一区二区在线观看| 欧美视频中文字幕| 成人一区二区三区中文字幕| 日韩电影一区二区三区| 亚洲视频在线观看三级| 久久久久久久电影| 日韩欧美高清在线| 欧美日韩精品专区| 色狠狠桃花综合| 成人免费视频一区| 狠狠网亚洲精品| 美女视频网站黄色亚洲| 亚洲乱码国产乱码精品精可以看| 久久综合丝袜日本网| 91精品国产乱| 欧美日韩精品一区二区天天拍小说 | 久久综合久久99| 欧美一级电影网站| 欧美一区二视频| 欧美日韩亚洲综合一区 | 欧美日韩成人在线| 色激情天天射综合网| 91最新地址在线播放| 国产91高潮流白浆在线麻豆| 国产美女一区二区| 国产精品66部| 丁香亚洲综合激情啪啪综合| 国产一区二区三区日韩| 国产一区二区三区久久悠悠色av| 美国欧美日韩国产在线播放| 日韩国产成人精品| 婷婷开心激情综合| 日韩激情一二三区| 日韩精品国产精品| 另类调教123区| 韩日精品视频一区| 狠狠色丁香久久婷婷综| 国产一区久久久| 国产麻豆精品95视频| 国产精品亚洲午夜一区二区三区 | 国产欧美日韩久久| 国产精品久久久久久久久免费丝袜 | 精品一区二区免费| 国产一区啦啦啦在线观看| 国产福利一区在线| 91尤物视频在线观看| 精品视频一区二区三区免费| 欧美精品久久99久久在免费线 | 在线观看国产一区二区| 欧美丝袜丝交足nylons图片| 在线不卡一区二区| 精品久久久久久久久久久久久久久 | 亚洲女同女同女同女同女同69| 亚洲图片激情小说| 一区二区三区精品视频| 五月开心婷婷久久| 国产精品一区二区在线播放| 国产**成人网毛片九色| 色综合久久九月婷婷色综合| 欧美高清你懂得| 国产亚洲精品福利| 亚洲精品国产一区二区精华液 | 精品成人一区二区| 日本一区二区三区在线观看| 亚洲人一二三区| 免费三级欧美电影| 成人深夜视频在线观看| 欧洲一区在线电影| 欧美mv日韩mv| 亚洲日本青草视频在线怡红院| 午夜精品一区二区三区电影天堂 | 国产一区二区毛片| 在线中文字幕不卡| 精品国产乱码久久久久久蜜臀| 日本一区二区动态图| 亚洲一区二区三区四区在线| 老色鬼精品视频在线观看播放| 99精品久久久久久| 欧美精品一区二区在线观看| 亚洲最新视频在线观看| 国产精品自在欧美一区| 在线精品视频免费观看| 精品久久久久久综合日本欧美| 亚洲男人的天堂av| 久久国产精品一区二区| 91蝌蚪porny| 国产免费久久精品| 麻豆国产91在线播放| 欧美亚洲愉拍一区二区| 国产精品欧美久久久久一区二区| 日本美女一区二区| 欧美在线制服丝袜| 国产精品国产自产拍高清av王其| 蜜臂av日日欢夜夜爽一区| 91国偷自产一区二区开放时间| 国产丝袜美腿一区二区三区| 日韩专区中文字幕一区二区| 色综合久久中文综合久久牛| 欧美激情一区二区三区全黄| 久久精品噜噜噜成人av农村| 9191精品国产综合久久久久久| 亚洲视频狠狠干| 99国产精品视频免费观看| 久久久不卡影院| 激情综合亚洲精品| 日韩视频123| 日韩电影一二三区| 欧美电影一区二区| 亚洲成人你懂的| 欧美男男青年gay1069videost |