[9] | 1 | /* asm86.h - 80X86 assembly intermediate Author: Kees J. Bot
|
---|
| 2 | * 27 Jun 1993
|
---|
| 3 | */
|
---|
| 4 |
|
---|
| 5 | typedef enum opcode { /* 80486 opcodes, from the i486 reference manual.
|
---|
| 6 | * Synonyms left out, some new words invented.
|
---|
| 7 | */
|
---|
| 8 | DOT_ALIGN,
|
---|
| 9 | DOT_ASCII, DOT_ASCIZ,
|
---|
| 10 | DOT_ASSERT, /* Pseudo's invented */
|
---|
| 11 | DOT_BASE,
|
---|
| 12 | DOT_COMM, DOT_LCOMM,
|
---|
| 13 | DOT_DATA1,
|
---|
| 14 | DOT_DATA2,
|
---|
| 15 | DOT_DATA4,
|
---|
| 16 | DOT_DEFINE, DOT_EXTERN,
|
---|
| 17 | DOT_EQU,
|
---|
| 18 | DOT_FILE, DOT_LINE,
|
---|
| 19 | DOT_LABEL,
|
---|
| 20 | DOT_LIST, DOT_NOLIST,
|
---|
| 21 | DOT_SPACE,
|
---|
| 22 | DOT_SYMB,
|
---|
| 23 | DOT_TEXT, DOT_ROM, DOT_DATA, DOT_BSS, DOT_END,
|
---|
| 24 | DOT_USE16, DOT_USE32,
|
---|
| 25 | AAA,
|
---|
| 26 | AAD,
|
---|
| 27 | AAM,
|
---|
| 28 | AAS,
|
---|
| 29 | ADC,
|
---|
| 30 | ADD,
|
---|
| 31 | AND,
|
---|
| 32 | ARPL,
|
---|
| 33 | BOUND,
|
---|
| 34 | BSF,
|
---|
| 35 | BSR,
|
---|
| 36 | BSWAP,
|
---|
| 37 | BT,
|
---|
| 38 | BTC,
|
---|
| 39 | BTR,
|
---|
| 40 | BTS,
|
---|
| 41 | CALL, CALLF, /* CALLF added */
|
---|
| 42 | CBW,
|
---|
| 43 | CLC,
|
---|
| 44 | CLD,
|
---|
| 45 | CLI,
|
---|
| 46 | CLTS,
|
---|
| 47 | CMC,
|
---|
| 48 | CMP,
|
---|
| 49 | CMPS,
|
---|
| 50 | CMPXCHG,
|
---|
| 51 | CWD,
|
---|
| 52 | DAA,
|
---|
| 53 | DAS,
|
---|
| 54 | DEC,
|
---|
| 55 | DIV,
|
---|
| 56 | ENTER,
|
---|
| 57 | F2XM1,
|
---|
| 58 | FABS,
|
---|
| 59 | FADD, FADDD, FADDS, FADDP, FIADDL, FIADDS,
|
---|
| 60 | FBLD,
|
---|
| 61 | FBSTP,
|
---|
| 62 | FCHS,
|
---|
| 63 | FCLEX,
|
---|
| 64 | FCOMD, FCOMS, FCOMPD, FCOMPS, FCOMPP,
|
---|
| 65 | FCOS,
|
---|
| 66 | FDECSTP,
|
---|
| 67 | FDIVD, FDIVS, FDIVP, FIDIVL, FIDIVS,
|
---|
| 68 | FDIVRD, FDIVRS, FDIVRP, FIDIVRL, FIDIVRS,
|
---|
| 69 | FFREE,
|
---|
| 70 | FICOM, FICOMP,
|
---|
| 71 | FILDQ, FILDL, FILDS,
|
---|
| 72 | FINCSTP,
|
---|
| 73 | FINIT,
|
---|
| 74 | FISTL, FISTS, FISTP,
|
---|
| 75 | FLDX, FLDD, FLDS,
|
---|
| 76 | FLD1, FLDL2T, FLDL2E, FLDPI, FLDLG2, FLDLN2, FLDZ,
|
---|
| 77 | FLDCW,
|
---|
| 78 | FLDENV,
|
---|
| 79 | FMULD, FMULS, FMULP, FIMULL, FIMULS,
|
---|
| 80 | FNOP,
|
---|
| 81 | FPATAN,
|
---|
| 82 | FPREM,
|
---|
| 83 | FPREM1,
|
---|
| 84 | FPTAN,
|
---|
| 85 | FRNDINT,
|
---|
| 86 | FRSTOR,
|
---|
| 87 | FSAVE,
|
---|
| 88 | FSCALE,
|
---|
| 89 | FSIN,
|
---|
| 90 | FSINCOS,
|
---|
| 91 | FSQRT,
|
---|
| 92 | FSTD, FSTS, FSTPX, FSTPD, FSTPS,
|
---|
| 93 | FSTCW,
|
---|
| 94 | FSTENV,
|
---|
| 95 | FSTSW,
|
---|
| 96 | FSUBD, FSUBS, FSUBP, FISUBL, FISUBS,
|
---|
| 97 | FSUBRD, FSUBRS, FSUBPR, FISUBRL, FISUBRS,
|
---|
| 98 | FTST,
|
---|
| 99 | FUCOM, FUCOMP, FUCOMPP,
|
---|
| 100 | FXAM,
|
---|
| 101 | FXCH,
|
---|
| 102 | FXTRACT,
|
---|
| 103 | FYL2X,
|
---|
| 104 | FYL2XP1,
|
---|
| 105 | HLT,
|
---|
| 106 | IDIV,
|
---|
| 107 | IMUL,
|
---|
| 108 | IN,
|
---|
| 109 | INC,
|
---|
| 110 | INS,
|
---|
| 111 | INT, INTO,
|
---|
| 112 | INVD,
|
---|
| 113 | INVLPG,
|
---|
| 114 | IRET, IRETD,
|
---|
| 115 | JA, JAE, JB, JBE, JCXZ, JE, JG, JGE, JL,
|
---|
| 116 | JLE, JNE, JNO, JNP, JNS, JO, JP, JS,
|
---|
| 117 | JMP, JMPF, /* JMPF added */
|
---|
| 118 | LAHF,
|
---|
| 119 | LAR,
|
---|
| 120 | LEA,
|
---|
| 121 | LEAVE,
|
---|
| 122 | LGDT, LIDT,
|
---|
| 123 | LGS, LSS, LDS, LES, LFS,
|
---|
| 124 | LLDT,
|
---|
| 125 | LMSW,
|
---|
| 126 | LOCK,
|
---|
| 127 | LODS,
|
---|
| 128 | LOOP, LOOPE, LOOPNE,
|
---|
| 129 | LSL,
|
---|
| 130 | LTR,
|
---|
| 131 | MOV,
|
---|
| 132 | MOVS,
|
---|
| 133 | MOVSX,
|
---|
| 134 | MOVSXB,
|
---|
| 135 | MOVZX,
|
---|
| 136 | MOVZXB,
|
---|
| 137 | MUL,
|
---|
| 138 | NEG,
|
---|
| 139 | NOP,
|
---|
| 140 | NOT,
|
---|
| 141 | OR,
|
---|
| 142 | OUT,
|
---|
| 143 | OUTS,
|
---|
| 144 | POP,
|
---|
| 145 | POPA,
|
---|
| 146 | POPF,
|
---|
| 147 | PUSH,
|
---|
| 148 | PUSHA,
|
---|
| 149 | PUSHF,
|
---|
| 150 | RCL, RCR, ROL, ROR,
|
---|
| 151 | RET, RETF, /* RETF added */
|
---|
| 152 | SAHF,
|
---|
| 153 | SAL, SAR, SHL, SHR,
|
---|
| 154 | SBB,
|
---|
| 155 | SCAS,
|
---|
| 156 | SETA, SETAE, SETB, SETBE, SETE, SETG, SETGE, SETL,
|
---|
| 157 | SETLE, SETNE, SETNO, SETNP, SETNS, SETO, SETP, SETS,
|
---|
| 158 | SGDT, SIDT,
|
---|
| 159 | SHLD,
|
---|
| 160 | SHRD,
|
---|
| 161 | SLDT,
|
---|
| 162 | SMSW,
|
---|
| 163 | STC,
|
---|
| 164 | STD,
|
---|
| 165 | STI,
|
---|
| 166 | STOS,
|
---|
| 167 | STR,
|
---|
| 168 | SUB,
|
---|
| 169 | TEST,
|
---|
| 170 | VERR, VERW,
|
---|
| 171 | WAIT,
|
---|
| 172 | WBINVD,
|
---|
| 173 | XADD,
|
---|
| 174 | XCHG,
|
---|
| 175 | XLAT,
|
---|
| 176 | XOR
|
---|
| 177 | } opcode_t;
|
---|
| 178 |
|
---|
| 179 | #define is_pseudo(o) ((o) <= DOT_USE32)
|
---|
| 180 | #define N_OPCODES ((int) XOR + 1)
|
---|
| 181 |
|
---|
| 182 | #define OPZ 0x01 /* Operand size prefix. */
|
---|
| 183 | #define ADZ 0x02 /* Address size prefix. */
|
---|
| 184 |
|
---|
| 185 | typedef enum optype {
|
---|
| 186 | PSEUDO, JUMP, BYTE, WORD, OWORD /* Ordered list! */
|
---|
| 187 | } optype_t;
|
---|
| 188 |
|
---|
| 189 | typedef enum repeat {
|
---|
| 190 | ONCE, REP, REPE, REPNE
|
---|
| 191 | } repeat_t;
|
---|
| 192 |
|
---|
| 193 | typedef enum segment {
|
---|
| 194 | DEFSEG, CSEG, DSEG, ESEG, FSEG, GSEG, SSEG
|
---|
| 195 | } segment_t;
|
---|
| 196 |
|
---|
| 197 | typedef struct expression {
|
---|
| 198 | int operator;
|
---|
| 199 | struct expression *left, *middle, *right;
|
---|
| 200 | char *name;
|
---|
| 201 | size_t len;
|
---|
| 202 | unsigned magic;
|
---|
| 203 | } expression_t;
|
---|
| 204 |
|
---|
| 205 | typedef struct asm86 {
|
---|
| 206 | opcode_t opcode; /* DOT_TEXT, MOV, ... */
|
---|
| 207 | char *file; /* Name of the file it is found in. */
|
---|
| 208 | long line; /* Line number. */
|
---|
| 209 | optype_t optype; /* Type of operands: byte, word... */
|
---|
| 210 | int oaz; /* Operand/address size prefix? */
|
---|
| 211 | repeat_t rep; /* Repeat prefix used on this instr. */
|
---|
| 212 | segment_t seg; /* Segment override. */
|
---|
| 213 | expression_t *args; /* Arguments in ACK order. */
|
---|
| 214 | unsigned magic;
|
---|
| 215 | } asm86_t;
|
---|
| 216 |
|
---|
| 217 | expression_t *new_expr(void);
|
---|
| 218 | void del_expr(expression_t *a);
|
---|
| 219 | asm86_t *new_asm86(void);
|
---|
| 220 | void del_asm86(asm86_t *a);
|
---|
| 221 | int isregister(const char *name);
|
---|
| 222 |
|
---|
| 223 | /*
|
---|
| 224 | * Format of the arguments of the asm86_t structure:
|
---|
| 225 | *
|
---|
| 226 | *
|
---|
| 227 | * ACK assembly operands expression_t cell:
|
---|
| 228 | * or part of operand: {operator, left, middle, right, name, len}
|
---|
| 229 | *
|
---|
| 230 | * [expr] {'[', nil, expr, nil}
|
---|
| 231 | * word {'W', nil, nil, nil, word}
|
---|
| 232 | * "string" {'S', nil, nil, nil, "string", strlen("string")}
|
---|
| 233 | * label = expr {'=', nil, expr, nil, label}
|
---|
| 234 | * expr * expr {'*', expr, nil, expr}
|
---|
| 235 | * - expr {'-', nil, expr, nil}
|
---|
| 236 | * (memory) {'(', nil, memory, nil}
|
---|
| 237 | * offset(base)(index*n) {'O', offset, base, index*n}
|
---|
| 238 | * base {'B', nil, nil, nil, base}
|
---|
| 239 | * index*4 {'4', nil, nil, nil, index}
|
---|
| 240 | * operand, oplist {',', operand, nil, oplist}
|
---|
| 241 | * label : {':', nil, nil, nil, label}
|
---|
| 242 | *
|
---|
| 243 | * The precedence of operators is ignored. The expression is simply copied
|
---|
| 244 | * as is, including parentheses. Problems like missing operators in the
|
---|
| 245 | * target language will have to be handled by rewriting the source language.
|
---|
| 246 | * 16-bit or 32-bit registers must be used where they are required by the
|
---|
| 247 | * target assembler even though ACK makes no difference between 'ax' and
|
---|
| 248 | * 'eax'. Asmconv is smart enough to transform compiler output. Human made
|
---|
| 249 | * assembly can be fixed up to be transformable.
|
---|
| 250 | */
|
---|