89 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*	asm86.c - 80X86 assembly intermediate		Author: Kees J. Bot
 | |
|  *								24 Dec 1993
 | |
|  */
 | |
| #define nil 0
 | |
| #include <stddef.h>
 | |
| #include <string.h>
 | |
| #include <assert.h>
 | |
| #include "asm86.h"
 | |
| #include "asmconv.h"
 | |
| #include "token.h"
 | |
| 
 | |
| expression_t *new_expr(void)
 | |
| /* Make a new cell to build an expression. */
 | |
| {
 | |
| 	expression_t *e;
 | |
| 
 | |
| 	e= allocate(nil, sizeof(*e));
 | |
| 	e->operator= -1;
 | |
| 	e->left= e->middle= e->right= nil;
 | |
| 	e->name= nil;
 | |
| 	e->magic= 31624;
 | |
| 	return e;
 | |
| }
 | |
| 
 | |
| void del_expr(expression_t *e)
 | |
| /* Delete an expression tree. */
 | |
| {
 | |
| 	if (e != nil) {
 | |
| 		assert(e->magic == 31624);
 | |
| 		e->magic= 0;
 | |
| 		deallocate(e->name);
 | |
| 		del_expr(e->left);
 | |
| 		del_expr(e->middle);
 | |
| 		del_expr(e->right);
 | |
| 		deallocate(e);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| asm86_t *new_asm86(void)
 | |
| /* Make a new cell to hold an 80X86 instruction. */
 | |
| {
 | |
| 	asm86_t *a;
 | |
| 
 | |
| 	a= allocate(nil, sizeof(*a));
 | |
| 	a->opcode= -1;
 | |
| 	get_file(&a->file, &a->line);
 | |
| 	a->optype= NONE;
 | |
| 	a->oaz= 0;
 | |
| 	a->rep= ONCE;
 | |
| 	a->seg= DEFSEG;
 | |
| 	a->args= nil;
 | |
| 	a->magic= 37937;
 | |
| 	a->raw_string = NULL;
 | |
| 	return a;
 | |
| }
 | |
| 
 | |
| void del_asm86(asm86_t *a)
 | |
| /* Delete an 80X86 instruction. */
 | |
| {
 | |
| 	assert(a != nil);
 | |
| 	assert(a->magic == 37937);
 | |
| 	a->magic= 0;
 | |
| 	del_expr(a->args);
 | |
| 	deallocate(a->raw_string);
 | |
| 	a->raw_string = NULL;
 | |
| 	deallocate(a);
 | |
| }
 | |
| 
 | |
| int isregister(const char *name)
 | |
| /* True if the string is a register name.  Return its size. */
 | |
| {
 | |
| 	static char *regs[] = {
 | |
| 		"al", "bl", "cl", "dl", "ah", "bh", "ch", "dh",
 | |
| 		"ax", "bx", "cx", "dx", "si", "di", "bp", "sp",
 | |
| 		"eax", "ebx", "ecx", "edx", "esi", "edi", "ebp", "esp",
 | |
| 		"cs", "ds", "es", "fs", "gs", "ss",
 | |
| 		"cr0", "cr1", "cr2", "cr3", "cr4",
 | |
| 		"dr0", "dr1", "dr2", "dr3", "dr6", "dr7",
 | |
| 		"st",
 | |
| 	};
 | |
| 	int reg;
 | |
| 
 | |
| 	for (reg= 0; reg < arraysize(regs); reg++) {
 | |
| 		if (strcmp(name, regs[reg]) == 0)
 | |
| 			return reg+1;
 | |
| 	}
 | |
| 	return 0;
 | |
| }
 | 
