-/* $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
#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 */
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);
-/* $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
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;
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;
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",
(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,
-/* $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
#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 */
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);
-/* $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
%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 '|'
;
/* memory addresses */
-/* TODO: formula expansion */
-memexp: INTNUM { (void)ConvertIntToEA(&$$, $1); }
+memexp: expr { expr_simplify ($1); ConvertExprToEA (&$$, $1); }
;
memaddr: memexp { $$ = $1; $$.segment = 0; }
;
/* 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 */
| 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); }
-/* $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
%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 '|'
;
/* memory addresses */
-/* TODO: formula expansion */
-memexp: INTNUM { (void)ConvertIntToEA(&$$, $1); }
+memexp: expr { expr_simplify ($1); ConvertExprToEA (&$$, $1); }
;
memaddr: memexp { $$ = $1; $$.segment = 0; }
;
/* 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 */
| 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); }
-/* $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
%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 '|'
;
/* memory addresses */
-/* TODO: formula expansion */
-memexp: INTNUM { (void)ConvertIntToEA(&$$, $1); }
+memexp: expr { expr_simplify ($1); ConvertExprToEA (&$$, $1); }
;
memaddr: memexp { $$ = $1; $$.segment = 0; }
;
/* 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 */
| 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); }
-/* $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
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;
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;
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",
(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,
-/* $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
#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 */
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);
-/* $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
%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 '|'
;
/* memory addresses */
-/* TODO: formula expansion */
-memexp: INTNUM { (void)ConvertIntToEA(&$$, $1); }
+memexp: expr { expr_simplify ($1); ConvertExprToEA (&$$, $1); }
;
memaddr: memexp { $$ = $1; $$.segment = 0; }
;
/* 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 */
| 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); }
-/* $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
%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 '|'
;
/* memory addresses */
-/* TODO: formula expansion */
-memexp: INTNUM { (void)ConvertIntToEA(&$$, $1); }
+memexp: expr { expr_simplify ($1); ConvertExprToEA (&$$, $1); }
;
memaddr: memexp { $$ = $1; $$.segment = 0; }
;
/* 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 */
| 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); }