[コンパイラ]初めてのコンパイラ作成

GCCの構文解析は、再帰下降構文解析法(recursive descent parsing)を使っている

下記のシンプルなアセンブリもコンパイラと言える。

.intel_syntax noprefix
.globl main

main:
        mov rax, 42
        ret

### Intel記法とAT&T記法

mov rbp, rsp // intel
mov %rsp, %rbp // AT&T ...結果レジスタが第二引数にくる

mov rax, 8 // intel
mov $8, %rax // AT&T ...数字には$をつける

mov [rbp + rcx * 4 - 8], rax // intel
mov %rax, -8(rbp, rcx, 4) // AT&T 

### コンパイラの作成

#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;
}
$ gcc -o 9cc 9cc.c
$ ./9cc 345 > tmp.s
$  cat tmp.s
.intel_syntax noprefix
.global main
main:
	mov rax, 345
	ret

$ gcc -o tmp tmp.s
$ ./tmp
$ echo $?
89

あれ? 345が89になるな。何故だ? あ、0〜255の範囲でないと行けないからですな。