Assembler Aufgabe
-
Hallo ng,
Ich versuche seit langem hinter die Geheimnisse der Assembler-Programmierung zu kommen, da ich dies für eine Klausur brauche. In diesem Zusammnehang eine Aufgabe :
Nachfolgend der Assembler-Code eines 8-Bit Mikroprozessor vom Typ 65XX.
LDX #$02
LDA #$70
LOOP : LSR A
DEX
BNE LOOPim folgenden ist eine Tabelle zu ergänzen :
..............................OpCode ........... Bedeutung der Anweisung
$A000 LDX #A002 LDA #A004 LSR A
A005 BNE $FCWie gehe ich an sowas heran ? Ich habe schon Schwierigkeiten eine Zusammenhang zwischen OpCode und Befehl herzustellen. Das sollte doch eigentlich das einfachste sein, da dies (Mnemonic) doch die Abkürzung für den Maschinenbefehl ist.
Für Anworten und Hilfen wäre ich sehr dankbar.
Gruss und Danke
-
Besorg dir erst mal die Befehlstabelle
-
habe ich, kann ich dir zukommen lassen. oder kann man die irgendwie hier im forum hinterlegen ?
-
thokai schrieb:
..............................OpCode ........... Bedeutung der Anweisung $A000 LDX #$02 LoaD into X-register den Wert (#) 2 ($ = HEX) $A002 LDA #$70 LoaD into Accumulator den Wert 112 (7 * 16) $A004 LSR A Logical(?) Shift Right den Inhalt des Akkumulators - Akkumulator ist jetzt #$38 = 56 (halbieren) $A005 DEX DEcrement X-register hat jetzt den Wert 1 $A005 BNE $FC Branch if Not Equal falls die Verringerung vorher den Wert auf 0 herunterbrachte, springst Du zu Adresse FC (Hex) ... (sonst geht's hier weiter)
Aus der Erinnerung... kein Anspruch auf Korrektheit.
Also:
In Register X wird der Wert "2" gespeichert.
Im Akkumulator (ein spezielles Register) wird der Wert "112" gespeichert.
Der Inhalt des Akkumulators wird um 1 Bit nach rechts verschoben (mit 0 aufgefüllt) -> entspricht der Halbierung des Werts (von 112 auf 56). Im Akku steht jetzt also 56.
Der Inhalt des X-Registers wird um 1 verringert.
Hat es null erreicht, wird nach $FC verzweigt, ansonsten geht's danach mit Code weiter.Achja: Die Adressen stimmen nicht!
BTW: Ich schätze mal, ein ZUR-ADRESSE-X-Springen würde eher "BNE #$FC" heissen, nach Logik von $ und #. D.h. der Befehl springt wohl eher zu der Adresse, die an Position $FC gespeichert ist. $FC ist also quasi ein Pointer.
-
danke soweit, der nebel lichtet sich ein wenig .
die letzte adresse ist $A006.wie setze ich nun diese befehle in maschinencode (opcode) um ?
in dieser matrixartig aufgebauten befehlstabelle steht für
LSR :
Immediate
Absolute .........4E
Zero Page .........46
Accumulator ......4A
Implied.
(Indexed,X)
Indexed Y
Zero Page, X......56
Absolute, X.......5E
Absolute Y
Relative
Indirect
Zero Page,YDEX:
Implied..........CA
BNE:
Relative..........D0
gruss und danke
-
Um die Sprungbefehle zu verstehen muss man wissen das der 6502 (und einige andere) noch "Seitenorientiert" sind.
Eigendlich nichts anderes wie die Segmentierung beim 8086, nur das die Seiten 256 Byte gross sind.
Standartmässig finden alle Zugriffe auf die aktuelle Seite stat.
$A005 BNE $FC <- Ist bestimmt nicht Richtig.
Muss mindestens
$A006 BNE $FC heissen.
FC ist unter anderem -4 . Dh. Der Befehl heisst
A006 BNE A004
-
postete ich bereits, dass es richtig:
$A006 BNE $FC heisst.
aber ( für mich die gretchen frage ) wie komme ich jetzt zum OpCode ?
-
-
und wie heisst der OpCode zu
$A004 LSR Aetwa : 4E 46 4A 56 5E
oder muss ich das binär hinschreiben ?
oder den Akkumulator Inhalt beachten ?oder ist es sogar richtig ?
sonnniger tag und danke
-
Der OpCOde steht in der Tabelle.
Du must nur hinschauen.
-
entweder lässt sich hier ein gefrusteter ab oder jemand geilt sich an der unwissenheit anderer auf.
klare frage : richtig oder falsch ?
wenn richtig ok, wenn falsch bitte erklären und nicht so ein scheiss wie : hinschauen !
-
Der OpCode für "LSR A" steht deutlich in der oberen Tabelle: 4A.
(oder wenn du die unteren Tabellen auseinandernehmen kannst, findest du LSR im Abschnitt mit "cc=10" als "aaa=010" - dazu gehört für dich der Adressmodus "Akkumulator:bbb=010" -> zusammen 01001010 = 4A)
-
frage wie kann ich eine Interruptgesteuerte Aufnahme von Messwerten
code-technisch realisieren ?ich brauch dafür den Timer0, soweit bin ich schon, der soll mir in Echtzeit Stunden/ Minuten + die Messergebnisse auf dem LCD ausgeben
Ich hab AVR und nen AT90s2313, mein Sensor ist ein DS18s20 auf einer
1-Wire Verbindung hab auch schon die serielle Schnittstelle zu
meinem Rechner geschaffen fehlt mir halt nur noch der Timerdanke schon mal für die hilfe
-
vielen dank , kurze zusammenfassung meinerseits :
$A000 LDX #A002 LDA #A004 LSR A ..........Opcode : 4A (1Byte)
A006 BNE $FC.........Opcode : D0 (2Byte)Das heisst, das ganze "programm" benötigt 8 Byte ?
Gruss und Danke
-
Fast:
$A000 LDX #A002 LDA #A004 LSR A ..........Opcode : 4A (1Byte)
A006 BNE $FC.........Opcode : D0,FC (2Byte)
-
danke allen zusammen