2016-06-29 15 views
5

Wir hatten eine Aufgabe, da war ein Assemblerbefehl einer 2-Adressierung Maschine:diesen kurzen Assemblerbefehl versuchen zu verstehen, aber ich verstehe nicht

mov 202, 100[r1+] 

Hinweis einer minimale Assemblerbefehl Sequenz nach unten die diese Anweisung ersetzt (siehe oben)

wo

  • n[rx+]: Register per Post Inkrement indiziert; n Indexwert ist und rx ist registrieren x

  • einzigen numerischen Wert: direkt adressiert/gespeichert

Die Adressen sollen wir verwenden sind:

  1. rx - registrieren direkte Adressierung
  2. [rx] - Register indirekte Adressierung
  3. #n - direkt addr sing

Und wir dürfen nur hinzufügen, sub, mov.

Ich verstehe besonders nicht, wofür # steht und warum wir Subtraktion brauchen, naja eigentlich verstehe ich wirklich nichts ... Die Aufgabe wurde gelöst, also suche ich nicht nach einer Lösung. Ich brauche eine Erklärung, wie es gemacht wird, versuche es selbst zu verstehen, aber es hat nicht funktioniert. Ich hoffe, jemand wird in der Lage sein und mir helfen, wäre so nett von dir!

Lösung:

add #100, r1 
mov #202, r2 
mov[r2],[r1] 
sub #99, r1 
+3

Ein '#' Präfix gibt eine sofortige Konstante in einigen Assemblersprachen an. Es sieht so aus, als würde es auch in diesem Fall funktionieren. –

+3

Wy fragen Sie nicht Ihren Lehrer zu erklären? Sie werden bezahlt, um Ihnen das nötige Wissen und Verständnis zu vermitteln, und offensichtlich haben sie ihren Lohn noch nicht verdient. (Nicht downvoting - nur fragen.) –

Antwort

6

Verstehen Sie, dass Assemblersprache nicht irgendeine universelle standardisierte Sache ist. Es wird offiziell von dem Programm definiert, das es liest, welches der Assembler ist. Was auch immer dieser Code als Sprache für diesen Assembler definiert, ist die Sprache. Der Maschinencode ist für den Prozessor wichtig, so dass Sie so viele Assembler und Assemblersprachen haben können, wie Sie Benutzer haben, solange sie den richtigen Maschinencode erzeugen. Wenn Sie also erwarten, dass dies allgemeingültig ist, gilt eine Regel für alles, was nicht der Fall ist.

Sie haben jedoch genug Informationen für erfahrene Leute zur Verfügung gestellt, um die Gewohnheiten anderer Assemblersprachen zu sehen, die hier reflektiert werden.

So scheint dies zu bewegen, was Adresse von 202 Register direkte Adressierung ist, wie Sie angegeben. an den Ort an der Adresse r1 + 100 Register indiziert und die Post-Inkrement.

Um das durch mehr Anweisungen zu ersetzen, da die eine Zeile die einfachste ist, soweit Codezeilen gehen (was Komplexität und Anzahl der Takte nicht unbedingt angeht).

  • So müssen Sie die Inhalte der Adresse 202, lesen
  • Sie müssen vorübergehend 100 bis r1 hinzuzufügen,
  • müssen Sie die Inhalte der Adresse 202 an den Ort r1 + 100, schreiben
  • und dann müssen Sie r1 nehmen und inkrementieren (nicht die r1 + 100 inkrementiert, sondern r1 ohne den Index inkrementiert).

Die Lösung gegeben macht ziemlich genau das:

add #100, r1 
mov #202, r2 
mov[r2],[r1] 
sub #99, r1 

Es 100 bis r1 fügt hinzu, die wir vorübergehend (und wird rückgängig gemacht werden müssen, um später, weil r1 jetzt falsch auf lange Sicht ist) tun müssen. Dann, weil sie die Adressierungsmodi begrenzen, müssen Sie ein Register haben, halten Sie die Adresse 202, so wird der Wert 202 in r2 geladen, genau wie der Wert 100 zu r1 hinzugefügt wurde. Die #Nummer bedeutet, dass Sie einfach diese Nummer verwenden.

Jetzt dürfen Sie [rn] verwenden, damit die Bewegung liest, was an der Adresse r2 (Adresse 202) ist und schreibt es in die Adresse r1 (das Original r1 plus 100).Schließlich, weil wir r1 wollen 1 das Original und am Ende wird, aber wir haben es das Original plus 100 brauchen wir 99 r1 + 100-99 = r1 + 1


In C abziehen weg, wäre es etwas sein, dies wie:

unsigned *r1; 
unsigned *r2; 

//r1 is set somewhere in here to something that is not defined in your question or problem. 

r1 += 100; //add #100,r1 
r2 = 202; //mov #202,r2 
*r1 = *r2; //mov [r2],[r1] 
r1 -= 99; //sub #99,r1 

das Ziel auf der rechten Seite und Operanden auf der linken Seite aufweist, ist nicht intuitiv, da wir meist mit dem Ergebnis auf der linken Seite und die Operanden auf der rechten Seite schreiben und Code.

Wir tun nicht Code 202 = r2; wir stattdessen schreiben r2 = 202; so mov r2,#202 intuitiver ist, aber wieder Assemblersprache wird durch die die Leute definiert, die den Assembler und einige Leute geschrieben, wie es nach rechts und andere nach links rechts nach links.

+0

Vielen Dank für Ihre Zeit, wirklich, vielen Dank, dass Sie das alles für mich geschrieben haben. Ich hatte gehofft, einige Antworten zu bekommen, wenn ich am nächsten Abend online gehe und es ist einfach großartig! Ich verstehe es nicht ganz sicher, aber ich habe die Grundidee verstanden und jetzt sollte ich es von diesem Punkt aus verbessern können. ;) –

+0

off hand scheint dies die kürzeste Lösung zu sein. Wenn man die Subtraktion von 99 vermeiden möchte, indem ich ein drittes Register verwende, denke ich, dass es mehr Anweisungen braucht, zumindest was wir über diesen Befehlssatz aus Ihrer Beschreibung wissen. –

+1

brechen Sie es in seine Einzelteile. einige Zahlen sind nur Zahlen, Integer/Unmittelbar, das Register enthält eine Nummer und diese Zahl kann in bestimmten Modi eine Adresse oder nur ein Wert sein. also brich die Anweisungen in diese Teile. Ich habe eine Nummer, es ist eine Basisadresse Ich füge eine andere Zahl hinzu, die die Adresse im Speicher ist. Diese Adresse im Speicher enthält eine Nummer und so weiter. –

-2

Sie Lösung abbildet nicht an den Eingang überhaupt. In Ihrer Eingabe befindet sich R1 in einem unbekannten Zustand. In unserer "Lösung" endet R1 in einem bekannten Zustand (1).

Darüber hinaus müssten Sie wissen, was Ihr nation instruction format ist.

mov 202, 100[r1+] 

sieht aus wie wäre es

1) add 100 to the contents of R1 to create an address. 
2) move 202 into that address 
3) Add 2 to r1 (assuming a 2-byte machine word) 
+0

Vielen Dank für Ihre Antwort. Da es eine Lösung von unserem Professor ist, bin ich nicht sicher, was ich jetzt denken soll: D –

+1

Ihr erster Absatz ist falsch. @cnmesrs 'mov [r2], [r1]' ist eine Kopie von Speicher zu Speicher und ändert keines der Register. Das Nettoergebnis des Codes ist "r1 + = 1", anscheinend das gleiche wie bei Verwendung von "100 [r1 +]". –

3

In mov 202, 100[r1+]:

  • Die Anweisung ein mov ist
  • Der Quelloperand 202 der Speicher an der Adresse ist. In einigen Assemblersprachen könnten Sie auch [202] zur besseren Übersicht schreiben. Es gibt keine # auf der Nummer, also ist es ein absoluter Adressierungsmodus, kein sofortiger.
  • Der Zieloperand ist der Speicher unter der Adresse .
  • Der Nebeneffekt des Adressierungsmodus r1++

Wie viele Aromen der Assemblersprache ist, verwendet diese scheinbar # Präfixe unmittelbare Konstanten anzuzeigen. Dies ist wie GNU/AT & Tx86-Syntax, wobei add $4, %eax addiert 4, aber add 4, %eax lädt einen Wert von der absoluten Adresse 4.


Ihre Professors gegeben äquivalente Sequenz fügt 100 bis r1, dann 99 subtrahiert, da sie will Verschiebungen und post-Schritten in Adressierungsarten vermeiden. Es klammert auch r2, die die Einzelinstruktion Version nicht tut, also ist es kein Drop-in-Ersatz.

+0

Warum der Downvote? –

+2

@MargaretBloom: Ich denke, jemand kam vorbei und hasste die Frage so sehr, dass sie Leute dafür bestrafen wollten, dass sie sie sogar beantworteten und mehr Fragen wie sie ermutigten. Der Downvote zu dieser Antwort erschien gleichzeitig mit einem Downvote auf die Frage und andere Antwort. –

+3

Die Frage selbst wurde ebenfalls abgelehnt: /. IMO das ist eine sehr faire und vernünftige Frage, mit vernünftigen vergangenen und zukünftigen Bemühungen, die von den OP, Wert dieser Antworten gezeigt werden. Es hilft mir auch zu sehen, was Leute kämpfen (sobald Sie einige ASM-Codierung gemacht haben, ist es schwer zu verstehen, Newcomer Probleme), so dass ich ihnen das nächste Mal genauer und einfacher helfen kann. Ich mag ihre ASM-Variante einfach nicht, sie spezifiziert nicht die Datenbreite der Operanden - es ist also unklar, welche Datenmenge bewegt wird, wäre lehrreicher gewesen mit optionalem b/w/d und '+' für die Datengröße empfindlich. – Ped7g