スタックマシンでは「スタックにプッシュする」と「スタックからポップする」という2つの操作が基本操作
2*3+4*5
PUSH 2
PUSH 3
MUL
PUSH 4
PUSH 5
MUL
ADD
void gen(Node *node){
if(node->kind == ND_NUM){
printf(" push %d\n", node->val);
return;
}
gen(node->lhs);
gen(node->rhs);
printf(" pop rdi\n");
printf(" pop rax\n");
switch(node->kind){
case ND_ADD:
printf(" add rax, rdi\n");
break;
case ND_SUB:
printf(" sub rax, rdi\n");
break;
case ND_MUL:
printf(" imul rax, rdi\n");
break;
case ND_DIV:
printf(" cqo\n");
printf(" idiv rdi\n");
break;
}
printf(" push rax\n");
}
int main(int argc, char **argv){
if(argc != 2){
fprintf(stderr, "引数の個数が正しくありません\n");
return 1;
}
user_input = argv[1];
token = tokenize(user_input);
Node *node = expr();
printf(".intel_syntax noprefix\n");
printf(".global main\n");
printf("main:\n");
gen(node);
printf(" pop rax\n");
printf(" ret\n");
return 0;
}