2010-11-18 13 views
1

Ich versuche, ein Programm zu schreiben, das unter anderem die Verwendung einer For-Schleife erfordert. Ich habe eine schreckliche Zeit zu versuchen, Beispiele für grundlegende Code wie diese auf anderen Websites zu finden.Basic for-Schleife in 68k-Montage?

Wenn jemand mir bitte eine einfache for-Schleife zur Verfügung stellen könnte, oder sogar die Anweisungen, die ich betrachten sollte, wäre ich dankbar. Und bitte, wenn Sie eine gute Quelle für 68k Anfänger Tutorials kennen, kommentieren Sie unten!

Danke!

+0

Haben Sie einen 68000 Prozessor und einen Compiler (irgendeine Sprache) dafür? –

+0

Ich benutze Easy68k (ein Emulator und Compiler). – Blackbinary

Antwort

5

Siehe here für eine Antwort auf Ihre Frage (3. Ergebnis in Google-Suche '68000 Assembly')

[Bearbeiten]

Add Antwort von Link

Die 68000 hat die seltene (eindeutige?) Eigenschaft, getrennte Adressen- und Datenregister zu haben. Es gibt acht Datenregister, D0-D7, und acht Adreßregister, A0-A7. A7 ist auch der Stapelzeiger SP. Dies bedeutet, dass die 68000-Assemblersprache einfacher zu folgen ist, da Sie leicht erkennen können, welche Register Daten enthalten und welche Adressen enthalten. Zum Beispiel ist dies 68000 Anordnung, die die Summe aus einer Reihe von Worten zu berechnen:

moveq #0, d0 
    moveq #0, d1 
    moveq #5, d2 
loop: 
    move.w (a0)+, d0 
    add.l d0, d1 
    dbra d2, loop 

[/ Bearbeiten]

+0

Ich habe diese ganze Seite gelesen (ich habe sie früher gefunden, wie ich schon sagte, ich habe etwas recherchiert), könntest du mich auf den Teil hinweisen, auf den du dich beziehst? Vielen Dank. – Blackbinary

+1

In den 68000 Grundlagen ist der loop: part eine 'for'-Schleife. Sie überspringen den Satz des D2-Registers, aber DBRA ist Decrement BRAnch nicht gleich 0. Also wird das D2 dekrementieren, bis es gleich 0 ist – KevinDTimm

+0

Danke, hab es jetzt. – Blackbinary

0

Wie in EASy68K Hilfe zitiert, die Syntax für einen for-Schleife in 68 K ist wie folgt:

FOR[.size] op1 = op2 TO op3 [BY op4] DO[.extent] 
    code 
ENDF 

oder

FOR[.size] op1 = op2 DOWNTO op3 [BY op4] DO[.extent] 
    code 
ENDF 

mit anderen Worten:

for.size counter_location = starting_condition to ending_condition step_size 
    operations to be executed each loop 
end of for loop 

Die Optionen step_size und .size sind beide optional.

Ein Beispiel in der Praxis.
Der folgende Code übernimmt die folgende Variable 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' Groß DC.B, 0

lea uppercase, a1 ; points a1 at the start of the uppercase variable 
lea $002000, a2  ; points a2 at the start of the destination address 

for d1 = #1 to #26 do.s 
    move.b (a1)+, (a2)+ 
endf 

; Memory locations $002000 - $002019 now contain ABCDEFGHIJKLMNOPQRSTUVYWXYZ 

Diese Schleife 26 Bytes von der Adresse, die durch a1 deutete auf sich bewegt, um die Adresse von A2 hingewiesen. Der Zähler wird in d1 gespeichert. Die Schleife beginnt bei 1 (# 1 zeigt eine "rohe Zahl" in Dezimalform an), erhöht sich jedes Mal und endet bei 26. Die do.s am Ende der ersten Zeile befasst sich mit der Größe des Vorwärtszweiges zu benutzen. Es ist auch optional, aber löst eine Warnung in EASy68K aus. Daher funktioniert die folgende for-Schleife auch, wenn Sie die Verzweigungsbedingung nicht festlegen müssen.

for d1 = #1 to #26 
    move.b (a1)+, (a2)+ 
endf 

In Bezug auf ein Tutorial empfehle ich http://mrjester.hapisan.com/04_MC68/. Es behandelt nicht einige der fortgeschritteneren Befehle und Themen, aber es bietet ein gutes Verständnis davon, was auf der Basis-/Zwischenstufe passiert.