Schreiben Sie eine while-Schleife in Assembler
Ich bin versucht, zu schreiben eine while-Schleife in der Montage mit einem 6502-Prozessor und ich kann nicht herausfinden, wie man die hexadezimal-code. Ich habe schon Beispiele gesehen, geschrieben, mit der Kurzschrift, wo es ist ein label für, wo die Schleife beginnen soll und Ende, aber ich sehe nichts für die tatsächlichen hex-code.
Den beiden codes, die ich sehe, die nützlich sind:
- Vergleich ein byte im Speicher, um die X-reg (Kürzel: CPX, hex: EC). Dies setzt das Z-flag auf null, wenn Sie gleich sind, und
- Zweig X bytes, wenn Z-flag = 0 (Kürzel: BNE, hex: D0)
- Warum willst du die hex-codes anstelle der Verwendung eines Assemblers?
- code"? Die IDE, assembler oder compiler verwenden Sie? Welche Erfahrungen mit 6502 assembly haben Sie bereits?
- Ich hoffe, dass Sie nicht sagen uns, dass Sie sich schriftlich ein 6502-Programm, ohne Verwendung einer assembler. Was verwenden Sie für ein Entwicklungssystem? Ein Apple ][ ? Oder was?
- Beim schreiben eines Compilers erzeugt hex-code, damit es ausgeführt werden kann, auf einem simulierten 6502-Mikroprozessor.
- Er kann mit einem Mikroprozessor-trainer (z.B. innovision-group.net/catalog/images/...). Diese sind einfache Computer, die Sie das Programm direkt in Maschinencode. Sie können noch einen assembler zu erzeugen, der Computer-code, aber Sie müssen noch manuell geben Sie den Maschinen-code in das system.
- Ja, nur das anstelle einer separaten Maschine simuliert wird, wird in eine Webseite. Der code druckt den hexcode, der in das system kopiert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein Ort für Sie zu starten: http://www.obelisk.demon.co.uk/6502/ . Die Seite verfügt über einen cross-assembler, die können Sie auf Ihrem PC laufen. Dass könnte eine gute dev-Plattform für Sie.
Bevor Sie irgend etwas tun, Sie haben zu verstehen, die Arbeitsweise des 6502. Dann haben Sie zu verstehen, das software-Entwicklungs-Prozess, der umfasst:
-- Vorbereitung einer "Quelldatei", so bezeichnet,,
der symbolische Anweisungen, die Sie
rufen Sie "Kürzel"
-- mit einem
assembler, übersetzt, die Quelle
Datei in maschinenanweisungen, dass
der 6502 versteht
-- laden der
übersetzung in die 6502
-- erzählen
der 6502 Ausführung der übersetzten
Maschine Anweisungen
Dein Beispiel Programm versucht zu kopieren
LEN
Speicher-bytes vonSRC
zuDST
.Formatieren Sie es wie folgt:
Nachdem Sie Hinzugefügt haben mehr Aussage-Linien (wie
END
, zum Beispiel); und nachdem Sie definiert habenSRC
,DST
, undLEN
haben, speichern Sie das ganze in eine Datei namens-sagen wir,cploop.txt
.Dann sagen Sie dem assembler zu übersetzen. Der assembler kommt mit einer Datei von Binär-6502 machine code, cam-dargestellt als hex-bytes, die Sie sprechen.
Füttern Sie, dass die Datei von Computer-code, um die simulierten 6502. Dann wird Sie irgendwie sagen, den 6502, der zum ausführen der Operationen, die die Maschine code verkörpert.
Hier ist ein Beispiel zeigt die Korrespondenz zwischen der Montage (wie du es nennst, "Kürzel") und Maschinen-code. Hier ist der Assembler-code für den Algorithmus, mit einigen Parametern abstrahiert:
Natürlich, Sie können nicht drehen, die direkt in Maschinen-code. Sie müssen auch füllen Sie die Werte der
len
,src
unddest
:Die Sache zu verstehen, über die
loop
name ist, genau wiesrc
zugeordnet ist, den Wert$1234
,loop
zugewiesen die Adresse des Befehls nach. Also in diesem Fall, daLDX #len
nimmt 2 Byte (wie ich zeigen werde, in Kürze),loop
eingestellt ist$4000 + 2 = $4002
. Dies geschieht automatisch durch den assembler, aber natürlich könnte man dies alles auf Papier.Also, was ist der 6502 machine code für das obige Assembler-Programm?
Woher weiß ich das? Gut, ich habe nur die oben eingefügten Programm in der online-6502-assembler an http://www.masswerk.at/6502/assembler.html. Es auch zeigt Ihnen die genaue Zuordnung zwischen der Montage-und Maschinen-code:
Beachten Sie, wie der tatsächliche Wert des
LOOP
ist auch nicht zur Berechnung der Maschinen-code fürBNE LOOP
nur seine relative Adresse im Vergleich zu denBNE
Instruktion selbst:F7
-9, und der Unterschied zwischen$400B
und$4002
-9!Also, wenn Sie wurden diese von hand machen, würden Sie nur übersetzen, alles andere in Maschinen-code, dann, wenn Sie auf einen springen, Sie berechnen die Differenz zwischen der nächsten Anweisung die Startadresse und die jump destination address. Sollte es negativ sein für rückwärts springt und positiv nach vorne springt.
Den branch-Instruktionen nehmen Sie einen single-byte signed relative Adresse operand, der auf die Adresse der nächsten Anweisung, die Ausbeute der branch-target. Da der Sprungbefehl belegt immer 2 Byte, die Ziel-Adresse ist die Adresse der Niederlassung die Anleitung plus die (sign-extended) operand minus 2.
Beispiele:
$D0 $00
: no-op: der ast geht in die nächste Anweisung, unabhängig von der Bedingung$D0 $FE
: verzweigungspunkte zurück zu sich selbst, die Schaffung einer unendlichen Schleife, wennZ=0
.Einen
while
Aussage wirklich bedeutet:Mit 6502, keine dies ist extrem einfach, es sei denn, Sie machen eine Menge Annahmen. Wenn die Bedingung, die Sie testen, ist immer ein register, das vergleichen, Anweisungen (cmp, cpx, cpy) und branch-Instruktionen sind offensichtlich das, was Sie brauchen für 1.
Wenn es sich nur um ein einzelnes byte im Speicher abgespeichert sind, dann müssen Sie die Last, die ein byte, und dann vergleichen.
Wenn es ein 16-bit-Wert abgelegt in zwei bytes, die Sie brauchen, um zu laden und testen Sie die einzelnen Werte der byte.
Umgang mit Schwimmern? Wenn Sie geschrieben haben, oder zur Verfügung haben, um Ihnen einen floating-point-package (wie der Commodore 64 ROM BASIC floating-point-Routinen) wirst du brauchen, um Sie zu benutzen.
Können Sie sehen, warum high-level-Sprachen sind Datentypen.
Also wirklich, es hängt von der Art der Daten, die Sie zu tun haben, aber jede Implementierung von
while
im 6502 sollten so ziemlich befolgen Sie die oben genannten.Konkreten Fall identifizieren Sie in Ihrer Frage OK ist, wenn Sie wissen, die Daten, die Sie vergleichen wird immer in X-und, dass Ihr Ziel wird es immer sein +127/-128 Byte entfernt (range limit von Bxx Anweisungen).