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.
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. –