diff options
| author | Charles Cabergs <me@cacharle.xyz> | 2021-11-16 20:44:21 +0100 |
|---|---|---|
| committer | Charles Cabergs <me@cacharle.xyz> | 2021-11-16 20:44:21 +0100 |
| commit | 285b331ac60d075bba4f721fe412a52576f50539 (patch) | |
| tree | be63e07914e956e654b90b52eb7fbfaea2ccbfe9 | |
| parent | 2f6a51855571ee12bad247ac026aa02a061800f0 (diff) | |
| download | bfc-285b331ac60d075bba4f721fe412a52576f50539.tar.gz bfc-285b331ac60d075bba4f721fe412a52576f50539.tar.bz2 bfc-285b331ac60d075bba4f721fe412a52576f50539.zip | |
Fixing syscall numbers, Added exit syscall at the end to avoid segfault
| -rw-r--r-- | bfc.c | 22 | ||||
| -rw-r--r-- | examples/getchar_putchar.bf | 2 |
2 files changed, 12 insertions, 12 deletions
@@ -3,10 +3,7 @@ #include <stdio.h> 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 @@ -,. +,++. |
