2016-08-15 5 views
0

Ich habe versucht, C-Code in MIPS-Assembly zu konvertieren. Hier ist ein Ausschnitt. Das Problem ist, dass ich nicht sicher bin, ob ich auf dem richtigen Weg bin. Ich hoffe, jemand könnte helfen.C-Code zu Assembly

Dies war die ursprüngliche Frage:

void swap(int v[], int k, int j) { 
int temp; 
temp = v[k]; 
v[k] = v[j]; 
v[j] = temp; 
} 

und das ist, wie weit ich habe haben:

swap: 
addi  $sp, $sp, -4 
sw  $s0, 0($sp) 
add  $s0, $zero, $zero 
L1: add $t1, $s0, $a1 
lb  $t2, 0($t1) 
add  $t3, $s0, $a0 
sb  $t2, 0($t3) 
beq  $t2, $zero, L2 
addi  $s0, $s0, 1 
j L1 
L2:  lw $s0, 0($sp) 
addi  $sp, $sp, 4 
jr  $ra 

Okay dies so weit ist, wie ich bekommen haben. Mache ich das richtig oder bin ich völlig verloren?

+1

Ich sehe keine Frage. Bitte konsultieren Sie die Hilfe-Schaltfläche in der oberen Reihe, um zu erfahren, wie Sie Fragen zu SO stellen können. Für das Problem, das Assembler aus C-Code erzeugt, haben alle Compiler, die ich kenne, einen Befehlszeilenschalter, um das zu erzeugen. ZB gcc hat '-S'. Was ist dein Problem? –

+4

Nun, Sie haben eine Schleife, der C-Code hat keine Schleife. Die Arrays sind von int, die wir 4 Bytes oder 32 Bits annehmen können. also musst du k mit 4 multiplizieren oder nach links 2 verschieben, dann das zu v hinzufügen und das in temp laden. Dann erzeuge ein j mal 4 versetze das in v und speichere in v plus k mal 4. dann lege temp in v plus j mal 4. Ist dein Code dabei? –

+1

Es scheint, dass das Poster versucht, MIPS Assembler- und C-Aufrufkonventionen zu lernen. Scheint mir eine faire Frage zu sein. Aber da nur wenige MIPS-Experten hier sind, ist der Vorschlag, aus dem angegebenen c-Compiler eine asm-Datei zu generieren, eine gute Idee. –

Antwort

-2

Hier ist eine free online tool, die C-Code in Assembly konvertiert. Hier

ist der konvertierte Code:

addiu $sp,$sp,-24 
$LCFI0: 
    sw $fp,20($sp) 
$LCFI1: 
    move $fp,$sp 
    movz $31,$31,$0 
$LCFI2: 
    sw $4,24($fp) 
    sw $5,28($fp) 
    sw $6,32($fp) 
    lw $2,28($fp) 
    nop 
    sll $2,$2,2 
    lw $3,24($fp) 
    nop 
    addu $2,$3,$2 
    lw $2,0($2) 
    nop 
    sw $2,8($fp) 
    lw $2,28($fp) 
    nop 
    sll $2,$2,2 
    lw $3,24($fp) 
    nop 
    addu $2,$3,$2 
    lw $3,32($fp) 
    nop 
    sll $3,$3,2 
    lw $4,24($fp) 
    nop 
    addu $3,$4,$3 
    lw $3,0($3) 
    nop 
    sw $3,0($2) 
    lw $2,32($fp) 
    nop 
    sll $2,$2,2 
    lw $3,24($fp) 
    nop 
    addu $2,$3,$2 
    lw $3,8($fp) 
    nop 
    sw $3,0($2) 
    move $sp,$fp 
    lw $fp,20($sp) 
    addiu $sp,$sp,24 
    j $31 
    nop 
+1

und nicht optimiert und viel schwieriger zu interpretieren und/oder Code als von Hand zu tun. –

+0

Ich habe bearbeitet, sah nicht die * mips * Teil nur die Montage, so sprang ich auf die Antwort denken, er wollte x86 asm. – Hedron

+0

@Siguza Nein, es sind Mips. Beachten Sie die Anweisungen "lw" und "sw". Und das Triple-Argument 'addu'-Anweisungen usw. –

3

break it down und dann umzusetzen

v, k und j kommen in als Register nehmen wir an.

müssen Sie die Adresse v + bauen (k < < 2) und v + (j < < 2) können Sie Scratch-Register verwenden, nehme ich an können Sie die k und j zu eingehenden Register trash, da Sie sie werden nicht mehr benötigen.

k = k << 2; 
k = k + v 
j = j << 2; 
j = j + v 
temp0 = load(k) 
temp1 = load(j) 
store(k) = temp1 
store(j) = temp0 

und Sie sollten, dass zu asm umwandeln können, können einige der Befehle neu ordnen, und haben es immer noch funktionieren.

Edit, ich werde Sie herausfinden lassen, aber ich habe nicht zuerst cheaten und kompilieren. Aber festgestellt, dass gcc die gleiche Grundsequenz von Anweisungen produziert. Zwei Schichten, zwei addiert zwei Lasten, dann zwei Geschäfte.