package de.fuberlin.projectF.CodeGenerator;
public class IntelAssembler extends Assembler{
public IntelAssembler() {
super();
sectionHead = new StringBuffer().append("");
sectionData = new StringBuffer().append("section .data\n");
sectionText = new StringBuffer().append("section .text\n");
}
protected void createEP() {
if(System.getProperty("os.name").toLowerCase().indexOf("linux") >= 0) {
sectionHead.append("extern exit\n");
}
else if(System.getProperty("os.name").toLowerCase().indexOf("windows") >= 0) {
sectionHead.append("extern _exit\n");
}
sectionText.append("global _start\n_start:\n\tcall main\n" + "\tpush "
+ "eax" + "\n\tcall exit\n\n");
}
protected void data(String label, String type, String value) {
value=requote(value);
sectionData.append(label).append(":\t").append("db").append(" ")
.append(value).append("\n");
}
protected void declare(String name) {
if(System.getProperty("os.name").toLowerCase().indexOf("linux") >= 0) {
sectionHead.append("extern ").append(name).append("\n");
}
else if(System.getProperty("os.name").toLowerCase().indexOf("windows") >= 0) {
sectionHead.append("extern _").append(name).append("\n");
}
}
protected void funcDec(String name, String operand1, String operand2) {
operand1 = translate(operand1);
operand2 = translate(operand2);
sectionText.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("\tcmp ").append(target).append(", ")
.append(source).append("\t\t\t;Label ").append("\n");
}
protected void fcmp(String source, String target) {
source = translate(source);
target = translate(target);
sectionText.append("\tucomisd ").append(target).append(", ")
.append(source).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("\tpush ").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("\tmov ").append(target).append(", ")
.append(source).append("\t;").append(comment).append("\n");
}
protected void movsd(String source, String target, String comment) {
source = translate(source).replace("dword ", "");
target = translate(target).replace("dword ", "");
sectionText.append("\tmovsd ").append(target).append(", ")
.append(source).append("\t;").append(comment).append("\n");
}
protected void movss(String source, String target, String comment) {
source = translate(source).replace("dword ", "");;
target = translate(target).replace("dword ", "");;
sectionText.append("\tmovss ").append(target).append(", ")
.append(source).append("\t;").append(comment).append("\n");
}
protected void cvtsi2sd(String source, String target, String comment) {
source = translate(source).replace("dword ", "");;
target = translate(target).replace("dword ", "");;
sectionText.append("\tcvtsi2sd ").append(target).append(", ")
.append(source).append("\t;").append(comment).append("\n");
}
protected void cvtsd2ss(String source, String target, String comment) {
source = translate(source).replace("dword ", "");;
target = translate(target).replace("dword ", "");;
sectionText.append("\tcvtsd2ss ").append(target).append(", ")
.append(source).append("\t;").append(comment).append("\n");
}
protected void cvttss2si(String source, String target, String comment) {
source = translate(source).replace("dword ", "");;
target = translate(target).replace("dword ", "");;
sectionText.append("\tcvttss2si ").append(target).append(", ")
.append(source).append("\t;").append(comment).append("\n");
}
protected void or(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\tor ").append(target).append(", ")
.append(source).append("\t;").append(comment).append("\n");
}
protected void and(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\tand ").append(target).append(", ")
.append(source).append("\t;").append(comment).append("\n");
}
protected void xor(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\txor ").append(target).append(", ")
.append(source).append("\t;").append(comment).append("\n");
}
protected void idiv(String source) {
source = translate(source);
sectionText.append("\tidiv ").append(source).append("\n");
}
protected void imul(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\timul ").append(target).append(", ")
.append(source).append("\t;").append(comment).append("\n");
}
protected void sub(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\tsub ").append(target).append(", ")
.append(source).append("\t;").append(comment).append("\n");
}
protected void add(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\tadd ").append(target).append(", ")
.append(source).append("\t;").append(comment).append("\n");
}
protected void shl(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\tshl ").append(target).append(", ")
.append(source).append("\t;").append(comment).append("\n");
}
protected void shr(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\tshr ").append(target).append(", ")
.append(source).append("\t;").append(comment).append("\n");
}
protected void sar(String source, String target, String comment) {
source = translate(source);
target = translate(target);
sectionText.append("\tsar ").append(target).append(", ")
.append(source).append("\t;").append(comment).append("\n");
}
protected void addsd(String source, String target, String comment) {
source = translate(source).replace("dword ", "");;
target = translate(target).replace("dword ", "");;
sectionText.append("\taddsd ").append(target).append(", ")
.append(source).append("\t;").append(comment).append("\n");
}
protected void subsd(String source, String target, String comment) {
source = translate(source).replace("dword ", "");;
target = translate(target).replace("dword ", "");;
sectionText.append("\tsubsd ").append(target).append(", ")
.append(source).append("\t;").append(comment).append("\n");
}
protected void mulsd(String source, String target, String comment) {
source = translate(source).replace("dword ", "");;
target = translate(target).replace("dword ", "");;
sectionText.append("\tmulsd ").append(target).append(", ")
.append(source).append("\t;").append(comment).append("\n");
}
protected void divsd(String source, String target, String comment) {
source = translate(source).replace("dword ", "");;
target = translate(target).replace("dword ", "");;
sectionText.append("\tdivsd ").append(target).append(", ")
.append(source).append("\t;").append(comment).append("\n");
}
protected String translate(String op) {
//Wenn Stackaddresse
if(op.indexOf(' ') != -1) {
String[] pair = op.split(" ");
op = "dword [" + pair[1] + " + " + pair[0] + "]";
}
return op;
}
private String requote(String string) {
string = string.replace("\\0A", "\",10,\"");
string = string.replace("\\09", "\",09,\"");
string = string.replace("\\00\"", "\",0");
string = string.replace("\\22", "\",0x22,\"");
string = string.replace("\\5C", "\",0x5C,\"");
string = string.replace("\\08", "\",08,\"");
string = string.replace("\\0C", "\",0x0C,\"");
string = string.replace("\\0D", "\",0x0D,\"");
string = string.replace("\\0B", "\",0x0B,\"");
return string;
}
@Override
protected void lea(String source, String target, String comment) {
// TODO Auto-generated method stub
}
}