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.
Ein '#' Präfix gibt eine sofortige Konstante in einigen Assemblersprachen an. Es sieht so aus, als würde es auch in diesem Fall funktionieren. –
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.) –