package de.fuberlin.projectF.CodeGenerator;
public class GNUAssembler extends Assembler {
public GNUAssembler() {
super();
sectionHead = new StringBuffer().append("");
sectionData = new StringBuffer().append(".section .data\n");
sectionText = new StringBuffer().append(".section .text\n");
}
protected void createEP() {
sectionText.append(".globl _start\n_start:\n\tcall main\n" + "\tpushl "
+ "%eax" + "\n\tcall exit\n\n");
}
protected void data(String label, String type, String value) {
value= requote(value);
sectionData.append(label).append(":\t").append(type).append(" ")
.append(value).append("\n");
}
protected void declare(String name) {}
protected void funcDec(String name, String operand1, String operand2) {
operand1 = translate(operand1);
operand2 = translate(operand2);
sectionText.append(".type ").append(name)
.append(", @function\n").append(name).append(":\n");
sectionText.append("\tenter " + operand1 + ", " + operand2 + "\n");
}
protected void funcEnd() {
sectionText.append("\tleave\n");
sectionText.append("\tret\n\n");
}
protected void je(String label) {
sectionText.append("\tje ").append(label).append("\n");
}
protected void jne(String label) {
sectionText.append("\tjne ").append(label).append("\n");
}
protected void jl(String label) {
sectionText.append("\tjl ").append(label).append("\n");
}
protected void jg(String label) {
sectionText.append("\tjg ").append(label).append("\n");
}
protected void jb(String label) {
sectionText.append("\tjb ").append(label).append("\n");
}
protected void ja(String label) {
sectionText.append("\tja ").append(label).append("\n");
}
protected void jle(String label) {
sectionText.append("\tjle ").append(label).append("\n");
}
protected void jge(String label) {
sectionText.append("\tjge ").append(label).append("\n");
}
protected void jbe(String label) {
sectionText.append("\tjbe ").append(label).append("\n");
}
protected void jae(String label) {
sectionText.append("\tjae ").append(label).append("\n");
}
protected void jmp(String label) {
sectionText.append("\tjmp ").append(label).append("\n");
}
protected void icmp(String source, String target) {
source = translate(source);
target = translate(target);
sectionText.append("\tcmpl ").append(source).append(", ")
.append(target).append("\t\t\t#Label ").append("\n");
}
protected void fcmp(String source, String target) {
source = translate(source);
target = translate(target);
sectionText.append("\tucomisd ").append(source).append(", ")
.append(target).append("\t\t\t#Label ").append("\n");
}
protected void label(String name) {
sectionText.append("label_").append(name).append(":\t\t\t#Label ")
.append(name).append("\n");
}
protected void call(String name) {
sectionText.append("\tcall ").append(name).append("\t#Call ")
.append(name).append("\n");
}
protected void push(String operand, String comment) {
operand = translate(operand);
sectionText.append("\tpushl ").append(operand).append("\t#")
.append(comment).append("\n");
}
protected void mov(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\tmovl ").append(source).append(", ")
.append(target).append("\t#").append(comment).append("\n");
}
protected void movsd(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\tmovsd ").append(source).append(", ")
.append(target).append("\t#").append(comment).append("\n");
}
protected void movss(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\tmovss ").append(source).append(", ")
.append(target).append("\t#").append(comment).append("\n");
}
protected void cvtsi2sd(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\tcvtsi2sd ").append(source).append(", ")
.append(target).append("\t#").append(comment).append("\n");
}
protected void cvtsd2ss(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\tcvtsd2ss ").append(source).append(", ")
.append(target).append("\t#").append(comment).append("\n");
}
protected void cvttss2si(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\tcvttss2si ").append(source).append(", ")
.append(target).append("\t#").append(comment).append("\n");
}
protected void or(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\torl ").append(source).append(", ")
.append(target).append("\t#").append(comment).append("\n");
}
protected void and(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\tandl ").append(source).append(", ")
.append(target).append("\t#").append(comment).append("\n");
}
protected void xor(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\txorl ").append(source).append(", ")
.append(target).append("\t#").append(comment).append("\n");
}
protected void idiv(String source) {
source = translate(source);
sectionText.append("\tidivl ").append(source).append("\n");
}
protected void imul(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\timull ").append(source).append(", ")
.append(target).append("\t#").append(comment).append("\n");
}
protected void sub(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\tsubl ").append(source).append(", ")
.append(target).append("\t#").append(comment).append("\n");
}
protected void add(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\taddl ").append(source).append(", ")
.append(target).append("\t#").append(comment).append("\n");
}
protected void shl(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\tshll ").append(source).append(", ")
.append(target).append("\t#").append(comment).append("\n");
}
protected void shr(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\tshrl ").append(source).append(", ")
.append(target).append("\t#").append(comment).append("\n");
}
protected void sar(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\tsarl ").append(source).append(", ")
.append(target).append("\t#").append(comment).append("\n");
}
protected void addsd(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\taddsd ").append(source).append(", ")
.append(target).append("\t#").append(comment).append("\n");
}
protected void subsd(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\tsubsd ").append(source).append(", ")
.append(target).append("\t#").append(comment).append("\n");
}
protected void mulsd(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\tmulsd ").append(source).append(", ")
.append(target).append("\t#").append(comment).append("\n");
}
protected void divsd(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\tdivsd ").append(source).append(", ")
.append(target).append("\t#").append(comment).append("\n");
}
@Override
protected void lea(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\tleal ").append(source).append(", ")
.append(target).append("\t#").append(comment).append("\n");
}
protected String translate(String op) {
//Wenn Stackaddresse
if(op.indexOf(' ') != -1) {
String[] pair = op.split(" ");
op = pair[0] + "(%" + pair[1] + ")";
}
//Wenn Register
else if(op.equals("eax")) op = "%" + op;
else if(op.equals("ebx")) op = "%" + op;
else if(op.equals("ecx")) op = "%" + op;
else if(op.equals("edx")) op = "%" + op;
else if(op.equals("edi")) op = "%" + op;
else if(op.equals("esi")) op = "%" + op;
else if(op.equals("ebp")) op = "%" + op;
else if(op.equals("esp")) op = "%" + op;
else if(op.equals("xmm0")) op = "%" + op;
else if(op.equals("xmm1")) op = "%" + op;
else if(op.equals("xmm2")) op = "%" + op;
else if(op.equals("xmm3")) op = "%" + op;
else if(op.equals("xmm4")) op = "%" + op;
else if(op.equals("xmm5")) op = "%" + op;
else if(op.equals("xmm6")) op = "%" + op;
else if(op.equals("xmm7")) op = "%" + op;
//Wenn Hexadezimalzeahl
else if(op.startsWith("0x")) op = "$" + op;
//Wenn Dezimalzahl oder irgendetwas anderes
else op = "$" + op;
return op;
}
protected String requote(String string) {
string = string.replace("\\0A", "\\n");
string = string.replace("\\09", "\\t");
string = string.replace("\\00", "\\0");
string = string.replace("'", "\\'");
string = string.replace("\\22", "\\\"");
string = string.replace("?", "\\?");
string = string.replace("\\5C", "\\\\");
string = string.replace("\\07", "\\a");
string = string.replace("\\08", "\\b");
string = string.replace("\\0C", "\\f");
string = string.replace("\\0D", "\\r");
string = string.replace("\\0B", "\\v");
return string;
}
}