diff --git a/ps5/src/generator.c b/ps5/src/generator.c index d87553a..d85306f 100644 --- a/ps5/src/generator.c +++ b/ps5/src/generator.c @@ -18,6 +18,7 @@ static void generate_global_variables(void); static void generate_function(symbol_t* function); static void generate_expression(node_t* expression); static void generate_statement(node_t* node); +static void generate_base_address(node_t *identifier); static void generate_main(symbol_t* first); // Entry point for code generation @@ -175,11 +176,15 @@ static void generate_expression(node_t* expression) MOVQ_IMM(expression->data.number_literal, RAX); break; case IDENTIFIER: - symbol_t *sym = expression->symbol; - symbol_t *value = symbol_hashmap_lookup(sym->function_symtable->hashmap, sym->name); - MOVQ_IMM(value->node->data.number_literal, RAX); + generate_base_address(expression); + EMIT("movq (%s), %s", RAX, RAX); break; case ARRAY_INDEXING: + generate_base_address(expression->children[0]); // identifier child + STASH(); + generate_expression(expression->children[1]); // index expression + EMIT("leaq (%s, %s, 8), %s", RCX, RAX, RAX); // rcx + 8*rax -> rax + EMIT("movq (%s), %s", RAX, RAX); // deref rax break; case OPERATOR: break;