スタックマシンでは「スタックにプッシュする」と「スタックからポップする」という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; }