From: Peter Johnson Date: Fri, 18 May 2001 21:42:32 +0000 (-0000) Subject: Merge immediate and relative structures. X-Git-Tag: v0.1.0~500 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2ddc3208dcba4c35d1a4482976b1ba108bb66d85;p=yasm Merge immediate and relative structures. svn path=/trunk/yasm/; revision=11 --- diff --git a/include/bytecode.h b/include/bytecode.h index 658fc5cd..fce3b5f3 100644 --- a/include/bytecode.h +++ b/include/bytecode.h @@ -1,4 +1,4 @@ -/* $Id: bytecode.h,v 1.1 2001/05/15 05:28:06 peter Exp $ +/* $Id: bytecode.h,v 1.2 2001/05/18 21:42:31 peter Exp $ * Bytecode utility functions header file * * Copyright (C) 2001 Peter Johnson @@ -34,14 +34,11 @@ typedef struct effaddr_s { typedef struct immval_s { unsigned long val; - unsigned char len; /* length of val (in bytes) */ + unsigned char len; /* length of val (in bytes), 0 if none */ + unsigned char isrel; + unsigned char isneg; /* the value has been explicitly negated */ } immval; -typedef struct relval_s { - unsigned long val; - unsigned char len; /* length of val (in bytes) */ -} relval; - typedef struct bytecode_s { struct bytecode_s *next; @@ -50,15 +47,17 @@ typedef struct bytecode_s { union { struct { effaddr ea; /* effective address */ - union { - immval im; /* immediate value */ - relval rel; - } imm; + + immval imm; /* immediate or relative value */ + unsigned char f_len_imm; /* final imm length */ + unsigned char f_rel_imm; /* 1 if final imm should be rel */ + unsigned char f_sign_imm; /* 1 if final imm should be signed */ + unsigned char opcode[2]; /* opcode */ unsigned char opcode_len; + unsigned char opersize; /* 0 indicates no override */ unsigned char lockrep_pre; /* 0 indicates no prefix */ - unsigned char isrel; } insn; struct { unsigned char *data; @@ -81,17 +80,10 @@ effaddr *ConvertRegToEA(effaddr *ptr, unsigned long reg); immval *ConvertIntToImm(immval *ptr, unsigned long int_val); -relval *ConvertImmToRel(relval *ptr, immval *im_ptr, - unsigned char rel_forcelen); - void BuildBC_Insn(bytecode *bc, unsigned char opersize, unsigned char opcode_len, unsigned char op0, unsigned char op1, effaddr *ea_ptr, unsigned char spare, immval *im_ptr, - unsigned char im_forcelen); - -void BuildBC_Insn_Rel(bytecode *bc, unsigned char opersize, - unsigned char opcode_len, unsigned char op0, unsigned char op1, - effaddr *ea_ptr, unsigned char spare, relval *rel_ptr); + unsigned char im_len, unsigned char im_sign, unsigned char im_rel); unsigned char *ConvertBCInsnToBytes(unsigned char *ptr, bytecode *bc, int *len); diff --git a/libyasm/bytecode.c b/libyasm/bytecode.c index 3e9baf49..f784296f 100644 --- a/libyasm/bytecode.c +++ b/libyasm/bytecode.c @@ -1,4 +1,4 @@ -/* $Id: bytecode.c,v 1.1 2001/05/15 05:23:23 peter Exp $ +/* $Id: bytecode.c,v 1.2 2001/05/18 21:42:32 peter Exp $ * Bytecode utility functions * * Copyright (C) 2001 Peter Johnson @@ -23,13 +23,8 @@ #include "globals.h" #include "bytecode.h" -static void buildbc_insn_common(bytecode *bc, unsigned char opersize, - unsigned char opcode_len, unsigned char op0, unsigned char op1, - effaddr *ea_ptr, unsigned char spare); - static effaddr eff_static; static immval im_static; -static relval rel_static; unsigned char bytes_static[16]; /* FIXME: converting int to EA, but we don't know addrsize yet? @@ -88,29 +83,16 @@ immval *ConvertIntToImm(immval *ptr, unsigned long int_val) else ptr->len = 4; - return ptr; -} - -/* FIXME: This actually doesn't do anything useful yet :) */ -relval *ConvertImmToRel(relval *ptr, immval *im_ptr, - unsigned char rel_forcelen) -{ - if(!ptr) - ptr = &rel_static; - - if(im_ptr) { - ptr->val = im_ptr->val; - ptr->len = im_ptr->len; - } else { - ptr->len = 0; - } + ptr->isrel = 0; + ptr->isneg = 0; return ptr; } -static void buildbc_insn_common(bytecode *bc, unsigned char opersize, +void BuildBC_Insn(bytecode *bc, unsigned char opersize, unsigned char opcode_len, unsigned char op0, unsigned char op1, - effaddr *ea_ptr, unsigned char spare) + effaddr *ea_ptr, unsigned char spare, immval *im_ptr, + unsigned char im_len, unsigned char im_sign, unsigned char im_rel) { bc->next = (bytecode *)NULL; bc->type = BC_INSN; @@ -126,6 +108,15 @@ static void buildbc_insn_common(bytecode *bc, unsigned char opersize, bc->data.insn.ea.need_sib = 0; } + if(im_ptr) { + bc->data.insn.imm = *im_ptr; + } else { + bc->data.insn.imm.len = 0; + } + bc->data.insn.f_rel_imm = im_rel; + bc->data.insn.f_sign_imm = im_sign; + bc->data.insn.f_len_imm = im_len; + bc->data.insn.opcode[0] = op0; bc->data.insn.opcode[1] = op1; bc->data.insn.opcode_len = opcode_len; @@ -141,37 +132,6 @@ static void buildbc_insn_common(bytecode *bc, unsigned char opersize, bc->mode_bits = mode_bits; } - -void BuildBC_Insn(bytecode *bc, unsigned char opersize, - unsigned char opcode_len, unsigned char op0, unsigned char op1, - effaddr *ea_ptr, unsigned char spare, immval *im_ptr, - unsigned char im_forcelen) -{ - buildbc_insn_common(bc, opersize, opcode_len, op0, op1, ea_ptr, spare); - - if(im_ptr) { - bc->data.insn.imm.im = *im_ptr; - bc->data.insn.imm.im.len = im_forcelen; /* TODO: Add Warning */ - } else { - bc->data.insn.imm.im.len = 0; - } - bc->data.insn.isrel = 0; -} - -void BuildBC_Insn_Rel(bytecode *bc, unsigned char opersize, - unsigned char opcode_len, unsigned char op0, unsigned char op1, - effaddr *ea_ptr, unsigned char spare, relval *rel_ptr) -{ - buildbc_insn_common(bc, opersize, opcode_len, op0, op1, ea_ptr, spare); - - if(rel_ptr) { - bc->data.insn.imm.rel = *rel_ptr; - } else { - bc->data.insn.imm.rel.len = 0; - } - bc->data.insn.isrel = 1; -} - /* TODO: implement. Shouldn't be difficult. */ unsigned char *ConvertBCInsnToBytes(unsigned char *ptr, bytecode *bc, int *len) { @@ -197,15 +157,14 @@ void DebugPrintBC(bytecode *bc) (unsigned int)bc->data.insn.ea.modrm, (unsigned int)bc->data.insn.ea.sib, (unsigned int)bc->data.insn.ea.need_sib); - if(bc->data.insn.isrel) { - printf("Relative Offset:\n"); - printf(" Val=%lx Len=%u\n", bc->data.insn.imm.rel.val, - (unsigned int)bc->data.insn.imm.rel.len); - } else { - printf("Immediate Value:\n"); - printf(" Val=%lx Len=%u\n", bc->data.insn.imm.im.val, - (unsigned int)bc->data.insn.imm.im.len); - } + printf("Immediate/Relative Value:\n"); + printf(" Val=%lx Len=%u, IsRel=%u\n", bc->data.insn.imm.val, + (unsigned int)bc->data.insn.imm.len, + (unsigned int)bc->data.insn.imm.isrel); + printf(" FLen=%u, FRel=%u, FSign=%u\n", + (unsigned int)bc->data.insn.f_len_imm, + (unsigned int)bc->data.insn.f_rel_imm, + (unsigned int)bc->data.insn.f_sign_imm); printf("Opcode: %2x %2x OpLen=%u\n", (unsigned int)bc->data.insn.opcode[0], (unsigned int)bc->data.insn.opcode[1], diff --git a/libyasm/bytecode.h b/libyasm/bytecode.h index 658fc5cd..fce3b5f3 100644 --- a/libyasm/bytecode.h +++ b/libyasm/bytecode.h @@ -1,4 +1,4 @@ -/* $Id: bytecode.h,v 1.1 2001/05/15 05:28:06 peter Exp $ +/* $Id: bytecode.h,v 1.2 2001/05/18 21:42:31 peter Exp $ * Bytecode utility functions header file * * Copyright (C) 2001 Peter Johnson @@ -34,14 +34,11 @@ typedef struct effaddr_s { typedef struct immval_s { unsigned long val; - unsigned char len; /* length of val (in bytes) */ + unsigned char len; /* length of val (in bytes), 0 if none */ + unsigned char isrel; + unsigned char isneg; /* the value has been explicitly negated */ } immval; -typedef struct relval_s { - unsigned long val; - unsigned char len; /* length of val (in bytes) */ -} relval; - typedef struct bytecode_s { struct bytecode_s *next; @@ -50,15 +47,17 @@ typedef struct bytecode_s { union { struct { effaddr ea; /* effective address */ - union { - immval im; /* immediate value */ - relval rel; - } imm; + + immval imm; /* immediate or relative value */ + unsigned char f_len_imm; /* final imm length */ + unsigned char f_rel_imm; /* 1 if final imm should be rel */ + unsigned char f_sign_imm; /* 1 if final imm should be signed */ + unsigned char opcode[2]; /* opcode */ unsigned char opcode_len; + unsigned char opersize; /* 0 indicates no override */ unsigned char lockrep_pre; /* 0 indicates no prefix */ - unsigned char isrel; } insn; struct { unsigned char *data; @@ -81,17 +80,10 @@ effaddr *ConvertRegToEA(effaddr *ptr, unsigned long reg); immval *ConvertIntToImm(immval *ptr, unsigned long int_val); -relval *ConvertImmToRel(relval *ptr, immval *im_ptr, - unsigned char rel_forcelen); - void BuildBC_Insn(bytecode *bc, unsigned char opersize, unsigned char opcode_len, unsigned char op0, unsigned char op1, effaddr *ea_ptr, unsigned char spare, immval *im_ptr, - unsigned char im_forcelen); - -void BuildBC_Insn_Rel(bytecode *bc, unsigned char opersize, - unsigned char opcode_len, unsigned char op0, unsigned char op1, - effaddr *ea_ptr, unsigned char spare, relval *rel_ptr); + unsigned char im_len, unsigned char im_sign, unsigned char im_rel); unsigned char *ConvertBCInsnToBytes(unsigned char *ptr, bytecode *bc, int *len); diff --git a/modules/parsers/nasm/bison.y.in b/modules/parsers/nasm/bison.y.in index 036f5b76..edeb7b12 100644 --- a/modules/parsers/nasm/bison.y.in +++ b/modules/parsers/nasm/bison.y.in @@ -1,4 +1,4 @@ -/* $Id: bison.y.in,v 1.1 2001/05/15 05:20:39 peter Exp $ +/* $Id: bison.y.in,v 1.2 2001/05/18 21:42:31 peter Exp $ * Main bison parser * * Copyright (C) 2001 Peter Johnson @@ -327,106 +327,106 @@ instrbase: aaa ; aaa: INS_AAA { - BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } ; aad: INS_AAD { - BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } | INS_AAD imm8 { - BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1); + BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1, 0, 0); } ; idiv: INS_IDIV rm8x { - BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0, 0, 0); } | INS_IDIV rm16x { - BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0); } | INS_IDIV rm32x { - BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0); } ; imul: INS_IMUL rm8x { - BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0, 0, 0); } | INS_IMUL rm16x { - BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0); } | INS_IMUL rm32x { - BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0); } | INS_IMUL reg16 ',' rm16 { - BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0); } | INS_IMUL reg32 ',' rm32 { - BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0); } | INS_IMUL reg16 ',' rm16 ',' imm8x { - BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1); + BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0); } | INS_IMUL reg32 ',' rm32 ',' imm8x { - BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1); + BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0); } | INS_IMUL reg16 ',' rm16 ',' imm16 { - BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2); + BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2, 1, 0); } | INS_IMUL reg32 ',' rm32 ',' imm32 { - BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4); + BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4, 1, 0); } | INS_IMUL reg16 ',' imm8x { - BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1); + BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0); } | INS_IMUL reg32 ',' imm8x { - BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1); + BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0); } | INS_IMUL reg16 ',' imm16 { - BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2); + BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2, 1, 0); } | INS_IMUL reg32 ',' imm32 { - BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4); + BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4, 1, 0); } ; in: INS_IN REG_AL ',' imm8 { - BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1); + BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0); } | INS_IN REG_AX ',' imm8 { - BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1); + BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0); } | INS_IN REG_EAX ',' imm8 { - BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1); + BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0); } | INS_IN REG_AL ',' REG_DX { - BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } | INS_IN REG_AX ',' REG_DX { - BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } | INS_IN REG_EAX ',' REG_DX { - BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } ; loopz: INS_LOOPZ imm1632 { - BuildBC_Insn_Rel(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1)); + BuildBC_Insn(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1); } | INS_LOOPZ imm1632 ',' REG_CX { - BuildBC_Insn_Rel(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1)); + BuildBC_Insn(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1); } | INS_LOOPZ imm1632 ',' REG_ECX { - BuildBC_Insn_Rel(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1)); + BuildBC_Insn(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1); } ; lsl: INS_LSL reg16 ',' rm16 { - BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0); } | INS_LSL reg32 ',' rm32 { - BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0); } ; diff --git a/modules/parsers/nasm/nasm-bison.y b/modules/parsers/nasm/nasm-bison.y index 77cc3be2..3416da0a 100644 --- a/modules/parsers/nasm/nasm-bison.y +++ b/modules/parsers/nasm/nasm-bison.y @@ -1,4 +1,4 @@ -/* $Id: nasm-bison.y,v 1.1 2001/05/15 05:20:39 peter Exp $ +/* $Id: nasm-bison.y,v 1.2 2001/05/18 21:42:31 peter Exp $ * Main bison parser * * Copyright (C) 2001 Peter Johnson @@ -327,106 +327,106 @@ instrbase: aaa ; aaa: INS_AAA { - BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } ; aad: INS_AAD { - BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } | INS_AAD imm8 { - BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1); + BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1, 0, 0); } ; idiv: INS_IDIV rm8x { - BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0, 0, 0); } | INS_IDIV rm16x { - BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0); } | INS_IDIV rm32x { - BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0); } ; imul: INS_IMUL rm8x { - BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0, 0, 0); } | INS_IMUL rm16x { - BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0); } | INS_IMUL rm32x { - BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0); } | INS_IMUL reg16 ',' rm16 { - BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0); } | INS_IMUL reg32 ',' rm32 { - BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0); } | INS_IMUL reg16 ',' rm16 ',' imm8x { - BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1); + BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0); } | INS_IMUL reg32 ',' rm32 ',' imm8x { - BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1); + BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0); } | INS_IMUL reg16 ',' rm16 ',' imm16 { - BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2); + BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2, 1, 0); } | INS_IMUL reg32 ',' rm32 ',' imm32 { - BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4); + BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4, 1, 0); } | INS_IMUL reg16 ',' imm8x { - BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1); + BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0); } | INS_IMUL reg32 ',' imm8x { - BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1); + BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0); } | INS_IMUL reg16 ',' imm16 { - BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2); + BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2, 1, 0); } | INS_IMUL reg32 ',' imm32 { - BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4); + BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4, 1, 0); } ; in: INS_IN REG_AL ',' imm8 { - BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1); + BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0); } | INS_IN REG_AX ',' imm8 { - BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1); + BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0); } | INS_IN REG_EAX ',' imm8 { - BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1); + BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0); } | INS_IN REG_AL ',' REG_DX { - BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } | INS_IN REG_AX ',' REG_DX { - BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } | INS_IN REG_EAX ',' REG_DX { - BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } ; loopz: INS_LOOPZ imm1632 { - BuildBC_Insn_Rel(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1)); + BuildBC_Insn(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1); } | INS_LOOPZ imm1632 ',' REG_CX { - BuildBC_Insn_Rel(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1)); + BuildBC_Insn(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1); } | INS_LOOPZ imm1632 ',' REG_ECX { - BuildBC_Insn_Rel(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1)); + BuildBC_Insn(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1); } ; lsl: INS_LSL reg16 ',' rm16 { - BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0); } | INS_LSL reg32 ',' rm32 { - BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0); } ; diff --git a/src/bison.y b/src/bison.y index cc04b9b5..16b7157c 100644 --- a/src/bison.y +++ b/src/bison.y @@ -1,4 +1,4 @@ -/* $Id: bison.y,v 1.1 2001/05/15 05:20:39 peter Exp $ +/* $Id: bison.y,v 1.2 2001/05/18 21:42:31 peter Exp $ * Main bison parser * * Copyright (C) 2001 Peter Johnson @@ -327,106 +327,106 @@ instrbase: aaa ; aaa: INS_AAA { - BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } ; aad: INS_AAD { - BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } | INS_AAD imm8 { - BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1); + BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1, 0, 0); } ; idiv: INS_IDIV rm8x { - BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0, 0, 0); } | INS_IDIV rm16x { - BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0); } | INS_IDIV rm32x { - BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0); } ; imul: INS_IMUL rm8x { - BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0, 0, 0); } | INS_IMUL rm16x { - BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0); } | INS_IMUL rm32x { - BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0); } | INS_IMUL reg16 ',' rm16 { - BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0); } | INS_IMUL reg32 ',' rm32 { - BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0); } | INS_IMUL reg16 ',' rm16 ',' imm8x { - BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1); + BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0); } | INS_IMUL reg32 ',' rm32 ',' imm8x { - BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1); + BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0); } | INS_IMUL reg16 ',' rm16 ',' imm16 { - BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2); + BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2, 1, 0); } | INS_IMUL reg32 ',' rm32 ',' imm32 { - BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4); + BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4, 1, 0); } | INS_IMUL reg16 ',' imm8x { - BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1); + BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0); } | INS_IMUL reg32 ',' imm8x { - BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1); + BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0); } | INS_IMUL reg16 ',' imm16 { - BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2); + BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2, 1, 0); } | INS_IMUL reg32 ',' imm32 { - BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4); + BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4, 1, 0); } ; in: INS_IN REG_AL ',' imm8 { - BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1); + BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0); } | INS_IN REG_AX ',' imm8 { - BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1); + BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0); } | INS_IN REG_EAX ',' imm8 { - BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1); + BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0); } | INS_IN REG_AL ',' REG_DX { - BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } | INS_IN REG_AX ',' REG_DX { - BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } | INS_IN REG_EAX ',' REG_DX { - BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } ; loopz: INS_LOOPZ imm1632 { - BuildBC_Insn_Rel(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1)); + BuildBC_Insn(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1); } | INS_LOOPZ imm1632 ',' REG_CX { - BuildBC_Insn_Rel(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1)); + BuildBC_Insn(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1); } | INS_LOOPZ imm1632 ',' REG_ECX { - BuildBC_Insn_Rel(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1)); + BuildBC_Insn(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1); } ; lsl: INS_LSL reg16 ',' rm16 { - BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0); } | INS_LSL reg32 ',' rm32 { - BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0); } ; diff --git a/src/bison.y.in b/src/bison.y.in index 036f5b76..edeb7b12 100644 --- a/src/bison.y.in +++ b/src/bison.y.in @@ -1,4 +1,4 @@ -/* $Id: bison.y.in,v 1.1 2001/05/15 05:20:39 peter Exp $ +/* $Id: bison.y.in,v 1.2 2001/05/18 21:42:31 peter Exp $ * Main bison parser * * Copyright (C) 2001 Peter Johnson @@ -327,106 +327,106 @@ instrbase: aaa ; aaa: INS_AAA { - BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } ; aad: INS_AAD { - BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } | INS_AAD imm8 { - BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1); + BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1, 0, 0); } ; idiv: INS_IDIV rm8x { - BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0, 0, 0); } | INS_IDIV rm16x { - BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0); } | INS_IDIV rm32x { - BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0); } ; imul: INS_IMUL rm8x { - BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0, 0, 0); } | INS_IMUL rm16x { - BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0); } | INS_IMUL rm32x { - BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0); } | INS_IMUL reg16 ',' rm16 { - BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0); } | INS_IMUL reg32 ',' rm32 { - BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0); } | INS_IMUL reg16 ',' rm16 ',' imm8x { - BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1); + BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0); } | INS_IMUL reg32 ',' rm32 ',' imm8x { - BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1); + BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0); } | INS_IMUL reg16 ',' rm16 ',' imm16 { - BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2); + BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2, 1, 0); } | INS_IMUL reg32 ',' rm32 ',' imm32 { - BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4); + BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4, 1, 0); } | INS_IMUL reg16 ',' imm8x { - BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1); + BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0); } | INS_IMUL reg32 ',' imm8x { - BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1); + BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0); } | INS_IMUL reg16 ',' imm16 { - BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2); + BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2, 1, 0); } | INS_IMUL reg32 ',' imm32 { - BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4); + BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4, 1, 0); } ; in: INS_IN REG_AL ',' imm8 { - BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1); + BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0); } | INS_IN REG_AX ',' imm8 { - BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1); + BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0); } | INS_IN REG_EAX ',' imm8 { - BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1); + BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0); } | INS_IN REG_AL ',' REG_DX { - BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } | INS_IN REG_AX ',' REG_DX { - BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } | INS_IN REG_EAX ',' REG_DX { - BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } ; loopz: INS_LOOPZ imm1632 { - BuildBC_Insn_Rel(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1)); + BuildBC_Insn(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1); } | INS_LOOPZ imm1632 ',' REG_CX { - BuildBC_Insn_Rel(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1)); + BuildBC_Insn(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1); } | INS_LOOPZ imm1632 ',' REG_ECX { - BuildBC_Insn_Rel(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1)); + BuildBC_Insn(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1); } ; lsl: INS_LSL reg16 ',' rm16 { - BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0); } | INS_LSL reg32 ',' rm32 { - BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0); } ; diff --git a/src/bytecode.c b/src/bytecode.c index 3e9baf49..f784296f 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -1,4 +1,4 @@ -/* $Id: bytecode.c,v 1.1 2001/05/15 05:23:23 peter Exp $ +/* $Id: bytecode.c,v 1.2 2001/05/18 21:42:32 peter Exp $ * Bytecode utility functions * * Copyright (C) 2001 Peter Johnson @@ -23,13 +23,8 @@ #include "globals.h" #include "bytecode.h" -static void buildbc_insn_common(bytecode *bc, unsigned char opersize, - unsigned char opcode_len, unsigned char op0, unsigned char op1, - effaddr *ea_ptr, unsigned char spare); - static effaddr eff_static; static immval im_static; -static relval rel_static; unsigned char bytes_static[16]; /* FIXME: converting int to EA, but we don't know addrsize yet? @@ -88,29 +83,16 @@ immval *ConvertIntToImm(immval *ptr, unsigned long int_val) else ptr->len = 4; - return ptr; -} - -/* FIXME: This actually doesn't do anything useful yet :) */ -relval *ConvertImmToRel(relval *ptr, immval *im_ptr, - unsigned char rel_forcelen) -{ - if(!ptr) - ptr = &rel_static; - - if(im_ptr) { - ptr->val = im_ptr->val; - ptr->len = im_ptr->len; - } else { - ptr->len = 0; - } + ptr->isrel = 0; + ptr->isneg = 0; return ptr; } -static void buildbc_insn_common(bytecode *bc, unsigned char opersize, +void BuildBC_Insn(bytecode *bc, unsigned char opersize, unsigned char opcode_len, unsigned char op0, unsigned char op1, - effaddr *ea_ptr, unsigned char spare) + effaddr *ea_ptr, unsigned char spare, immval *im_ptr, + unsigned char im_len, unsigned char im_sign, unsigned char im_rel) { bc->next = (bytecode *)NULL; bc->type = BC_INSN; @@ -126,6 +108,15 @@ static void buildbc_insn_common(bytecode *bc, unsigned char opersize, bc->data.insn.ea.need_sib = 0; } + if(im_ptr) { + bc->data.insn.imm = *im_ptr; + } else { + bc->data.insn.imm.len = 0; + } + bc->data.insn.f_rel_imm = im_rel; + bc->data.insn.f_sign_imm = im_sign; + bc->data.insn.f_len_imm = im_len; + bc->data.insn.opcode[0] = op0; bc->data.insn.opcode[1] = op1; bc->data.insn.opcode_len = opcode_len; @@ -141,37 +132,6 @@ static void buildbc_insn_common(bytecode *bc, unsigned char opersize, bc->mode_bits = mode_bits; } - -void BuildBC_Insn(bytecode *bc, unsigned char opersize, - unsigned char opcode_len, unsigned char op0, unsigned char op1, - effaddr *ea_ptr, unsigned char spare, immval *im_ptr, - unsigned char im_forcelen) -{ - buildbc_insn_common(bc, opersize, opcode_len, op0, op1, ea_ptr, spare); - - if(im_ptr) { - bc->data.insn.imm.im = *im_ptr; - bc->data.insn.imm.im.len = im_forcelen; /* TODO: Add Warning */ - } else { - bc->data.insn.imm.im.len = 0; - } - bc->data.insn.isrel = 0; -} - -void BuildBC_Insn_Rel(bytecode *bc, unsigned char opersize, - unsigned char opcode_len, unsigned char op0, unsigned char op1, - effaddr *ea_ptr, unsigned char spare, relval *rel_ptr) -{ - buildbc_insn_common(bc, opersize, opcode_len, op0, op1, ea_ptr, spare); - - if(rel_ptr) { - bc->data.insn.imm.rel = *rel_ptr; - } else { - bc->data.insn.imm.rel.len = 0; - } - bc->data.insn.isrel = 1; -} - /* TODO: implement. Shouldn't be difficult. */ unsigned char *ConvertBCInsnToBytes(unsigned char *ptr, bytecode *bc, int *len) { @@ -197,15 +157,14 @@ void DebugPrintBC(bytecode *bc) (unsigned int)bc->data.insn.ea.modrm, (unsigned int)bc->data.insn.ea.sib, (unsigned int)bc->data.insn.ea.need_sib); - if(bc->data.insn.isrel) { - printf("Relative Offset:\n"); - printf(" Val=%lx Len=%u\n", bc->data.insn.imm.rel.val, - (unsigned int)bc->data.insn.imm.rel.len); - } else { - printf("Immediate Value:\n"); - printf(" Val=%lx Len=%u\n", bc->data.insn.imm.im.val, - (unsigned int)bc->data.insn.imm.im.len); - } + printf("Immediate/Relative Value:\n"); + printf(" Val=%lx Len=%u, IsRel=%u\n", bc->data.insn.imm.val, + (unsigned int)bc->data.insn.imm.len, + (unsigned int)bc->data.insn.imm.isrel); + printf(" FLen=%u, FRel=%u, FSign=%u\n", + (unsigned int)bc->data.insn.f_len_imm, + (unsigned int)bc->data.insn.f_rel_imm, + (unsigned int)bc->data.insn.f_sign_imm); printf("Opcode: %2x %2x OpLen=%u\n", (unsigned int)bc->data.insn.opcode[0], (unsigned int)bc->data.insn.opcode[1], diff --git a/src/bytecode.h b/src/bytecode.h index 658fc5cd..fce3b5f3 100644 --- a/src/bytecode.h +++ b/src/bytecode.h @@ -1,4 +1,4 @@ -/* $Id: bytecode.h,v 1.1 2001/05/15 05:28:06 peter Exp $ +/* $Id: bytecode.h,v 1.2 2001/05/18 21:42:31 peter Exp $ * Bytecode utility functions header file * * Copyright (C) 2001 Peter Johnson @@ -34,14 +34,11 @@ typedef struct effaddr_s { typedef struct immval_s { unsigned long val; - unsigned char len; /* length of val (in bytes) */ + unsigned char len; /* length of val (in bytes), 0 if none */ + unsigned char isrel; + unsigned char isneg; /* the value has been explicitly negated */ } immval; -typedef struct relval_s { - unsigned long val; - unsigned char len; /* length of val (in bytes) */ -} relval; - typedef struct bytecode_s { struct bytecode_s *next; @@ -50,15 +47,17 @@ typedef struct bytecode_s { union { struct { effaddr ea; /* effective address */ - union { - immval im; /* immediate value */ - relval rel; - } imm; + + immval imm; /* immediate or relative value */ + unsigned char f_len_imm; /* final imm length */ + unsigned char f_rel_imm; /* 1 if final imm should be rel */ + unsigned char f_sign_imm; /* 1 if final imm should be signed */ + unsigned char opcode[2]; /* opcode */ unsigned char opcode_len; + unsigned char opersize; /* 0 indicates no override */ unsigned char lockrep_pre; /* 0 indicates no prefix */ - unsigned char isrel; } insn; struct { unsigned char *data; @@ -81,17 +80,10 @@ effaddr *ConvertRegToEA(effaddr *ptr, unsigned long reg); immval *ConvertIntToImm(immval *ptr, unsigned long int_val); -relval *ConvertImmToRel(relval *ptr, immval *im_ptr, - unsigned char rel_forcelen); - void BuildBC_Insn(bytecode *bc, unsigned char opersize, unsigned char opcode_len, unsigned char op0, unsigned char op1, effaddr *ea_ptr, unsigned char spare, immval *im_ptr, - unsigned char im_forcelen); - -void BuildBC_Insn_Rel(bytecode *bc, unsigned char opersize, - unsigned char opcode_len, unsigned char op0, unsigned char op1, - effaddr *ea_ptr, unsigned char spare, relval *rel_ptr); + unsigned char im_len, unsigned char im_sign, unsigned char im_rel); unsigned char *ConvertBCInsnToBytes(unsigned char *ptr, bytecode *bc, int *len); diff --git a/src/parsers/nasm/bison.y.in b/src/parsers/nasm/bison.y.in index 036f5b76..edeb7b12 100644 --- a/src/parsers/nasm/bison.y.in +++ b/src/parsers/nasm/bison.y.in @@ -1,4 +1,4 @@ -/* $Id: bison.y.in,v 1.1 2001/05/15 05:20:39 peter Exp $ +/* $Id: bison.y.in,v 1.2 2001/05/18 21:42:31 peter Exp $ * Main bison parser * * Copyright (C) 2001 Peter Johnson @@ -327,106 +327,106 @@ instrbase: aaa ; aaa: INS_AAA { - BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } ; aad: INS_AAD { - BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } | INS_AAD imm8 { - BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1); + BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1, 0, 0); } ; idiv: INS_IDIV rm8x { - BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0, 0, 0); } | INS_IDIV rm16x { - BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0); } | INS_IDIV rm32x { - BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0); } ; imul: INS_IMUL rm8x { - BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0, 0, 0); } | INS_IMUL rm16x { - BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0); } | INS_IMUL rm32x { - BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0); } | INS_IMUL reg16 ',' rm16 { - BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0); } | INS_IMUL reg32 ',' rm32 { - BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0); } | INS_IMUL reg16 ',' rm16 ',' imm8x { - BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1); + BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0); } | INS_IMUL reg32 ',' rm32 ',' imm8x { - BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1); + BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0); } | INS_IMUL reg16 ',' rm16 ',' imm16 { - BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2); + BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2, 1, 0); } | INS_IMUL reg32 ',' rm32 ',' imm32 { - BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4); + BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4, 1, 0); } | INS_IMUL reg16 ',' imm8x { - BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1); + BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0); } | INS_IMUL reg32 ',' imm8x { - BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1); + BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0); } | INS_IMUL reg16 ',' imm16 { - BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2); + BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2, 1, 0); } | INS_IMUL reg32 ',' imm32 { - BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4); + BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4, 1, 0); } ; in: INS_IN REG_AL ',' imm8 { - BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1); + BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0); } | INS_IN REG_AX ',' imm8 { - BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1); + BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0); } | INS_IN REG_EAX ',' imm8 { - BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1); + BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0); } | INS_IN REG_AL ',' REG_DX { - BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } | INS_IN REG_AX ',' REG_DX { - BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } | INS_IN REG_EAX ',' REG_DX { - BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } ; loopz: INS_LOOPZ imm1632 { - BuildBC_Insn_Rel(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1)); + BuildBC_Insn(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1); } | INS_LOOPZ imm1632 ',' REG_CX { - BuildBC_Insn_Rel(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1)); + BuildBC_Insn(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1); } | INS_LOOPZ imm1632 ',' REG_ECX { - BuildBC_Insn_Rel(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1)); + BuildBC_Insn(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1); } ; lsl: INS_LSL reg16 ',' rm16 { - BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0); } | INS_LSL reg32 ',' rm32 { - BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0); } ; diff --git a/src/parsers/nasm/nasm-bison.y b/src/parsers/nasm/nasm-bison.y index 77cc3be2..3416da0a 100644 --- a/src/parsers/nasm/nasm-bison.y +++ b/src/parsers/nasm/nasm-bison.y @@ -1,4 +1,4 @@ -/* $Id: nasm-bison.y,v 1.1 2001/05/15 05:20:39 peter Exp $ +/* $Id: nasm-bison.y,v 1.2 2001/05/18 21:42:31 peter Exp $ * Main bison parser * * Copyright (C) 2001 Peter Johnson @@ -327,106 +327,106 @@ instrbase: aaa ; aaa: INS_AAA { - BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0x37, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } ; aad: INS_AAD { - BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 2, 0xD5, 0x0A, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } | INS_AAD imm8 { - BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1); + BuildBC_Insn(&$$, 0, 1, 0xD5, 0, (effaddr *)NULL, 0, &$2, 1, 0, 0); } ; idiv: INS_IDIV rm8x { - BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 7, (immval *)NULL, 0, 0, 0); } | INS_IDIV rm16x { - BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0); } | INS_IDIV rm32x { - BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 7, (immval *)NULL, 0, 0, 0); } ; imul: INS_IMUL rm8x { - BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0xF6, 0, &$2, 5, (immval *)NULL, 0, 0, 0); } | INS_IMUL rm16x { - BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0); } | INS_IMUL rm32x { - BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 1, 0xF7, 0, &$2, 5, (immval *)NULL, 0, 0, 0); } | INS_IMUL reg16 ',' rm16 { - BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0); } | INS_IMUL reg32 ',' rm32 { - BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 2, 0x0F, 0xAF, &$4, $2, (immval *)NULL, 0, 0, 0); } | INS_IMUL reg16 ',' rm16 ',' imm8x { - BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1); + BuildBC_Insn(&$$, 16, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0); } | INS_IMUL reg32 ',' rm32 ',' imm8x { - BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1); + BuildBC_Insn(&$$, 32, 1, 0x6B, 0, &$4, $2, &$6, 1, 1, 0); } | INS_IMUL reg16 ',' rm16 ',' imm16 { - BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2); + BuildBC_Insn(&$$, 16, 1, 0x69, 0, &$4, $2, &$6, 2, 1, 0); } | INS_IMUL reg32 ',' rm32 ',' imm32 { - BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4); + BuildBC_Insn(&$$, 32, 1, 0x69, 0, &$4, $2, &$6, 4, 1, 0); } | INS_IMUL reg16 ',' imm8x { - BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1); + BuildBC_Insn(&$$, 16, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0); } | INS_IMUL reg32 ',' imm8x { - BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1); + BuildBC_Insn(&$$, 32, 1, 0x6B, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 1, 1, 0); } | INS_IMUL reg16 ',' imm16 { - BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2); + BuildBC_Insn(&$$, 16, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 2, 1, 0); } | INS_IMUL reg32 ',' imm32 { - BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4); + BuildBC_Insn(&$$, 32, 1, 0x69, 0, ConvertRegToEA((effaddr *)NULL, $2), $2, &$4, 4, 1, 0); } ; in: INS_IN REG_AL ',' imm8 { - BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1); + BuildBC_Insn(&$$, 0, 1, 0xE4, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0); } | INS_IN REG_AX ',' imm8 { - BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1); + BuildBC_Insn(&$$, 16, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0); } | INS_IN REG_EAX ',' imm8 { - BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1); + BuildBC_Insn(&$$, 32, 1, 0xE5, 0, (effaddr *)NULL, 0, &$4, 1, 0, 0); } | INS_IN REG_AL ',' REG_DX { - BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 0, 1, 0xEC, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } | INS_IN REG_AX ',' REG_DX { - BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } | INS_IN REG_EAX ',' REG_DX { - BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 1, 0xED, 0, (effaddr *)NULL, 0, (immval *)NULL, 0, 0, 0); } ; loopz: INS_LOOPZ imm1632 { - BuildBC_Insn_Rel(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1)); + BuildBC_Insn(&$$, 0, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1); } | INS_LOOPZ imm1632 ',' REG_CX { - BuildBC_Insn_Rel(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1)); + BuildBC_Insn(&$$, 16, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1); } | INS_LOOPZ imm1632 ',' REG_ECX { - BuildBC_Insn_Rel(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, ConvertImmToRel((relval *)NULL, &$2, 1)); + BuildBC_Insn(&$$, 32, 1, 0xE1, 0, (effaddr *)NULL, 0, &$2, 1, 1, 1); } ; lsl: INS_LSL reg16 ',' rm16 { - BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 16, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0); } | INS_LSL reg32 ',' rm32 { - BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0); + BuildBC_Insn(&$$, 32, 2, 0x0F, 0x03, &$4, $2, (immval *)NULL, 0, 0, 0); } ;