From bf2c6f765db1b349d5bd5ce98631144f9cab654a Mon Sep 17 00:00:00 2001 From: Johnny Richard Date: Sat, 15 Apr 2023 03:07:21 +0200 Subject: parser: Generate GAS 64-bit assembly for linux Signed-off-by: Johnny Richard --- HACKING | 2 +- examples/main.pipa | 2 +- src/pipac.c | 20 +++++++++++++++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/HACKING b/HACKING index af95ec2..23a3a9f 100644 --- a/HACKING +++ b/HACKING @@ -2,4 +2,4 @@ HACKING ------- $ make - $ ./pipac examples/main.pipa + $ ./pipac examples/main.pipa > main.s && as -64 -o main.o main.s && ld -o main main.o diff --git a/examples/main.pipa b/examples/main.pipa index 5767e09..6524bec 100644 --- a/examples/main.pipa +++ b/examples/main.pipa @@ -1,3 +1,3 @@ main(): i32 { - return 1; + return 69; } diff --git a/src/pipac.c b/src/pipac.c index 29c21bd..993d56d 100644 --- a/src/pipac.c +++ b/src/pipac.c @@ -16,9 +16,27 @@ */ #include #include +#include + #include "lexer.h" #include "parser.h" +void +generate_gas_x86_64_linux(ast_function_t *func) +{ + if (strcmp(func->name, "main") != 0) { + fprintf(stderr, "[ERROR]: no main function has been defined!\n"); + exit(EXIT_FAILURE); + } + + printf(".global _start\n"); + printf(".text\n"); + printf("_start:\n"); + printf(" mov $1, %%al\n"); + printf(" mov $%d, %%ebx\n", func->body.number); + printf(" int $0x80\n"); +} + void print_usage() { @@ -50,7 +68,7 @@ main(int argc, char **argv) parser_init(&parser, &lexer); ast_function_t func = parser_parse_function(&parser); - printf("function name='%s' and return type '%d' with value %d\n", func.name, func.return_type, func.body.number); + generate_gas_x86_64_linux(&func); return EXIT_SUCCESS; } -- cgit v1.2.3