diff options
Diffstat (limited to 'src/gas_assembly_generator.c')
-rw-r--r-- | src/gas_assembly_generator.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/src/gas_assembly_generator.c b/src/gas_assembly_generator.c index afbfebd..755b0be 100644 --- a/src/gas_assembly_generator.c +++ b/src/gas_assembly_generator.c @@ -22,6 +22,7 @@ static void gas_assembly_generator_visit_function(ast_visitor_t *visitor, ast_function_declaration_t *func); static void gas_assembly_generator_visit_return_stmt(ast_visitor_t *visitor, ast_return_stmt_t *return_stmt); +static void gas_assembly_generator_visit_literal(ast_visitor_t *visitor, ast_literal_t *return_stmt); void gas_assembly_generator_init(gas_assembly_generator_t *gen, FILE *out) @@ -29,6 +30,7 @@ gas_assembly_generator_init(gas_assembly_generator_t *gen, FILE *out) assert(gen && out); gen->super = (ast_visitor_t) { .visit_function = &gas_assembly_generator_visit_function, + .visit_literal = &gas_assembly_generator_visit_literal, .visit_return_stmt = &gas_assembly_generator_visit_return_stmt }; gen->out = out; @@ -59,8 +61,23 @@ gas_assembly_generator_visit_return_stmt(ast_visitor_t *visitor, ast_return_stmt assert(visitor && return_stmt); gas_assembly_generator_t *gen = (gas_assembly_generator_t *) visitor; + ast_visitor_visit(visitor, return_stmt->argument); + + fprintf(gen->out, " mov %%eax, %%ebx\n"); + fprintf(gen->out, " mov $1, %%al\n"); fprintf(gen->out, " mov $1, %%al\n"); - fprintf(gen->out, " mov $%d, %%ebx\n", return_stmt->number); fprintf(gen->out, " int $0x80\n"); } +static void +gas_assembly_generator_visit_literal(ast_visitor_t *visitor, ast_literal_t *literal) +{ + gas_assembly_generator_t *gen = (gas_assembly_generator_t *) visitor; + switch (literal->kind) { + case AST_LITERAL_INTEGER: + fprintf(gen->out, " mov $%d, %%eax\n", literal->value.integer); + return; + default: + assert(false && "No code generation strategy."); + } +} |