]> granicus.if.org Git - yasm/commitdiff
Integrate expression handling into memory address expressions.
authorMichael Urman <mu@tortall.net>
Fri, 6 Jul 2001 06:25:53 +0000 (06:25 -0000)
committerMichael Urman <mu@tortall.net>
Fri, 6 Jul 2001 06:25:53 +0000 (06:25 -0000)
Consequently change Imm->EA, and update DebugPrintBC (fix segvs too)

svn path=/trunk/yasm/; revision=117

include/bytecode.h
libyasm/bytecode.c
libyasm/bytecode.h
modules/parsers/nasm/bison.y.in
modules/parsers/nasm/nasm-bison.y
src/bison.y.in
src/bytecode.c
src/bytecode.h
src/parsers/nasm/bison.y.in
src/parsers/nasm/nasm-bison.y

index 47deb2c09afdef9f2e7e5db512bc4e0b93c657ef..d7c89f59fada6a0469bc81b6c715691b4f4aa963 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bytecode.h,v 1.11 2001/07/05 08:59:29 mu Exp $
+/* $Id: bytecode.h,v 1.12 2001/07/06 06:25:53 mu Exp $
  * Bytecode utility functions header file
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -23,7 +23,7 @@
 #define YASM_BYTECODE_H
 
 typedef struct effaddr_s {
-    unsigned long disp;                /* address displacement */
+    struct expr_s *disp;       /* address displacement */
     unsigned char len;         /* length of disp (in bytes), 0 if none */
 
     unsigned char segment;     /* segment override, 0 if none */
@@ -86,6 +86,7 @@ typedef struct bytecode_s {
 effaddr *ConvertIntToEA(effaddr *ptr, unsigned long int_val);
 effaddr *ConvertRegToEA(effaddr *ptr, unsigned long reg);
 effaddr *ConvertImmToEA(effaddr *ptr, immval *im_ptr, unsigned char im_len);
+effaddr *ConvertExprToEA(effaddr *ptr, struct expr_s *expr_ptr);
 
 immval *ConvertIntToImm(immval *ptr, unsigned long int_val);
 immval *ConvertExprToImm(immval *ptr, struct expr_s *expr_ptr);
index cec7f61d4ab1a841fa4593d5169872928edf0e6d..a180aed1cfde021c61ed28177c9361871682a6ee 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bytecode.c,v 1.10 2001/07/05 09:32:58 mu Exp $
+/* $Id: bytecode.c,v 1.11 2001/07/06 06:25:53 mu Exp $
  * Bytecode utility functions
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -41,7 +41,8 @@ effaddr *ConvertIntToEA(effaddr *ptr, unsigned long int_val)
     ptr->valid_sib = 0;
     ptr->need_sib = 0;
 
-    ptr->disp = int_val;
+    /* FIXME: this will leak expr's if static is used */
+    ptr->disp = expr_new_ident(EXPR_NUM, ExprNum(int_val));
 
     if((int_val & 0xFF) == int_val)
        ptr->len = 1;
@@ -69,14 +70,29 @@ effaddr *ConvertRegToEA(effaddr *ptr, unsigned long reg)
     return ptr;
 }
 
+effaddr *ConvertExprToEA(effaddr *ptr, expr *expr_ptr)
+{
+    if(!ptr)
+       ptr = &eff_static;
+
+    ptr->segment = 0;
+
+    ptr->valid_modrm = 0;
+    ptr->need_modrm = 1;
+    ptr->valid_sib = 0;
+    ptr->need_sib = 0;
+
+    ptr->disp = expr_ptr;
+
+    return ptr;
+}
+
 effaddr *ConvertImmToEA(effaddr *ptr, immval *im_ptr, unsigned char im_len)
 {
-    int gotexprval;
     if(!ptr)
        ptr = &eff_static;
 
-    /* FIXME: warn when gotexprval is 0, and/or die */
-    gotexprval = expr_get_value (im_ptr->val, &ptr->disp);
+    ptr->disp = im_ptr->val;
     if(im_ptr->len > im_len)
        Warning(WARN_VALUE_EXCEEDS_BOUNDS, (char *)NULL, "word");
     ptr->len = im_len;
@@ -245,7 +261,13 @@ void DebugPrintBC(bytecode *bc)
        case BC_INSN:
            printf("_Instruction_\n");
            printf("Effective Address:\n");
-           printf(" Disp=%lx Len=%u SegmentOv=%2x\n", bc->data.insn.ea.disp,
+           printf(" Disp=");
+           if (!bc->data.insn.ea.disp)
+               printf("(nil)");
+           else
+               expr_print(bc->data.insn.ea.disp);
+           printf("\n");
+           printf (" Len=%u SegmentOv=%2x\n",
                (unsigned int)bc->data.insn.ea.len,
                (unsigned int)bc->data.insn.ea.segment);
            printf(" ModRM=%2x ValidRM=%u NeedRM=%u\n",
@@ -258,7 +280,10 @@ void DebugPrintBC(bytecode *bc)
                (unsigned int)bc->data.insn.ea.need_sib);
            printf("Immediate/Relative Value:\n");
            printf(" Val=");
-           expr_print(bc->data.insn.imm.val);
+           if (!bc->data.insn.imm.val)
+               printf("(nil)");
+           else
+               expr_print(bc->data.insn.imm.val);
            printf("\n");
            printf(" Len=%u, IsRel=%u, IsNeg=%u\n",
                (unsigned int)bc->data.insn.imm.len,
index 47deb2c09afdef9f2e7e5db512bc4e0b93c657ef..d7c89f59fada6a0469bc81b6c715691b4f4aa963 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bytecode.h,v 1.11 2001/07/05 08:59:29 mu Exp $
+/* $Id: bytecode.h,v 1.12 2001/07/06 06:25:53 mu Exp $
  * Bytecode utility functions header file
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -23,7 +23,7 @@
 #define YASM_BYTECODE_H
 
 typedef struct effaddr_s {
-    unsigned long disp;                /* address displacement */
+    struct expr_s *disp;       /* address displacement */
     unsigned char len;         /* length of disp (in bytes), 0 if none */
 
     unsigned char segment;     /* segment override, 0 if none */
@@ -86,6 +86,7 @@ typedef struct bytecode_s {
 effaddr *ConvertIntToEA(effaddr *ptr, unsigned long int_val);
 effaddr *ConvertRegToEA(effaddr *ptr, unsigned long reg);
 effaddr *ConvertImmToEA(effaddr *ptr, immval *im_ptr, unsigned char im_len);
+effaddr *ConvertExprToEA(effaddr *ptr, struct expr_s *expr_ptr);
 
 immval *ConvertIntToImm(immval *ptr, unsigned long int_val);
 immval *ConvertExprToImm(immval *ptr, struct expr_s *expr_ptr);
index 0c155b2245acbc03b02e2fbe9785b15787feef22..911a6c414c530c39082c3001547c01e5317f293c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bison.y.in,v 1.18 2001/07/05 09:50:51 peter Exp $
+/* $Id: bison.y.in,v 1.19 2001/07/06 06:25:53 mu Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson, Michael Urman
@@ -86,8 +86,8 @@ extern void yyerror(char *);
 %type <ea_val> rm8x rm16x rm32x /*rm64x rm128x*/
 %type <ea_val> rm8 rm16 rm32 rm64 rm128
 %type <im_val> imm imm8x imm16x imm32x imm8 imm16 imm32
-%type <exp> immexp
-%type <syminfo> immlabel
+%type <exp> expr
+%type <syminfo> explabel
 %type <sym> label_id
 
 %left '|'
@@ -183,8 +183,7 @@ segreg:  REG_ES
 ;
 
 /* memory addresses */
-/* TODO: formula expansion */
-memexp: INTNUM     { (void)ConvertIntToEA(&$$, $1); }
+memexp: expr           { expr_simplify ($1); ConvertExprToEA (&$$, $1); }
 ;
 
 memaddr: memexp                        { $$ = $1; $$.segment = 0; }
@@ -279,37 +278,7 @@ rm128: XMMREG      { (void)ConvertRegToEA(&$$, $1); }
 ;
 
 /* immediate values */
-/* TODO: formula expansion */
-immexp: /*INTNUM       { (void)ConvertIntToImm(&$$, $1); } */
-       INTNUM          { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); }
-    | immlabel         { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); }
-    /*| immexp '||' immexp     { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/
-    | immexp '|' immexp        { $$ = expr_new_tree ($1, EXPR_OR, $3); }
-    | immexp '^' immexp        { $$ = expr_new_tree ($1, EXPR_XOR, $3); }
-    /*| immexp '&&' immexp     { $$ = expr_new_tree ($1, EXPR_LAND, $3); }*/
-    | immexp '&' immexp        { $$ = expr_new_tree ($1, EXPR_AND, $3); }
-    /*| immexp '==' immexp     { $$ = expr_new_tree ($1, EXPR_EQUALS, $3); }*/
-    /*| immexp '>' immexp      { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
-    /*| immexp '<' immexp      { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
-    /*| immexp '>=' immexp     { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
-    /*| immexp '<=' immexp     { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
-    /*| immexp '!=' immexp     { $$ = expr_new_tree ($1, EXPR_NE, $3); }*/
-    | immexp LEFT_OP immexp    { $$ = expr_new_tree ($1, EXPR_SHL, $3); }
-    | immexp RIGHT_OP immexp   { $$ = expr_new_tree ($1, EXPR_SHR, $3); }
-    | immexp '+' immexp        { $$ = expr_new_tree ($1, EXPR_ADD, $3); }
-    | immexp '-' immexp        { $$ = expr_new_tree ($1, EXPR_SUB, $3); }
-    | immexp '*' immexp        { $$ = expr_new_tree ($1, EXPR_MUL, $3); }
-    | immexp '/' immexp        { $$ = expr_new_tree ($1, EXPR_DIV, $3); }
-    | immexp '%' immexp        { $$ = expr_new_tree ($1, EXPR_MOD, $3); }
-    | '-' immexp       { $$ = expr_new_branch (EXPR_NEG, $2); }
-    /*| '!' immexp     { $$ = expr_new_branch (EXPR_LNOT, $2); }*/
-    | '~' immexp       { $$ = expr_new_branch (EXPR_NOT, $2); }
-    | '(' immexp ')'   { $$ = $2; }
-;
-
-immlabel: ID | SPECIAL_ID | LOCAL_ID ;
-
-imm: immexp            { expr_simplify ($1); ConvertExprToImm (&$$, $1); }
+imm: expr              { expr_simplify ($1); ConvertExprToImm (&$$, $1); }
 ;
 
 /* explicit immediates */
@@ -331,6 +300,36 @@ imm32: imm
     | imm32x
 ;
 
+/* expression trees */
+expr:
+       INTNUM          { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); }
+    | explabel         { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); }
+    /*| expr '||' expr { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/
+    | expr '|' expr    { $$ = expr_new_tree ($1, EXPR_OR, $3); }
+    | expr '^' expr    { $$ = expr_new_tree ($1, EXPR_XOR, $3); }
+    /*| expr '&&' expr { $$ = expr_new_tree ($1, EXPR_LAND, $3); }*/
+    | expr '&' expr    { $$ = expr_new_tree ($1, EXPR_AND, $3); }
+    /*| expr '==' expr { $$ = expr_new_tree ($1, EXPR_EQUALS, $3); }*/
+    /*| expr '>' expr  { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
+    /*| expr '<' expr  { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
+    /*| expr '>=' expr { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
+    /*| expr '<=' expr { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
+    /*| expr '!=' expr { $$ = expr_new_tree ($1, EXPR_NE, $3); }*/
+    | expr LEFT_OP expr        { $$ = expr_new_tree ($1, EXPR_SHL, $3); }
+    | expr RIGHT_OP expr       { $$ = expr_new_tree ($1, EXPR_SHR, $3); }
+    | expr '+' expr    { $$ = expr_new_tree ($1, EXPR_ADD, $3); }
+    | expr '-' expr    { $$ = expr_new_tree ($1, EXPR_SUB, $3); }
+    | expr '*' expr    { $$ = expr_new_tree ($1, EXPR_MUL, $3); }
+    | expr '/' expr    { $$ = expr_new_tree ($1, EXPR_DIV, $3); }
+    | expr '%' expr    { $$ = expr_new_tree ($1, EXPR_MOD, $3); }
+    | '-' expr         { $$ = expr_new_branch (EXPR_NEG, $2); }
+    /*| '!' expr               { $$ = expr_new_branch (EXPR_LNOT, $2); }*/
+    | '~' expr         { $$ = expr_new_branch (EXPR_NOT, $2); }
+    | '(' expr ')'     { $$ = $2; }
+;
+
+explabel: ID | SPECIAL_ID | LOCAL_ID ;
+
 instr: instrbase
     | OPERSIZE instr   { $$ = $2; SetInsnOperSizeOverride(&$$, $1); }
     | ADDRSIZE instr   { $$ = $2; SetInsnAddrSizeOverride(&$$, $1); }
index f3132d3a165820bfa5d5bae50ba91b41d50c0119..97609a3a512f9c153c2f5dd3ccf9ce6f419df792 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: nasm-bison.y,v 1.18 2001/07/05 09:50:51 peter Exp $
+/* $Id: nasm-bison.y,v 1.19 2001/07/06 06:25:53 mu Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson, Michael Urman
@@ -86,8 +86,8 @@ extern void yyerror(char *);
 %type <ea_val> rm8x rm16x rm32x /*rm64x rm128x*/
 %type <ea_val> rm8 rm16 rm32 rm64 rm128
 %type <im_val> imm imm8x imm16x imm32x imm8 imm16 imm32
-%type <exp> immexp
-%type <syminfo> immlabel
+%type <exp> expr
+%type <syminfo> explabel
 %type <sym> label_id
 
 %left '|'
@@ -183,8 +183,7 @@ segreg:  REG_ES
 ;
 
 /* memory addresses */
-/* TODO: formula expansion */
-memexp: INTNUM     { (void)ConvertIntToEA(&$$, $1); }
+memexp: expr           { expr_simplify ($1); ConvertExprToEA (&$$, $1); }
 ;
 
 memaddr: memexp                        { $$ = $1; $$.segment = 0; }
@@ -279,37 +278,7 @@ rm128: XMMREG      { (void)ConvertRegToEA(&$$, $1); }
 ;
 
 /* immediate values */
-/* TODO: formula expansion */
-immexp: /*INTNUM       { (void)ConvertIntToImm(&$$, $1); } */
-       INTNUM          { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); }
-    | immlabel         { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); }
-    /*| immexp '||' immexp     { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/
-    | immexp '|' immexp        { $$ = expr_new_tree ($1, EXPR_OR, $3); }
-    | immexp '^' immexp        { $$ = expr_new_tree ($1, EXPR_XOR, $3); }
-    /*| immexp '&&' immexp     { $$ = expr_new_tree ($1, EXPR_LAND, $3); }*/
-    | immexp '&' immexp        { $$ = expr_new_tree ($1, EXPR_AND, $3); }
-    /*| immexp '==' immexp     { $$ = expr_new_tree ($1, EXPR_EQUALS, $3); }*/
-    /*| immexp '>' immexp      { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
-    /*| immexp '<' immexp      { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
-    /*| immexp '>=' immexp     { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
-    /*| immexp '<=' immexp     { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
-    /*| immexp '!=' immexp     { $$ = expr_new_tree ($1, EXPR_NE, $3); }*/
-    | immexp LEFT_OP immexp    { $$ = expr_new_tree ($1, EXPR_SHL, $3); }
-    | immexp RIGHT_OP immexp   { $$ = expr_new_tree ($1, EXPR_SHR, $3); }
-    | immexp '+' immexp        { $$ = expr_new_tree ($1, EXPR_ADD, $3); }
-    | immexp '-' immexp        { $$ = expr_new_tree ($1, EXPR_SUB, $3); }
-    | immexp '*' immexp        { $$ = expr_new_tree ($1, EXPR_MUL, $3); }
-    | immexp '/' immexp        { $$ = expr_new_tree ($1, EXPR_DIV, $3); }
-    | immexp '%' immexp        { $$ = expr_new_tree ($1, EXPR_MOD, $3); }
-    | '-' immexp       { $$ = expr_new_branch (EXPR_NEG, $2); }
-    /*| '!' immexp     { $$ = expr_new_branch (EXPR_LNOT, $2); }*/
-    | '~' immexp       { $$ = expr_new_branch (EXPR_NOT, $2); }
-    | '(' immexp ')'   { $$ = $2; }
-;
-
-immlabel: ID | SPECIAL_ID | LOCAL_ID ;
-
-imm: immexp            { expr_simplify ($1); ConvertExprToImm (&$$, $1); }
+imm: expr              { expr_simplify ($1); ConvertExprToImm (&$$, $1); }
 ;
 
 /* explicit immediates */
@@ -331,6 +300,36 @@ imm32: imm
     | imm32x
 ;
 
+/* expression trees */
+expr:
+       INTNUM          { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); }
+    | explabel         { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); }
+    /*| expr '||' expr { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/
+    | expr '|' expr    { $$ = expr_new_tree ($1, EXPR_OR, $3); }
+    | expr '^' expr    { $$ = expr_new_tree ($1, EXPR_XOR, $3); }
+    /*| expr '&&' expr { $$ = expr_new_tree ($1, EXPR_LAND, $3); }*/
+    | expr '&' expr    { $$ = expr_new_tree ($1, EXPR_AND, $3); }
+    /*| expr '==' expr { $$ = expr_new_tree ($1, EXPR_EQUALS, $3); }*/
+    /*| expr '>' expr  { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
+    /*| expr '<' expr  { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
+    /*| expr '>=' expr { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
+    /*| expr '<=' expr { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
+    /*| expr '!=' expr { $$ = expr_new_tree ($1, EXPR_NE, $3); }*/
+    | expr LEFT_OP expr        { $$ = expr_new_tree ($1, EXPR_SHL, $3); }
+    | expr RIGHT_OP expr       { $$ = expr_new_tree ($1, EXPR_SHR, $3); }
+    | expr '+' expr    { $$ = expr_new_tree ($1, EXPR_ADD, $3); }
+    | expr '-' expr    { $$ = expr_new_tree ($1, EXPR_SUB, $3); }
+    | expr '*' expr    { $$ = expr_new_tree ($1, EXPR_MUL, $3); }
+    | expr '/' expr    { $$ = expr_new_tree ($1, EXPR_DIV, $3); }
+    | expr '%' expr    { $$ = expr_new_tree ($1, EXPR_MOD, $3); }
+    | '-' expr         { $$ = expr_new_branch (EXPR_NEG, $2); }
+    /*| '!' expr               { $$ = expr_new_branch (EXPR_LNOT, $2); }*/
+    | '~' expr         { $$ = expr_new_branch (EXPR_NOT, $2); }
+    | '(' expr ')'     { $$ = $2; }
+;
+
+explabel: ID | SPECIAL_ID | LOCAL_ID ;
+
 instr: instrbase
     | OPERSIZE instr   { $$ = $2; SetInsnOperSizeOverride(&$$, $1); }
     | ADDRSIZE instr   { $$ = $2; SetInsnAddrSizeOverride(&$$, $1); }
index 0c155b2245acbc03b02e2fbe9785b15787feef22..911a6c414c530c39082c3001547c01e5317f293c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bison.y.in,v 1.18 2001/07/05 09:50:51 peter Exp $
+/* $Id: bison.y.in,v 1.19 2001/07/06 06:25:53 mu Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson, Michael Urman
@@ -86,8 +86,8 @@ extern void yyerror(char *);
 %type <ea_val> rm8x rm16x rm32x /*rm64x rm128x*/
 %type <ea_val> rm8 rm16 rm32 rm64 rm128
 %type <im_val> imm imm8x imm16x imm32x imm8 imm16 imm32
-%type <exp> immexp
-%type <syminfo> immlabel
+%type <exp> expr
+%type <syminfo> explabel
 %type <sym> label_id
 
 %left '|'
@@ -183,8 +183,7 @@ segreg:  REG_ES
 ;
 
 /* memory addresses */
-/* TODO: formula expansion */
-memexp: INTNUM     { (void)ConvertIntToEA(&$$, $1); }
+memexp: expr           { expr_simplify ($1); ConvertExprToEA (&$$, $1); }
 ;
 
 memaddr: memexp                        { $$ = $1; $$.segment = 0; }
@@ -279,37 +278,7 @@ rm128: XMMREG      { (void)ConvertRegToEA(&$$, $1); }
 ;
 
 /* immediate values */
-/* TODO: formula expansion */
-immexp: /*INTNUM       { (void)ConvertIntToImm(&$$, $1); } */
-       INTNUM          { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); }
-    | immlabel         { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); }
-    /*| immexp '||' immexp     { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/
-    | immexp '|' immexp        { $$ = expr_new_tree ($1, EXPR_OR, $3); }
-    | immexp '^' immexp        { $$ = expr_new_tree ($1, EXPR_XOR, $3); }
-    /*| immexp '&&' immexp     { $$ = expr_new_tree ($1, EXPR_LAND, $3); }*/
-    | immexp '&' immexp        { $$ = expr_new_tree ($1, EXPR_AND, $3); }
-    /*| immexp '==' immexp     { $$ = expr_new_tree ($1, EXPR_EQUALS, $3); }*/
-    /*| immexp '>' immexp      { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
-    /*| immexp '<' immexp      { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
-    /*| immexp '>=' immexp     { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
-    /*| immexp '<=' immexp     { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
-    /*| immexp '!=' immexp     { $$ = expr_new_tree ($1, EXPR_NE, $3); }*/
-    | immexp LEFT_OP immexp    { $$ = expr_new_tree ($1, EXPR_SHL, $3); }
-    | immexp RIGHT_OP immexp   { $$ = expr_new_tree ($1, EXPR_SHR, $3); }
-    | immexp '+' immexp        { $$ = expr_new_tree ($1, EXPR_ADD, $3); }
-    | immexp '-' immexp        { $$ = expr_new_tree ($1, EXPR_SUB, $3); }
-    | immexp '*' immexp        { $$ = expr_new_tree ($1, EXPR_MUL, $3); }
-    | immexp '/' immexp        { $$ = expr_new_tree ($1, EXPR_DIV, $3); }
-    | immexp '%' immexp        { $$ = expr_new_tree ($1, EXPR_MOD, $3); }
-    | '-' immexp       { $$ = expr_new_branch (EXPR_NEG, $2); }
-    /*| '!' immexp     { $$ = expr_new_branch (EXPR_LNOT, $2); }*/
-    | '~' immexp       { $$ = expr_new_branch (EXPR_NOT, $2); }
-    | '(' immexp ')'   { $$ = $2; }
-;
-
-immlabel: ID | SPECIAL_ID | LOCAL_ID ;
-
-imm: immexp            { expr_simplify ($1); ConvertExprToImm (&$$, $1); }
+imm: expr              { expr_simplify ($1); ConvertExprToImm (&$$, $1); }
 ;
 
 /* explicit immediates */
@@ -331,6 +300,36 @@ imm32: imm
     | imm32x
 ;
 
+/* expression trees */
+expr:
+       INTNUM          { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); }
+    | explabel         { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); }
+    /*| expr '||' expr { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/
+    | expr '|' expr    { $$ = expr_new_tree ($1, EXPR_OR, $3); }
+    | expr '^' expr    { $$ = expr_new_tree ($1, EXPR_XOR, $3); }
+    /*| expr '&&' expr { $$ = expr_new_tree ($1, EXPR_LAND, $3); }*/
+    | expr '&' expr    { $$ = expr_new_tree ($1, EXPR_AND, $3); }
+    /*| expr '==' expr { $$ = expr_new_tree ($1, EXPR_EQUALS, $3); }*/
+    /*| expr '>' expr  { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
+    /*| expr '<' expr  { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
+    /*| expr '>=' expr { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
+    /*| expr '<=' expr { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
+    /*| expr '!=' expr { $$ = expr_new_tree ($1, EXPR_NE, $3); }*/
+    | expr LEFT_OP expr        { $$ = expr_new_tree ($1, EXPR_SHL, $3); }
+    | expr RIGHT_OP expr       { $$ = expr_new_tree ($1, EXPR_SHR, $3); }
+    | expr '+' expr    { $$ = expr_new_tree ($1, EXPR_ADD, $3); }
+    | expr '-' expr    { $$ = expr_new_tree ($1, EXPR_SUB, $3); }
+    | expr '*' expr    { $$ = expr_new_tree ($1, EXPR_MUL, $3); }
+    | expr '/' expr    { $$ = expr_new_tree ($1, EXPR_DIV, $3); }
+    | expr '%' expr    { $$ = expr_new_tree ($1, EXPR_MOD, $3); }
+    | '-' expr         { $$ = expr_new_branch (EXPR_NEG, $2); }
+    /*| '!' expr               { $$ = expr_new_branch (EXPR_LNOT, $2); }*/
+    | '~' expr         { $$ = expr_new_branch (EXPR_NOT, $2); }
+    | '(' expr ')'     { $$ = $2; }
+;
+
+explabel: ID | SPECIAL_ID | LOCAL_ID ;
+
 instr: instrbase
     | OPERSIZE instr   { $$ = $2; SetInsnOperSizeOverride(&$$, $1); }
     | ADDRSIZE instr   { $$ = $2; SetInsnAddrSizeOverride(&$$, $1); }
index cec7f61d4ab1a841fa4593d5169872928edf0e6d..a180aed1cfde021c61ed28177c9361871682a6ee 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bytecode.c,v 1.10 2001/07/05 09:32:58 mu Exp $
+/* $Id: bytecode.c,v 1.11 2001/07/06 06:25:53 mu Exp $
  * Bytecode utility functions
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -41,7 +41,8 @@ effaddr *ConvertIntToEA(effaddr *ptr, unsigned long int_val)
     ptr->valid_sib = 0;
     ptr->need_sib = 0;
 
-    ptr->disp = int_val;
+    /* FIXME: this will leak expr's if static is used */
+    ptr->disp = expr_new_ident(EXPR_NUM, ExprNum(int_val));
 
     if((int_val & 0xFF) == int_val)
        ptr->len = 1;
@@ -69,14 +70,29 @@ effaddr *ConvertRegToEA(effaddr *ptr, unsigned long reg)
     return ptr;
 }
 
+effaddr *ConvertExprToEA(effaddr *ptr, expr *expr_ptr)
+{
+    if(!ptr)
+       ptr = &eff_static;
+
+    ptr->segment = 0;
+
+    ptr->valid_modrm = 0;
+    ptr->need_modrm = 1;
+    ptr->valid_sib = 0;
+    ptr->need_sib = 0;
+
+    ptr->disp = expr_ptr;
+
+    return ptr;
+}
+
 effaddr *ConvertImmToEA(effaddr *ptr, immval *im_ptr, unsigned char im_len)
 {
-    int gotexprval;
     if(!ptr)
        ptr = &eff_static;
 
-    /* FIXME: warn when gotexprval is 0, and/or die */
-    gotexprval = expr_get_value (im_ptr->val, &ptr->disp);
+    ptr->disp = im_ptr->val;
     if(im_ptr->len > im_len)
        Warning(WARN_VALUE_EXCEEDS_BOUNDS, (char *)NULL, "word");
     ptr->len = im_len;
@@ -245,7 +261,13 @@ void DebugPrintBC(bytecode *bc)
        case BC_INSN:
            printf("_Instruction_\n");
            printf("Effective Address:\n");
-           printf(" Disp=%lx Len=%u SegmentOv=%2x\n", bc->data.insn.ea.disp,
+           printf(" Disp=");
+           if (!bc->data.insn.ea.disp)
+               printf("(nil)");
+           else
+               expr_print(bc->data.insn.ea.disp);
+           printf("\n");
+           printf (" Len=%u SegmentOv=%2x\n",
                (unsigned int)bc->data.insn.ea.len,
                (unsigned int)bc->data.insn.ea.segment);
            printf(" ModRM=%2x ValidRM=%u NeedRM=%u\n",
@@ -258,7 +280,10 @@ void DebugPrintBC(bytecode *bc)
                (unsigned int)bc->data.insn.ea.need_sib);
            printf("Immediate/Relative Value:\n");
            printf(" Val=");
-           expr_print(bc->data.insn.imm.val);
+           if (!bc->data.insn.imm.val)
+               printf("(nil)");
+           else
+               expr_print(bc->data.insn.imm.val);
            printf("\n");
            printf(" Len=%u, IsRel=%u, IsNeg=%u\n",
                (unsigned int)bc->data.insn.imm.len,
index 47deb2c09afdef9f2e7e5db512bc4e0b93c657ef..d7c89f59fada6a0469bc81b6c715691b4f4aa963 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bytecode.h,v 1.11 2001/07/05 08:59:29 mu Exp $
+/* $Id: bytecode.h,v 1.12 2001/07/06 06:25:53 mu Exp $
  * Bytecode utility functions header file
  *
  *  Copyright (C) 2001  Peter Johnson
@@ -23,7 +23,7 @@
 #define YASM_BYTECODE_H
 
 typedef struct effaddr_s {
-    unsigned long disp;                /* address displacement */
+    struct expr_s *disp;       /* address displacement */
     unsigned char len;         /* length of disp (in bytes), 0 if none */
 
     unsigned char segment;     /* segment override, 0 if none */
@@ -86,6 +86,7 @@ typedef struct bytecode_s {
 effaddr *ConvertIntToEA(effaddr *ptr, unsigned long int_val);
 effaddr *ConvertRegToEA(effaddr *ptr, unsigned long reg);
 effaddr *ConvertImmToEA(effaddr *ptr, immval *im_ptr, unsigned char im_len);
+effaddr *ConvertExprToEA(effaddr *ptr, struct expr_s *expr_ptr);
 
 immval *ConvertIntToImm(immval *ptr, unsigned long int_val);
 immval *ConvertExprToImm(immval *ptr, struct expr_s *expr_ptr);
index 0c155b2245acbc03b02e2fbe9785b15787feef22..911a6c414c530c39082c3001547c01e5317f293c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: bison.y.in,v 1.18 2001/07/05 09:50:51 peter Exp $
+/* $Id: bison.y.in,v 1.19 2001/07/06 06:25:53 mu Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson, Michael Urman
@@ -86,8 +86,8 @@ extern void yyerror(char *);
 %type <ea_val> rm8x rm16x rm32x /*rm64x rm128x*/
 %type <ea_val> rm8 rm16 rm32 rm64 rm128
 %type <im_val> imm imm8x imm16x imm32x imm8 imm16 imm32
-%type <exp> immexp
-%type <syminfo> immlabel
+%type <exp> expr
+%type <syminfo> explabel
 %type <sym> label_id
 
 %left '|'
@@ -183,8 +183,7 @@ segreg:  REG_ES
 ;
 
 /* memory addresses */
-/* TODO: formula expansion */
-memexp: INTNUM     { (void)ConvertIntToEA(&$$, $1); }
+memexp: expr           { expr_simplify ($1); ConvertExprToEA (&$$, $1); }
 ;
 
 memaddr: memexp                        { $$ = $1; $$.segment = 0; }
@@ -279,37 +278,7 @@ rm128: XMMREG      { (void)ConvertRegToEA(&$$, $1); }
 ;
 
 /* immediate values */
-/* TODO: formula expansion */
-immexp: /*INTNUM       { (void)ConvertIntToImm(&$$, $1); } */
-       INTNUM          { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); }
-    | immlabel         { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); }
-    /*| immexp '||' immexp     { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/
-    | immexp '|' immexp        { $$ = expr_new_tree ($1, EXPR_OR, $3); }
-    | immexp '^' immexp        { $$ = expr_new_tree ($1, EXPR_XOR, $3); }
-    /*| immexp '&&' immexp     { $$ = expr_new_tree ($1, EXPR_LAND, $3); }*/
-    | immexp '&' immexp        { $$ = expr_new_tree ($1, EXPR_AND, $3); }
-    /*| immexp '==' immexp     { $$ = expr_new_tree ($1, EXPR_EQUALS, $3); }*/
-    /*| immexp '>' immexp      { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
-    /*| immexp '<' immexp      { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
-    /*| immexp '>=' immexp     { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
-    /*| immexp '<=' immexp     { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
-    /*| immexp '!=' immexp     { $$ = expr_new_tree ($1, EXPR_NE, $3); }*/
-    | immexp LEFT_OP immexp    { $$ = expr_new_tree ($1, EXPR_SHL, $3); }
-    | immexp RIGHT_OP immexp   { $$ = expr_new_tree ($1, EXPR_SHR, $3); }
-    | immexp '+' immexp        { $$ = expr_new_tree ($1, EXPR_ADD, $3); }
-    | immexp '-' immexp        { $$ = expr_new_tree ($1, EXPR_SUB, $3); }
-    | immexp '*' immexp        { $$ = expr_new_tree ($1, EXPR_MUL, $3); }
-    | immexp '/' immexp        { $$ = expr_new_tree ($1, EXPR_DIV, $3); }
-    | immexp '%' immexp        { $$ = expr_new_tree ($1, EXPR_MOD, $3); }
-    | '-' immexp       { $$ = expr_new_branch (EXPR_NEG, $2); }
-    /*| '!' immexp     { $$ = expr_new_branch (EXPR_LNOT, $2); }*/
-    | '~' immexp       { $$ = expr_new_branch (EXPR_NOT, $2); }
-    | '(' immexp ')'   { $$ = $2; }
-;
-
-immlabel: ID | SPECIAL_ID | LOCAL_ID ;
-
-imm: immexp            { expr_simplify ($1); ConvertExprToImm (&$$, $1); }
+imm: expr              { expr_simplify ($1); ConvertExprToImm (&$$, $1); }
 ;
 
 /* explicit immediates */
@@ -331,6 +300,36 @@ imm32: imm
     | imm32x
 ;
 
+/* expression trees */
+expr:
+       INTNUM          { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); }
+    | explabel         { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); }
+    /*| expr '||' expr { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/
+    | expr '|' expr    { $$ = expr_new_tree ($1, EXPR_OR, $3); }
+    | expr '^' expr    { $$ = expr_new_tree ($1, EXPR_XOR, $3); }
+    /*| expr '&&' expr { $$ = expr_new_tree ($1, EXPR_LAND, $3); }*/
+    | expr '&' expr    { $$ = expr_new_tree ($1, EXPR_AND, $3); }
+    /*| expr '==' expr { $$ = expr_new_tree ($1, EXPR_EQUALS, $3); }*/
+    /*| expr '>' expr  { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
+    /*| expr '<' expr  { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
+    /*| expr '>=' expr { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
+    /*| expr '<=' expr { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
+    /*| expr '!=' expr { $$ = expr_new_tree ($1, EXPR_NE, $3); }*/
+    | expr LEFT_OP expr        { $$ = expr_new_tree ($1, EXPR_SHL, $3); }
+    | expr RIGHT_OP expr       { $$ = expr_new_tree ($1, EXPR_SHR, $3); }
+    | expr '+' expr    { $$ = expr_new_tree ($1, EXPR_ADD, $3); }
+    | expr '-' expr    { $$ = expr_new_tree ($1, EXPR_SUB, $3); }
+    | expr '*' expr    { $$ = expr_new_tree ($1, EXPR_MUL, $3); }
+    | expr '/' expr    { $$ = expr_new_tree ($1, EXPR_DIV, $3); }
+    | expr '%' expr    { $$ = expr_new_tree ($1, EXPR_MOD, $3); }
+    | '-' expr         { $$ = expr_new_branch (EXPR_NEG, $2); }
+    /*| '!' expr               { $$ = expr_new_branch (EXPR_LNOT, $2); }*/
+    | '~' expr         { $$ = expr_new_branch (EXPR_NOT, $2); }
+    | '(' expr ')'     { $$ = $2; }
+;
+
+explabel: ID | SPECIAL_ID | LOCAL_ID ;
+
 instr: instrbase
     | OPERSIZE instr   { $$ = $2; SetInsnOperSizeOverride(&$$, $1); }
     | ADDRSIZE instr   { $$ = $2; SetInsnAddrSizeOverride(&$$, $1); }
index f3132d3a165820bfa5d5bae50ba91b41d50c0119..97609a3a512f9c153c2f5dd3ccf9ce6f419df792 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: nasm-bison.y,v 1.18 2001/07/05 09:50:51 peter Exp $
+/* $Id: nasm-bison.y,v 1.19 2001/07/06 06:25:53 mu Exp $
  * Main bison parser
  *
  *  Copyright (C) 2001  Peter Johnson, Michael Urman
@@ -86,8 +86,8 @@ extern void yyerror(char *);
 %type <ea_val> rm8x rm16x rm32x /*rm64x rm128x*/
 %type <ea_val> rm8 rm16 rm32 rm64 rm128
 %type <im_val> imm imm8x imm16x imm32x imm8 imm16 imm32
-%type <exp> immexp
-%type <syminfo> immlabel
+%type <exp> expr
+%type <syminfo> explabel
 %type <sym> label_id
 
 %left '|'
@@ -183,8 +183,7 @@ segreg:  REG_ES
 ;
 
 /* memory addresses */
-/* TODO: formula expansion */
-memexp: INTNUM     { (void)ConvertIntToEA(&$$, $1); }
+memexp: expr           { expr_simplify ($1); ConvertExprToEA (&$$, $1); }
 ;
 
 memaddr: memexp                        { $$ = $1; $$.segment = 0; }
@@ -279,37 +278,7 @@ rm128: XMMREG      { (void)ConvertRegToEA(&$$, $1); }
 ;
 
 /* immediate values */
-/* TODO: formula expansion */
-immexp: /*INTNUM       { (void)ConvertIntToImm(&$$, $1); } */
-       INTNUM          { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); }
-    | immlabel         { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); }
-    /*| immexp '||' immexp     { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/
-    | immexp '|' immexp        { $$ = expr_new_tree ($1, EXPR_OR, $3); }
-    | immexp '^' immexp        { $$ = expr_new_tree ($1, EXPR_XOR, $3); }
-    /*| immexp '&&' immexp     { $$ = expr_new_tree ($1, EXPR_LAND, $3); }*/
-    | immexp '&' immexp        { $$ = expr_new_tree ($1, EXPR_AND, $3); }
-    /*| immexp '==' immexp     { $$ = expr_new_tree ($1, EXPR_EQUALS, $3); }*/
-    /*| immexp '>' immexp      { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
-    /*| immexp '<' immexp      { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
-    /*| immexp '>=' immexp     { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
-    /*| immexp '<=' immexp     { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
-    /*| immexp '!=' immexp     { $$ = expr_new_tree ($1, EXPR_NE, $3); }*/
-    | immexp LEFT_OP immexp    { $$ = expr_new_tree ($1, EXPR_SHL, $3); }
-    | immexp RIGHT_OP immexp   { $$ = expr_new_tree ($1, EXPR_SHR, $3); }
-    | immexp '+' immexp        { $$ = expr_new_tree ($1, EXPR_ADD, $3); }
-    | immexp '-' immexp        { $$ = expr_new_tree ($1, EXPR_SUB, $3); }
-    | immexp '*' immexp        { $$ = expr_new_tree ($1, EXPR_MUL, $3); }
-    | immexp '/' immexp        { $$ = expr_new_tree ($1, EXPR_DIV, $3); }
-    | immexp '%' immexp        { $$ = expr_new_tree ($1, EXPR_MOD, $3); }
-    | '-' immexp       { $$ = expr_new_branch (EXPR_NEG, $2); }
-    /*| '!' immexp     { $$ = expr_new_branch (EXPR_LNOT, $2); }*/
-    | '~' immexp       { $$ = expr_new_branch (EXPR_NOT, $2); }
-    | '(' immexp ')'   { $$ = $2; }
-;
-
-immlabel: ID | SPECIAL_ID | LOCAL_ID ;
-
-imm: immexp            { expr_simplify ($1); ConvertExprToImm (&$$, $1); }
+imm: expr              { expr_simplify ($1); ConvertExprToImm (&$$, $1); }
 ;
 
 /* explicit immediates */
@@ -331,6 +300,36 @@ imm32: imm
     | imm32x
 ;
 
+/* expression trees */
+expr:
+       INTNUM          { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); }
+    | explabel         { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); }
+    /*| expr '||' expr { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/
+    | expr '|' expr    { $$ = expr_new_tree ($1, EXPR_OR, $3); }
+    | expr '^' expr    { $$ = expr_new_tree ($1, EXPR_XOR, $3); }
+    /*| expr '&&' expr { $$ = expr_new_tree ($1, EXPR_LAND, $3); }*/
+    | expr '&' expr    { $$ = expr_new_tree ($1, EXPR_AND, $3); }
+    /*| expr '==' expr { $$ = expr_new_tree ($1, EXPR_EQUALS, $3); }*/
+    /*| expr '>' expr  { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
+    /*| expr '<' expr  { $$ = expr_new_tree ($1, EXPR_GT, $3); }*/
+    /*| expr '>=' expr { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
+    /*| expr '<=' expr { $$ = expr_new_tree ($1, EXPR_GE, $3); }*/
+    /*| expr '!=' expr { $$ = expr_new_tree ($1, EXPR_NE, $3); }*/
+    | expr LEFT_OP expr        { $$ = expr_new_tree ($1, EXPR_SHL, $3); }
+    | expr RIGHT_OP expr       { $$ = expr_new_tree ($1, EXPR_SHR, $3); }
+    | expr '+' expr    { $$ = expr_new_tree ($1, EXPR_ADD, $3); }
+    | expr '-' expr    { $$ = expr_new_tree ($1, EXPR_SUB, $3); }
+    | expr '*' expr    { $$ = expr_new_tree ($1, EXPR_MUL, $3); }
+    | expr '/' expr    { $$ = expr_new_tree ($1, EXPR_DIV, $3); }
+    | expr '%' expr    { $$ = expr_new_tree ($1, EXPR_MOD, $3); }
+    | '-' expr         { $$ = expr_new_branch (EXPR_NEG, $2); }
+    /*| '!' expr               { $$ = expr_new_branch (EXPR_LNOT, $2); }*/
+    | '~' expr         { $$ = expr_new_branch (EXPR_NOT, $2); }
+    | '(' expr ')'     { $$ = $2; }
+;
+
+explabel: ID | SPECIAL_ID | LOCAL_ID ;
+
 instr: instrbase
     | OPERSIZE instr   { $$ = $2; SetInsnOperSizeOverride(&$$, $1); }
     | ADDRSIZE instr   { $$ = $2; SetInsnAddrSizeOverride(&$$, $1); }