Assembler: Wie finde ich die Adressierungsart?

Hallöchen!

Ich bin im Rahmen einer Übung gerade dabei, Befehle in den Mschinencode zu „übersetzen“ Dabei liegt eine Tablle eines 65XX vor, wobei die Adressierung des Befehls zu wählen ist.
Beispiel:
„Übersetzen Sie den Befehl LDA $25,X in den Mschinencode.“

Ich weiß nicht, wie man nun die Adressierungsart findet. In diesem Bsp. soll es eine Zero-page Adresse sein. Aber warum ist dies so? Könnte es nicht auch jede andere Adresseierung sein, z.B. Relativ?

Wie geht man dort am Besten vor?

Hallo!
Eigentlich gibt es hier keine Hausaufgabenbetreuung (sieht jedenfalls für mich so aus), da dafür der Lehrer zuständig ist.

Ich bin im Rahmen einer Übung gerade dabei, Befehle in den
Mschinencode zu „übersetzen“ Dabei liegt eine Tablle eines
65XX vor, wobei die Adressierung des Befehls zu wählen ist.
Beispiel:
„Übersetzen Sie den Befehl LDA $25,X in den Mschinencode.“

Ich weiß nicht, wie man nun die Adressierungsart findet. In
diesem Bsp. soll es eine Zero-page Adresse sein. Aber warum
ist dies so? Könnte es nicht auch jede andere Adresseierung
sein, z.B. Relativ?

Ich verstehe die Frage nicht ganz, aber normalerweise wählt man unter mehreren Möglichkeiten die Adressierung, die 1. am wenigsten Speicherplatz kostet und/oder 2. am schnellsten ausgeführt wird. Ich habe den 65xx nicht im Detail im Kopf, vermute aber, daß es X-indizierte Adressierung nur auf die Zeropage gibt (sonst würde ich zu verdeutlichung LDA $0025,X scheiben).

Cu Rene

hallo.

„Übersetzen Sie den Befehl LDA $25,X in den Mschinencode.“

das ist doch schon maschinencode… oder sollen am ende nullen und einsen dastehen?
welche adressierungsart verwendet wird, sollte anhand der schreibweise des befehls eigentlich eindeutig sein und hängt evtl. vom verwendeten assembler ab.

gruß

michael

Hallo Michael,

nein, das ist eben kein Maschinecode, sondern Assembler (die Sprache). Der Assembler (das Programm) macht daraus erst Maschinencode, den müsste man dann etwa in Hex darstellen. Aufgabe des Assemblers ist es deshalb ja auch, die Adressierungsart zu bestimmen, weil die irgendwo in den Programmbits codiert werden muss. Die Adressierung muss aus der Schreibweise eindeutig hervorgehen, sonst funktioniert die Übersetzung ja nicht; wie , das ist von Assembler zu Assembler unterschiedlich geregelt, z.B. kann vereinbart sein, dass $25 Zero-Page bedeutet, $0025 dagegen volle 16bit-Addressierung (wenn der 65xx das hat, ich habe den Befehlssatz nicht im Kopf). Es kann auch über Prefixe wie „REL“ geregelt werden, oder der Befehl heisst einfach anders, z.B. LD und LDZ.

Gruss Reinhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hallo reinhard.

nein, das ist eben kein Maschinecode, sondern Assembler (die
Sprache). Der Assembler (das Programm) macht daraus erst
Maschinencode, den müsste man dann etwa in Hex darstellen.

ok. ich erinnere mich nur an diverse programmierheftchen von früher, in denen schon die assemblerbefehle als „maschinencode“ bezeichnet wurden.

Die Adressierung muss aus
der Schreibweise eindeutig hervorgehen

eben :smile:

gruß

michael

Jo.
Es ist eine Zeropage Addressierung.

Die gibt es auch indirekt-Y-indiziert:
LDA ($25),y

Hab die Befehlscodes des C64-Prozessors hirnmässig nicht mehr alle parat, aber beim Befehl LDA $C011 ab der Speicherstelle $8000 (32768 dez.)steht beispielsweise:

8000 AD 11 c0 LDA $C011

AD für den LDA , 11 als Lo-byte und C0 als Hi-byte des Befehles.

Die grundsätzliche Unterscheidung von ASSEMBLER und MASCHIENENCODE ist eigentlich überflüssig, da sich dieser Unterschied von alleine einprägt.
Eine CPU kann nunmal keine Buchstaben (L D A) ausführen.
(Den jeweiligen CODE dieser Buchstaben eventuell sehr wohl).

Beim Debugger (oder auch Maschienen-Sprache-Monitor genannt) beispielsweise wird der eingegebene Befehl LDA bei einem abschliessenden RETURN oder ENTER direkt in den Speicher assembliert.
(Dies nennt man dann Direkt-Assembler und ist eine Routine im Debugger.)

Und dieser assembliert dann mittels der gleichen Zuordnungstabelle nach der Du abscheinend die OPCODES (Ad für LDA) zuordnen sollst.

Leider ist die 65… Baureihe nur mit einem 8-Bit Datenbus gesegnet.
Deshalb müssen 16-Bit Zugriffe immer in 2 Schritten erfolgen.
Erst Befehlscode, dann LoByte, dann Hi-Byte.

Der 8-Bit-Befehl

LDA §$FF lädt den absoluten Wert $FF in den AKKU und hat (glaub’ ich mal…) den Code $A9 ff.

Der 16 Bit-Befehl

LDA §$FFFF (lade den Wert $ffff in den Akku)

existiert leider nicht…dazu bräuchte er einen 16-Bit Datenbus oder zumindest intern einen 16 Bit Akku.

Der AMIGA und sein 68000er Motorola ist da schon effektiver.

Ich hoffe, ich konnte Dir etwas helfen, wenn nicht, frag’ wieder.

Schönen Tag,

Chris

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]