various asm directives - char support (Dave Long)
This commit is contained in:
parent
68c800981e
commit
71f119fe25
2 changed files with 83 additions and 2 deletions
78
tccasm.c
78
tccasm.c
|
@ -85,6 +85,12 @@ static void asm_expr_unary(TCCState *s1, ExprValue *pe)
|
||||||
else
|
else
|
||||||
pe->v = ~pe->v;
|
pe->v = ~pe->v;
|
||||||
break;
|
break;
|
||||||
|
case TOK_CCHAR:
|
||||||
|
case TOK_LCHAR:
|
||||||
|
pe->v = tokc.i;
|
||||||
|
pe->sym = NULL;
|
||||||
|
next();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
if (tok >= TOK_IDENT) {
|
if (tok >= TOK_IDENT) {
|
||||||
/* label case : if the label was not found, add one */
|
/* label case : if the label was not found, add one */
|
||||||
|
@ -276,6 +282,15 @@ static void asm_free_labels(TCCState *st)
|
||||||
st->asm_labels = NULL;
|
st->asm_labels = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void use_section(TCCState *s1, const char *name)
|
||||||
|
{
|
||||||
|
Section *sec;
|
||||||
|
sec = find_section(s1, name);
|
||||||
|
cur_text_section->data_offset = ind;
|
||||||
|
cur_text_section = sec;
|
||||||
|
ind = cur_text_section->data_offset;
|
||||||
|
}
|
||||||
|
|
||||||
static void asm_parse_directive(TCCState *s1)
|
static void asm_parse_directive(TCCState *s1)
|
||||||
{
|
{
|
||||||
int n, offset, v, size, tok1;
|
int n, offset, v, size, tok1;
|
||||||
|
@ -346,8 +361,69 @@ static void asm_parse_directive(TCCState *s1)
|
||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case TOK_ASM_globl:
|
||||||
|
{
|
||||||
|
Sym *sym;
|
||||||
|
|
||||||
|
next();
|
||||||
|
sym = label_find(tok);
|
||||||
|
if (!sym) {
|
||||||
|
sym = label_push(&s1->asm_labels, tok, 0);
|
||||||
|
sym->type.t = VT_VOID;
|
||||||
|
}
|
||||||
|
sym->type.t &= ~VT_STATIC;
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TOK_ASM_string:
|
||||||
|
{
|
||||||
|
const uint8_t *p;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
next();
|
||||||
|
if (tok != TOK_STR)
|
||||||
|
expect("string constant");
|
||||||
|
p = tokc.cstr->data;
|
||||||
|
for(i = 0; i < tokc.cstr->size; i++)
|
||||||
|
g(p[i]);
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TOK_ASM_text:
|
||||||
|
case TOK_ASM_data:
|
||||||
|
case TOK_ASM_bss:
|
||||||
|
{
|
||||||
|
char sname[64];
|
||||||
|
tok1 = tok;
|
||||||
|
n = 0;
|
||||||
|
next();
|
||||||
|
if (tok != ';' && tok != TOK_LINEFEED) {
|
||||||
|
n = asm_int_expr(s1);
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
sprintf(sname, (n?".%s%d":".%s"), get_tok_str(tok1, NULL), n);
|
||||||
|
use_section(s1, sname);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TOK_SECTION1:
|
||||||
|
{
|
||||||
|
char sname[256];
|
||||||
|
|
||||||
|
/* XXX: support more options */
|
||||||
|
next();
|
||||||
|
sname[0] = '\0';
|
||||||
|
while (tok != ';' && tok != TOK_LINEFEED && tok != ',') {
|
||||||
|
if (tok == TOK_STR)
|
||||||
|
pstrcat(sname, sizeof(sname), tokc.cstr->data);
|
||||||
|
else
|
||||||
|
pstrcat(sname, sizeof(sname), get_tok_str(tok, NULL));
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
use_section(s1, sname);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
error("unknown assembler directive .%s", get_tok_str(tok, NULL));
|
error("unknown assembler directive '.%s'", get_tok_str(tok, NULL));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
7
tcctok.h
7
tcctok.h
|
@ -144,12 +144,17 @@
|
||||||
DEF(TOK_strcpy, "strcpy")
|
DEF(TOK_strcpy, "strcpy")
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Tiny Assembler for x86 */
|
/* Tiny Assembler */
|
||||||
|
|
||||||
DEF_ASM(byte)
|
DEF_ASM(byte)
|
||||||
DEF_ASM(align)
|
DEF_ASM(align)
|
||||||
DEF_ASM(skip)
|
DEF_ASM(skip)
|
||||||
DEF_ASM(space)
|
DEF_ASM(space)
|
||||||
|
DEF_ASM(string)
|
||||||
|
DEF_ASM(globl)
|
||||||
|
DEF_ASM(text)
|
||||||
|
DEF_ASM(data)
|
||||||
|
DEF_ASM(bss)
|
||||||
|
|
||||||
#ifdef TCC_TARGET_I386
|
#ifdef TCC_TARGET_I386
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue