/********************************************* * Description - RPCalc compiler * Author - Vilyaem * Date - Jun 05 2024 * *******************************************/ #include #include char* regnames[] = { "%ax","%bx","%cx","%dx" }; int main(void){ int stackptr = 0; char strbuf[8]; char regnamebuf[16]; char regnamebuf2[16]; puts("/*Compiled with Vilyaem's simple rpcalc compiler*/"); while(fgets(strbuf,8,stdin) != NULL){ if(strbuf[0] == '\n'){ break; } strbuf[strlen(strbuf)-1] = '\0'; switch(strbuf[0]){ case '+': strcpy(regnamebuf,regnames[stackptr-1]); strcpy(regnamebuf2,regnames[stackptr-2]); printf("add %%%s,%%%s\n",regnamebuf,regnamebuf2); --stackptr; break; case '-': strcpy(regnamebuf,regnames[stackptr-1]); strcpy(regnamebuf2,regnames[stackptr-2]); printf("sub %%%s,%%%s\n",regnamebuf,regnamebuf2); --stackptr; break; case '*': strcpy(regnamebuf,regnames[stackptr-1]); strcpy(regnamebuf2,regnames[stackptr-2]); printf("imul %%%s,%%%s\n",regnamebuf,regnamebuf2); --stackptr; break; default: /*assume it is a numeric to be pushed*/ printf("mv $%s,%%%s\n",strbuf,regnames[stackptr]); ++stackptr; break; } /*printf("# stackptr: %d", stackptr); for debugging*/ } return 0; }