diff --git a/boot.c b/boot.c index f5a33e7..3476acc 100644 --- a/boot.c +++ b/boot.c @@ -1033,7 +1033,7 @@ int asm_sub(int lhs, int rhs) { exit(1); } int diff = asm_rr(TYPE_INT, "sub", lhs, rhs); - _asm_ri("slli", diff, diff, log_step_of(lhs_type)); + _asm_ri("srai", diff, diff, log_step_of(lhs_type)); return diff; } if (type1) { @@ -1818,7 +1818,7 @@ void parse_global_variable(int id, const char* name, int type) { printf("%s:\n", name); if (token_type == TOKEN_ASSIGN) { expect_token(TOKEN_NUMBER); - printf(" .word %d\n", token_data); + printf(" .dword %d\n", token_data); } else if (token_type == TOKEN_BRACKET_LEFT) { if (type & TYPE_PTR_MASK) { eprintf("array of pointers is not supported\n"); @@ -1827,14 +1827,11 @@ void parse_global_variable(int id, const char* name, int type) { expect_token(TOKEN_NUMBER); int size = token_data; expect_token(TOKEN_BRACKET_RIGHT); - int array_size = 4 * size; - if (type == TYPE_CHAR) { - array_size = size; - } + int array_size = type == TYPE_CHAR ? size : 4 * size; printf(" .zero %d\n", array_size); declare_global(id, MARKER_ARRAY, type); } else { - printf(" .zero %d\n", 4); + printf(" .zero %d\n", 8); unget_token(); } expect_token(TOKEN_SEMICOLON); diff --git a/demo/add.c b/demo/add.c index f42e07e..3623da5 100644 --- a/demo/add.c +++ b/demo/add.c @@ -1,11 +1,18 @@ int printf(const char format[], ...); int scanf(const char format[], ...); -int putchar(int ch); -int* p; +void should_be(int expected, int actual) { + if (expected != actual) { + printf("Expected %d, but got %d\n", expected, actual); + } else { + printf("Passed\n"); + } +} + +int* p = 0; int f1() { int a = 1; - return *(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(p))))))))))); // a[10] + return *(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(p))))))))))); // p[10] } @@ -13,5 +20,8 @@ int main() { int a[15]; p = a; for (int i = 0; i < 15; a[i] = i, ++i); - return f1(); + p -= 5; + should_be(5, f1()); + should_be(5, a - p); + should_be(10, 5); } \ No newline at end of file