2017-02-14 7 views
1

Ich mache gerade einen Architekturkurs und als Teil dieser Klasse lerne ich MIPS Assembly.Format von lw/sw-Operationen in MIPS-Assembly?

Es ist mein Verständnis, dass die lw und sw Operationen sind I-Formatanweisungen erlaubt 2 Registeroperanden und einen unmittelbaren Operanden:

 
[opcode] 6-bits, [rs] 5-bits, [rt] 5-bits, [immediate] 16-bits 

    written as: 
    lw $rt, offset($rs)  # where offset is an immediate value 

OK, also lassen Sie uns sagen, dass ich A [i] zugreifen möchten. Unter der Annahme, die Basisadresse von A in Register $ s7 und der Index (i) ist in dem Register $ s1, hätte ich etwas entlang der Linien zu tun, von:

 
    sll $t0, $s1, 2  # i*4 (offset) 
    add $t0, $s7, $t0 # $t0 = &A[i] 
    lw $t1, 0($t0)  # $t1 = A[i] 

Was ich bin verwirrt über meinen Professor sagt immer wieder, dass wir auch eine lw Anweisung wie diese mit 3 Register tun können:

 
    sll $t0, $s1, 2  # i*4 (offset) 
    lw $t1, $t0($s7) # $t1 = A[i] 

Sind beide dieser Lösungen richtig? Oder ist mein Lehrer falsch? Sie können kein Register für den Offset verwenden, oder? Ich dachte, der Offset müsste eine unmittelbare Nummer sein. Es war mein Verständnis, dass der Grund, warum Sie die zusätzliche hinzufügen müssen Anweisung in der ersten Lösung, ist eigentlich weil Sie kann nicht verwenden Sie ein Register als Offset.

+0

Assemblersprache als Sprache vom Assembler definiert ist, das Programm, das sie liest und macht aus ihm Maschinencode. Es ist nicht allgemein (wenn überhaupt) eine standardisierte Sprache wie C++ oder JAVA mit irgendeinem Komitee irgendwo. MIPS hat bereits häufig verwendete Pseudobefehle und dies könnte ein weiterer Pseudobefehl für einen bestimmten Assembler sein. –

Antwort

0

Der Offset für lw/sw muss eine sofortige sein. Wenn Ihr Ausbilder behauptet, dass es eine Variante von lw/sw im MIPS-Anweisungssatz gibt, die Register-Offsets akzeptiert, dann ist er/sie falsch.

Es könnte jedoch Assembler geben, die eine solche Variante als Pseudobefehl akzeptieren, und es in tatsächliche MIPS-Anweisungen übersetzt. In diesem Fall könnte eine mögliche Übersetzung sein:

addu $at,$s7,$t0 
lw $t1, 0($at) 
+0

Um pedantisch zu sein, enthielt die (veraltete) MIPS DSP-Architekturerweiterung den Befehl "lwx $ rd, $ rxxx ($ ryyy)", der es ermöglichte, ein Register als Offset zu verwenden. – markgz