开发者社区> 问答> 正文

简单的代码生成程序 Time Limit: 1000MS Memory Limit: 65536KB

(微)電〗【18666053854〗号】Problem Description 通过三地址代码序列生成计算机的目标代码,在生成算法中,对寄存器的使用顺序为:寄存器中存有 > 空寄存器 > 内存中存有 > 以后不再使用 > 最远距离使用

Input 单组输入,给定输出的三地址代码的个数和寄存器的个数.所有的变量为大写字母,寄存器的数量不超过9

Output 参照示例格式输出,不需要将最后的寄存器中的值写回内存

不再使用变量不用写回内存

Example Input 4 2 T:=A-B U:=A-C V:=T+U W:=V+U Example Output LD R0, A SUB R0, B LD R1, A SUB R1, C ADD R0, R1 ADD R0, R1 代码: #include <bits/stdc++.h>

using namespace std; const int MAXN = 10; int n,m; char s[110][MAXN]; char R[MAXN]; int cntm; int is_inR(char c) { for(int i = 0; i < m; ++i)if(R[i] == c)return i; return -1; }

int get_uselast(int pos,char c) { for(int i = pos; i < n; ++i) { if(s[i][3] == c || s[i][5] == c)return i; } return n; }

int get_pos(int pos) { if(cntm < m)return cntm++; int ans = -1,mm = -1; for(int i = 0; i < m; ++i) { int ne = get_uselast(pos,R[i]); if(ne > mm)mm = ne,ans = i; } return ans; }

void print_operator(char c) { if(c == '+')printf("ADD"); else if(c == '-')printf("SUB"); else if(c == '*')printf("MUL"); else if(c == '\')printf("DIV"); }

void print_right(char c) { int pos = is_inR(c); if(pos != -1)printf("R%d\n",pos); else printf("%c\n",c); }

int main() { scanf("%d%d",&n,&m); cntm = 0; for(int i = 0; i < n; ++i)scanf("%s",s[i]); for(int i = 0; i < n; ++i) { int pos = is_inR(s[i][3]); if(pos == -1) { pos = get_pos(i); if(R[pos] && get_uselast(i,R[pos]) < n)printf("ST R%d, %c\n",pos,R[pos]); printf("LD R%d, %c\n",pos,s[i][3]); } print_operator(s[i][4]); printf(" R%d, ",pos); print_right(s[i][5]); R[pos] = s[i][0]; } return 0; }

———————————————— 版权声明:本文为CSDN博主「思念在延续」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/huantonglei/article/details/78738765

展开
收起
游客odnzwz7f4juco 2019-12-02 13:58:58 664 0
0 条回答
写回答
取消 提交回答
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Clipper,A Low-latency Online 立即下载
DRIZZLE: Low latency execution for apache spark 立即下载
KR^X- Comprehensive- Kernel-Protection-Against-Just-In-Time-Code-Reuse 立即下载