From 285b331ac60d075bba4f721fe412a52576f50539 Mon Sep 17 00:00:00 2001 From: Charles Cabergs Date: Tue, 16 Nov 2021 20:44:21 +0100 Subject: Fixing syscall numbers, Added exit syscall at the end to avoid segfault --- bfc.c | 22 +++++++++++----------- examples/getchar_putchar.bf | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/bfc.c b/bfc.c index 2d4c8f9..25c2859 100644 --- a/bfc.c +++ b/bfc.c @@ -3,10 +3,7 @@ #include static const size_t buffer_size = 256; -static const char* asm_filename = "out.asm"; - -static const char *write_syscall = "0x2000004"; -static const char *read_syscall = "0x2000003"; +/* static const char* asm_filename = "out.asm"; */ #define LABEL_COUNT_STACK_SIZE 256 static size_t label_stack[LABEL_COUNT_STACK_SIZE + 1] = {0}; @@ -24,10 +21,10 @@ int main(int argc, char *argv[]) FILE *output_file = stdout; fprintf( output_file, - "global _start\n" "section .bss\n" "\tbuffer: resb %zu\n\n" "section .text\n" + "global _start\n" "_start:\n" "\tmov rbx, buffer\n", buffer_size @@ -55,29 +52,29 @@ int main(int argc, char *argv[]) fprintf(output_file, " mov rdi, 1 ; .\n"); fprintf(output_file, " mov rsi, rbx ; .\n"); fprintf(output_file, " mov rdx, 1 ; .\n"); - fprintf(output_file, " mov rax, %-10s ; .\n", write_syscall); + fprintf(output_file, " mov rax, 1 ; .\n"); fprintf(output_file, " syscall ; .\n"); break; case ',': fprintf(output_file, " mov rdi, 0 ; ,\n"); fprintf(output_file, " mov rsi, rbx ; ,\n"); fprintf(output_file, " mov rdx, 1 ; ,\n"); - fprintf(output_file, " mov rax, %-10s ; ,\n", read_syscall); + fprintf(output_file, " mov rax, 0 ; ,\n"); fprintf(output_file, " syscall ; ,\n"); break; case '[': label_frame_id = label_stack[label_stack_frame]; - fprintf(output_file, "label_open_%03d_%03d: ; [\n", label_stack_frame, label_frame_id); + fprintf(output_file, "label_open_%03zu_%03zu: ; [\n", label_stack_frame, label_frame_id); fprintf(output_file, " cmp byte [rbx], 0 ; [\n"); - fprintf(output_file, " je label_close_%03d_%03d ; [\n", label_stack_frame, label_frame_id); + fprintf(output_file, " je label_close_%03zu_%03zu ; [\n", label_stack_frame, label_frame_id); label_stack_frame++; break; case ']': label_stack_frame--; label_frame_id = label_stack[label_stack_frame]; - fprintf(output_file, "label_close_%03d_%03d: ; ]\n", label_stack_frame, label_frame_id); + fprintf(output_file, "label_close_%03zu_%03zu: ; ]\n", label_stack_frame, label_frame_id); fprintf(output_file, " cmp byte [rbx], 0 ; ]\n"); - fprintf(output_file, " jne label_open_%03d_%03d ; ]\n", label_stack_frame, label_frame_id); + fprintf(output_file, " jne label_open_%03zu_%03zu ; ]\n", label_stack_frame, label_frame_id); label_stack[label_stack_frame]++; break; case ';': @@ -88,6 +85,9 @@ int main(int argc, char *argv[]) // error } } + fprintf(output_file, " mov rdi, 0 ; exit\n"); + fprintf(output_file, " mov rax, 60 ; exit\n"); + fprintf(output_file, " syscall ; exit\n"); return 0; diff --git a/examples/getchar_putchar.bf b/examples/getchar_putchar.bf index f36f02a..ad6a80d 100644 --- a/examples/getchar_putchar.bf +++ b/examples/getchar_putchar.bf @@ -1 +1 @@ -,. +,++. -- cgit