add ascii and asciiz directives, fix symtab bug
This commit is contained in:
parent
e3d2e31377
commit
c1a44ed41d
7 changed files with 76 additions and 30 deletions
|
@ -475,30 +475,4 @@ MIPS_INS(XORI, I, .op = MIPS_OP_XORI)
|
||||||
|
|
||||||
#undef MIPS_INS
|
#undef MIPS_INS
|
||||||
|
|
||||||
/* mips directive types */
|
|
||||||
enum mips_directive_type {
|
|
||||||
MIPS_DIRECTIVE_ALIGN,
|
|
||||||
MIPS_DIRECTIVE_SPACE,
|
|
||||||
MIPS_DIRECTIVE_WORD,
|
|
||||||
MIPS_DIRECTIVE_HALF,
|
|
||||||
MIPS_DIRECTIVE_BYTE,
|
|
||||||
MIPS_DIRECTIVE_SECTION,
|
|
||||||
MIPS_DIRECTIVE_EXTERN,
|
|
||||||
MIPS_DIRECTIVE_GLOBL,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* mip32 directive */
|
|
||||||
struct mips_directive {
|
|
||||||
enum mips_directive_type type;
|
|
||||||
uint32_t len; // used for words, halfs, bytes
|
|
||||||
union {
|
|
||||||
uint16_t align;
|
|
||||||
uint16_t space;
|
|
||||||
uint32_t words[MAX_ARG_LENGTH];
|
|
||||||
uint16_t halfs[MAX_ARG_LENGTH];
|
|
||||||
uint8_t bytes[MAX_ARG_LENGTH];
|
|
||||||
char name[MAX_ARG_LENGTH];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* __MIPS_H__ */
|
#endif /* __MIPS_H__ */
|
||||||
|
|
20
masm/asm.c
20
masm/asm.c
|
@ -165,6 +165,26 @@ static int handle_directive(struct assembler *assembler,
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case MIPS_DIRECTIVE_ASCII: {
|
||||||
|
struct section_entry entry;
|
||||||
|
entry.type = ENT_STR;
|
||||||
|
entry.size = strlen(directive->name);
|
||||||
|
memcpy(entry.str, directive->name, entry.size);
|
||||||
|
if (sec_push(assembler->sectab.current, entry))
|
||||||
|
return M_ERROR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MIPS_DIRECTIVE_ASCIIZ: {
|
||||||
|
struct section_entry entry;
|
||||||
|
entry.type = ENT_STR;
|
||||||
|
entry.size = strlen(directive->name) + 1;
|
||||||
|
memcpy(entry.str, directive->name, entry.size);
|
||||||
|
if (sec_push(assembler->sectab.current, entry))
|
||||||
|
return M_ERROR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return M_SUCCESS;
|
return M_SUCCESS;
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include <elf.h>
|
#include <elf.h>
|
||||||
#include <mips.h>
|
#include <mips.h>
|
||||||
|
|
||||||
|
#include "mlimits.h"
|
||||||
#include "parse.h"
|
#include "parse.h"
|
||||||
#include "lex.h"
|
#include "lex.h"
|
||||||
|
|
||||||
|
@ -102,6 +103,7 @@ enum section_entry_type {
|
||||||
ENT_WORD,
|
ENT_WORD,
|
||||||
ENT_HALF,
|
ENT_HALF,
|
||||||
ENT_BYTE,
|
ENT_BYTE,
|
||||||
|
ENT_STR,
|
||||||
ENT_NO_DATA,
|
ENT_NO_DATA,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -117,6 +119,7 @@ struct section_entry {
|
||||||
|
|
||||||
// data
|
// data
|
||||||
struct mips_instruction ins;
|
struct mips_instruction ins;
|
||||||
|
char str[MAX_LEX_LENGTH];
|
||||||
int32_t word;
|
int32_t word;
|
||||||
int16_t half;
|
int16_t half;
|
||||||
int8_t byte;
|
int8_t byte;
|
||||||
|
|
20
masm/parse.c
20
masm/parse.c
|
@ -875,6 +875,20 @@ static int parse_directive_globl(struct parser *parser,
|
||||||
return M_SUCCESS;
|
return M_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int parse_directive_ascii(struct parser *parser,
|
||||||
|
struct mips_directive *directive,
|
||||||
|
enum mips_directive_type type)
|
||||||
|
{
|
||||||
|
struct token token;
|
||||||
|
if (assert_token(parser, TOK_STRING, &token))
|
||||||
|
return M_ERROR;
|
||||||
|
|
||||||
|
directive->type = type;
|
||||||
|
strcpy(directive->name, token.text);
|
||||||
|
|
||||||
|
return M_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static int parse_section(struct mips_directive *directive,
|
static int parse_section(struct mips_directive *directive,
|
||||||
char name[MAX_LEX_LENGTH])
|
char name[MAX_LEX_LENGTH])
|
||||||
{
|
{
|
||||||
|
@ -909,6 +923,12 @@ static int parse_directive(struct parser *parser,
|
||||||
return parse_directive_extern(parser, directive);
|
return parse_directive_extern(parser, directive);
|
||||||
else if (strcmp(token.text, "globl") == 0)
|
else if (strcmp(token.text, "globl") == 0)
|
||||||
return parse_directive_globl(parser, directive);
|
return parse_directive_globl(parser, directive);
|
||||||
|
else if (strcmp(token.text, "ascii") == 0)
|
||||||
|
return parse_directive_ascii(parser, directive,
|
||||||
|
MIPS_DIRECTIVE_ASCII);
|
||||||
|
else if (strcmp(token.text, "asciiz") == 0)
|
||||||
|
return parse_directive_ascii(parser, directive,
|
||||||
|
MIPS_DIRECTIVE_ASCIIZ);
|
||||||
else
|
else
|
||||||
return parse_section(directive, token.text);
|
return parse_section(directive, token.text);
|
||||||
}
|
}
|
||||||
|
|
30
masm/parse.h
30
masm/parse.h
|
@ -9,9 +9,33 @@
|
||||||
#include <mips.h>
|
#include <mips.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
///
|
/* mips directive types */
|
||||||
/// reference
|
enum mips_directive_type {
|
||||||
///
|
MIPS_DIRECTIVE_ALIGN,
|
||||||
|
MIPS_DIRECTIVE_SPACE,
|
||||||
|
MIPS_DIRECTIVE_WORD,
|
||||||
|
MIPS_DIRECTIVE_HALF,
|
||||||
|
MIPS_DIRECTIVE_BYTE,
|
||||||
|
MIPS_DIRECTIVE_SECTION,
|
||||||
|
MIPS_DIRECTIVE_EXTERN,
|
||||||
|
MIPS_DIRECTIVE_GLOBL,
|
||||||
|
MIPS_DIRECTIVE_ASCII,
|
||||||
|
MIPS_DIRECTIVE_ASCIIZ,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* mip32 directive */
|
||||||
|
struct mips_directive {
|
||||||
|
enum mips_directive_type type;
|
||||||
|
uint32_t len; // used for words, halfs, bytes
|
||||||
|
union {
|
||||||
|
uint16_t align;
|
||||||
|
uint16_t space;
|
||||||
|
uint32_t words[MAX_ARG_LENGTH];
|
||||||
|
uint16_t halfs[MAX_ARG_LENGTH];
|
||||||
|
uint8_t bytes[MAX_ARG_LENGTH];
|
||||||
|
char name[MAX_ARG_LENGTH];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
enum reference_type {
|
enum reference_type {
|
||||||
REF_NONE,
|
REF_NONE,
|
||||||
|
|
|
@ -61,7 +61,7 @@ int symtab_find(struct symbol_table *symtab, Elf32_Sym **ptr,
|
||||||
|
|
||||||
ptrdiff_t diff = sym - symtab->symbols;
|
ptrdiff_t diff = sym - symtab->symbols;
|
||||||
if (idx != NULL)
|
if (idx != NULL)
|
||||||
*idx = diff / sizeof(Elf32_Sym);
|
*idx = diff;
|
||||||
|
|
||||||
return M_SUCCESS;
|
return M_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
.data
|
||||||
|
|
||||||
|
str:
|
||||||
|
.ascii "hello world"
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.align 2
|
.align 2
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue