第2步:製作可以算加減法的編譯器
.intel_syntax noprefix
.global main
main:
mov rax, 5
add rax, 20
sub rax, 4
ret$ gcc -o tmp tmp.s
$ ./tmp
$ echo $?
21Last updated
.intel_syntax noprefix
.global main
main:
mov rax, 5
add rax, 20
sub rax, 4
ret$ gcc -o tmp tmp.s
$ ./tmp
$ echo $?
21Last updated
#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
$ ./9cc '5+20-4'
.intel_syntax noprefix
.global main
main:
mov rax, 5
add rax, 20
sub rax, 4
ret
try 21 "5+20-4"$ git add test.sh 9cc.c
$ git commit