instruction (which takes two immediate values).
To facilitate this change, changed meaning of "len" in bytecode structure
to be only the length of the offset (from being 1+length, the 1 being for the
Mod/RM byte), and added a need_modrm flag similar to the need_sib flag in
functionality.
svn path=/trunk/yasm/; revision=22
-/* $Id: bytecode.h,v 1.3 2001/05/21 19:32:51 mu Exp $
+/* $Id: bytecode.h,v 1.4 2001/05/21 20:17:51 peter Exp $
* Bytecode utility functions header file
*
* Copyright (C) 2001 Peter Johnson
typedef struct effaddr_s {
unsigned long offset;
- unsigned char len; /* length of offset + 1 (for RM) (in bytes) */
- unsigned char addrsize; /* 8, 16, or 32, 0 indicates no override */
+ unsigned char len; /* length of offset (in bytes), 0 if none */
+ unsigned char addrsize; /* 16 or 32, 0 indicates no override */
unsigned char segment; /* segment override, 0 if none */
unsigned char modrm;
+ unsigned char need_modrm; /* 1 if Mod/RM byte needed, 0 if not */
unsigned char sib;
- unsigned char need_sib;
+ unsigned char need_sib; /* 1 if SIB byte needed, 0 if not */
} effaddr;
typedef struct immval_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);
immval *ConvertIntToImm(immval *ptr, unsigned long int_val);
-/* $Id: bytecode.c,v 1.3 2001/05/21 19:32:51 mu Exp $
+/* $Id: bytecode.c,v 1.4 2001/05/21 20:17:51 peter Exp $
* Bytecode utility functions
*
* Copyright (C) 2001 Peter Johnson
#include <stdio.h>
#include "globals.h"
#include "bytecode.h"
+#include "errwarn.h"
static effaddr eff_static;
static immval im_static;
if(mode_bits == 32) {
ptr->offset = int_val;
- ptr->len = 5;
+ ptr->len = 4;
ptr->modrm = 0x05; /* Mod=00 R/M=disp32, Reg=0 */
+ ptr->need_modrm = 1;
ptr->need_sib = 0;
} else if(mode_bits == 16) {
ptr->offset = int_val & 0xFFFF;
- ptr->len = 3;
+ ptr->len = 2;
ptr->modrm = 0x06; /* Mod=00 R/M=disp16, Reg=0 */
+ ptr->need_modrm = 1;
ptr->need_sib = 0;
} else
return (effaddr *)NULL;
if(!ptr)
ptr = &eff_static;
- ptr->len = 1;
+ ptr->len = 0;
ptr->addrsize = 0;
ptr->segment = 0;
ptr->modrm = 0xC0 | (reg & 0x07); /* Mod=11, R/M=Reg, Reg=0 */
+ ptr->need_modrm = 1;
+ ptr->need_sib = 0;
+
+ return ptr;
+}
+
+effaddr *ConvertImmToEA(effaddr *ptr, immval *im_ptr, unsigned char im_len)
+{
+ if(!ptr)
+ ptr = &eff_static;
+
+ ptr->offset = im_ptr->val;
+ if(im_ptr->len > im_len)
+ Warning(WARN_VALUE_EXCEEDS_BOUNDS, (char *)NULL, "word");
+ ptr->len = im_len;
+ ptr->addrsize = 0;
+ ptr->segment = 0;
+ ptr->need_modrm = 0;
ptr->need_sib = 0;
return ptr;
printf(" AddrSize=%u SegmentOv=%2x\n",
(unsigned int)bc->data.insn.ea.addrsize,
(unsigned int)bc->data.insn.ea.segment);
- printf(" ModRM=%2x SIB=%2x NeedSIB=%u\n",
+ printf(" ModRM=%2x NeedRM=%u SIB=%2x NeedSIB=%u\n",
(unsigned int)bc->data.insn.ea.modrm,
+ (unsigned int)bc->data.insn.ea.need_modrm,
(unsigned int)bc->data.insn.ea.sib,
(unsigned int)bc->data.insn.ea.need_sib);
printf("Immediate/Relative Value:\n");
-/* $Id: bytecode.h,v 1.3 2001/05/21 19:32:51 mu Exp $
+/* $Id: bytecode.h,v 1.4 2001/05/21 20:17:51 peter Exp $
* Bytecode utility functions header file
*
* Copyright (C) 2001 Peter Johnson
typedef struct effaddr_s {
unsigned long offset;
- unsigned char len; /* length of offset + 1 (for RM) (in bytes) */
- unsigned char addrsize; /* 8, 16, or 32, 0 indicates no override */
+ unsigned char len; /* length of offset (in bytes), 0 if none */
+ unsigned char addrsize; /* 16 or 32, 0 indicates no override */
unsigned char segment; /* segment override, 0 if none */
unsigned char modrm;
+ unsigned char need_modrm; /* 1 if Mod/RM byte needed, 0 if not */
unsigned char sib;
- unsigned char need_sib;
+ unsigned char need_sib; /* 1 if SIB byte needed, 0 if not */
} effaddr;
typedef struct immval_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);
immval *ConvertIntToImm(immval *ptr, unsigned long int_val);
-/* $Id: bytecode.c,v 1.3 2001/05/21 19:32:51 mu Exp $
+/* $Id: bytecode.c,v 1.4 2001/05/21 20:17:51 peter Exp $
* Bytecode utility functions
*
* Copyright (C) 2001 Peter Johnson
#include <stdio.h>
#include "globals.h"
#include "bytecode.h"
+#include "errwarn.h"
static effaddr eff_static;
static immval im_static;
if(mode_bits == 32) {
ptr->offset = int_val;
- ptr->len = 5;
+ ptr->len = 4;
ptr->modrm = 0x05; /* Mod=00 R/M=disp32, Reg=0 */
+ ptr->need_modrm = 1;
ptr->need_sib = 0;
} else if(mode_bits == 16) {
ptr->offset = int_val & 0xFFFF;
- ptr->len = 3;
+ ptr->len = 2;
ptr->modrm = 0x06; /* Mod=00 R/M=disp16, Reg=0 */
+ ptr->need_modrm = 1;
ptr->need_sib = 0;
} else
return (effaddr *)NULL;
if(!ptr)
ptr = &eff_static;
- ptr->len = 1;
+ ptr->len = 0;
ptr->addrsize = 0;
ptr->segment = 0;
ptr->modrm = 0xC0 | (reg & 0x07); /* Mod=11, R/M=Reg, Reg=0 */
+ ptr->need_modrm = 1;
+ ptr->need_sib = 0;
+
+ return ptr;
+}
+
+effaddr *ConvertImmToEA(effaddr *ptr, immval *im_ptr, unsigned char im_len)
+{
+ if(!ptr)
+ ptr = &eff_static;
+
+ ptr->offset = im_ptr->val;
+ if(im_ptr->len > im_len)
+ Warning(WARN_VALUE_EXCEEDS_BOUNDS, (char *)NULL, "word");
+ ptr->len = im_len;
+ ptr->addrsize = 0;
+ ptr->segment = 0;
+ ptr->need_modrm = 0;
ptr->need_sib = 0;
return ptr;
printf(" AddrSize=%u SegmentOv=%2x\n",
(unsigned int)bc->data.insn.ea.addrsize,
(unsigned int)bc->data.insn.ea.segment);
- printf(" ModRM=%2x SIB=%2x NeedSIB=%u\n",
+ printf(" ModRM=%2x NeedRM=%u SIB=%2x NeedSIB=%u\n",
(unsigned int)bc->data.insn.ea.modrm,
+ (unsigned int)bc->data.insn.ea.need_modrm,
(unsigned int)bc->data.insn.ea.sib,
(unsigned int)bc->data.insn.ea.need_sib);
printf("Immediate/Relative Value:\n");
-/* $Id: bytecode.h,v 1.3 2001/05/21 19:32:51 mu Exp $
+/* $Id: bytecode.h,v 1.4 2001/05/21 20:17:51 peter Exp $
* Bytecode utility functions header file
*
* Copyright (C) 2001 Peter Johnson
typedef struct effaddr_s {
unsigned long offset;
- unsigned char len; /* length of offset + 1 (for RM) (in bytes) */
- unsigned char addrsize; /* 8, 16, or 32, 0 indicates no override */
+ unsigned char len; /* length of offset (in bytes), 0 if none */
+ unsigned char addrsize; /* 16 or 32, 0 indicates no override */
unsigned char segment; /* segment override, 0 if none */
unsigned char modrm;
+ unsigned char need_modrm; /* 1 if Mod/RM byte needed, 0 if not */
unsigned char sib;
- unsigned char need_sib;
+ unsigned char need_sib; /* 1 if SIB byte needed, 0 if not */
} effaddr;
typedef struct immval_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);
immval *ConvertIntToImm(immval *ptr, unsigned long int_val);