55 lines
1.4 KiB
C
55 lines
1.4 KiB
C
/*********************************************
|
|
* Description - RPCalc compiler
|
|
* Author - Vilyaem
|
|
* Date - Jun 05 2024
|
|
* *******************************************/
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
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;
|
|
}
|