[9] | 1 | /* asm86.c - 80X86 assembly intermediate Author: Kees J. Bot
|
---|
| 2 | * 24 Dec 1993
|
---|
| 3 | */
|
---|
| 4 | #define nil 0
|
---|
| 5 | #include <stddef.h>
|
---|
| 6 | #include <string.h>
|
---|
| 7 | #include <assert.h>
|
---|
| 8 | #include "asm86.h"
|
---|
| 9 | #include "asmconv.h"
|
---|
| 10 | #include "token.h"
|
---|
| 11 |
|
---|
| 12 | expression_t *new_expr(void)
|
---|
| 13 | /* Make a new cell to build an expression. */
|
---|
| 14 | {
|
---|
| 15 | expression_t *e;
|
---|
| 16 |
|
---|
| 17 | e= allocate(nil, sizeof(*e));
|
---|
| 18 | e->operator= -1;
|
---|
| 19 | e->left= e->middle= e->right= nil;
|
---|
| 20 | e->name= nil;
|
---|
| 21 | e->magic= 31624;
|
---|
| 22 | return e;
|
---|
| 23 | }
|
---|
| 24 |
|
---|
| 25 | void del_expr(expression_t *e)
|
---|
| 26 | /* Delete an expression tree. */
|
---|
| 27 | {
|
---|
| 28 | if (e != nil) {
|
---|
| 29 | assert(e->magic == 31624);
|
---|
| 30 | e->magic= 0;
|
---|
| 31 | deallocate(e->name);
|
---|
| 32 | del_expr(e->left);
|
---|
| 33 | del_expr(e->middle);
|
---|
| 34 | del_expr(e->right);
|
---|
| 35 | deallocate(e);
|
---|
| 36 | }
|
---|
| 37 | }
|
---|
| 38 |
|
---|
| 39 | asm86_t *new_asm86(void)
|
---|
| 40 | /* Make a new cell to hold an 80X86 instruction. */
|
---|
| 41 | {
|
---|
| 42 | asm86_t *a;
|
---|
| 43 |
|
---|
| 44 | a= allocate(nil, sizeof(*a));
|
---|
| 45 | a->opcode= -1;
|
---|
| 46 | get_file(&a->file, &a->line);
|
---|
| 47 | a->optype= -1;
|
---|
| 48 | a->oaz= 0;
|
---|
| 49 | a->rep= ONCE;
|
---|
| 50 | a->seg= DEFSEG;
|
---|
| 51 | a->args= nil;
|
---|
| 52 | a->magic= 37937;
|
---|
| 53 | return a;
|
---|
| 54 | }
|
---|
| 55 |
|
---|
| 56 | void del_asm86(asm86_t *a)
|
---|
| 57 | /* Delete an 80X86 instruction. */
|
---|
| 58 | {
|
---|
| 59 | assert(a != nil);
|
---|
| 60 | assert(a->magic == 37937);
|
---|
| 61 | a->magic= 0;
|
---|
| 62 | del_expr(a->args);
|
---|
| 63 | deallocate(a);
|
---|
| 64 | }
|
---|
| 65 |
|
---|
| 66 | int isregister(const char *name)
|
---|
| 67 | /* True if the string is a register name. Return its size. */
|
---|
| 68 | {
|
---|
| 69 | static char *regs[] = {
|
---|
| 70 | "al", "bl", "cl", "dl", "ah", "bh", "ch", "dh",
|
---|
| 71 | "ax", "bx", "cx", "dx", "si", "di", "bp", "sp",
|
---|
| 72 | "cs", "ds", "es", "fs", "gs", "ss",
|
---|
| 73 | "eax", "ebx", "ecx", "edx", "esi", "edi", "ebp", "esp",
|
---|
| 74 | "cr0", "cr1", "cr2", "cr3",
|
---|
| 75 | "st",
|
---|
| 76 | };
|
---|
| 77 | int reg;
|
---|
| 78 |
|
---|
| 79 | for (reg= 0; reg < arraysize(regs); reg++) {
|
---|
| 80 | if (strcmp(name, regs[reg]) == 0) {
|
---|
| 81 | return reg < 8 ? 1 : reg < 22 ? 2 : 4;
|
---|
| 82 | }
|
---|
| 83 | }
|
---|
| 84 | return 0;
|
---|
| 85 | }
|
---|