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の範囲でないと行けないからですな。