main:
mov rbp, rsp
mov %rsp, %rbp
mov rax, 8
mov $8, %rax
mov [rbp + rcx * 4 - 8], rax
mov %rax, -8(rbp, rcx, 4)
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv){
if(argc != 2) {
fprintf(stderr, "引数の個数が正しくありません\n");
return 1;
}
printf(".intel_syntax noprefix\n");
printf(".global main\n");
printf("main:\n");
printf(" mov rax, %d\n", atoi(argv[1]));
printf(" ret\n");
return 0;
}
$ cc -o 9cc 9cc.c
$ ./9cc 123 > tmp.s
.intel_syntax noprefix
.global main
main:
mov rax, 123
ret
テストスクリプト
#!/bin/bash
assert(){
expected="$1"
input="$2"
./9cc "$input" > tmp.s
cc -o tmp tmp.s
./tmp
actual="$?"
if ["$actual" = "$expected"]; then
echo "input => $actual"
else
echo "input => $expected expected, but got $actual"
exit 1
fi
}
assert 0 0
assert 42 42
echo OK
Makefile
CFLAGS=-std=c11 -g static 9cc: 9cc.c11 test: 9cc ./test.sh clean: rm -f 9cc *.o *~ tmp* .PHONY: test clean