まずassemblerから
.intel_syntax noprefix .globl main main: mov rax, 5 add rax, 20 sub rax, 4 ret
c
#include <stdio.h> #include <stdlib.h> int main(int argc, char **argv){ if(argc != 2) { fprintf(stderr, "引数の個数が正しくありません\n"); return 1; } char *p = argv[1]; printf(".intel_syntax noprefix\n"); printf(".global main\n"); printf("main:\n"); printf(" mov rax, %ld\n", strtol(p, &p, 10)); while(*p){ if(*p == '+'){ p++; printf(" add rax, %ld\n", strtol(p, &p, 10)); continue; } if(*p == '-') { p++; printf(" sub rax, %ld\n", strtol(p, &p, 10)); continue; } fprintf(stderr, "予期しない文字です: '%c'\n", *p); return 1; } printf(" ret\n"); return 0; }
$ make
cc -std=c11 -g -static 9cc.c -o 9cc
$ ./9cc ‘5+20-4’
.intel_syntax noprefix
.global main
main:
mov rax, 5
add rax, 20
sub rax, 4
ret