PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : assembler



gast
02.03.2004, 17:37
vielleicht kann mir wer erklären, was das prog hier machen soll:


define wert byte[1]
define adr word[2]
define b2 byte[2]
define w3 word[3]
define w4 word[4]


gosub LOAD_GETBYTE

define GETBYTE &HA2

for adr=0 to &H1FFF
sys GETBYTE
PRINT adr,":" wert
next

end


#LOAD_GETBYTE
b2=&HC6
w3=&HB7A1
w4=&H8100
return


das zugehörige assembler-prog schaut so aus:


LDA $4711
STA $A1
RTS

danke schonmal im voraus

02.03.2004, 18:28
wär hilfreich, wenns mir schnell wer sagen könnte

jörg
02.03.2004, 18:56
Das CCBASIC Programm liest alle Bytes ab Adresse 0 bis Adresse &H1FFF und zeigt sie über RS232 an.
Das Assembler-Programm brauchst Du dazu nicht.

02.03.2004, 19:21
könntest dus mir ein bisl genauer erklären, ich verstehs noch net ganz..

also zuerst die variablendef. is klar, dann wir den 3 werten etwas zugewiesen (wozu genau?), die zeile is mir unklar:

define GETBYTE &HA2

und wie kommt dann was in wert rein?

getbyte muss ja auch als assemblerroutine eingebunden werden..

jörg
02.03.2004, 20:34
Also: der Trick ist die Speicherbelegung bei CCBASIC:
byte[1] liegt auf Adresse &HA1, byte[2] auf &HA2 usw.

Im Unterprogramm #LOAD_GETBYTE werden diese Variablen mit einem (noch unvollständigen) Assemblerprogramm belegt:
byte[2] = &HA2 = &HC6 -- der opcode des Befehls LDA
word[2] = HhA3/4 ist noch nicht berschreiben; aber da liegt ja "adr", und das kriegt nachher in der FOR-Schleife die Werte &H000 bis &H1FFF -- das ist dann die Adresse für den LDA - Befehl
word[3] = &HA5/6 = &HB7A1 -- der Befehl STA $A1: speichert das Resultat nach &HA1 = byte[1] = "wert".
word[4] = &HA7/8 = &H8100 -- 81 ist der Befehlt RTS; die 00 wird nicht mehr durchlaufen.

In der FOR-Schleife wird mit der Änderung von "adr" also die Adresse des LDA - Befehls des Assemblerprogramms gesetzt.

SYS GETBYTE ruft das Assemblerprogramm auf (GETBYTE ist ja &HA2);
der LDA - Befehl liest jetzt das Byte an Adresse "adr", der STA - Befehl speichert's nach $A1 = "wert", und das Assembler-Programm kehrt mit RTS zurück.

Jetzt kann "wert" (liegt ja auf Adresse &HA1 !) mit PRINT ausgegeben werden.

jörg
02.03.2004, 20:39
Ach so:
"getbyte muss ja auch als assemblerroutine eingebunden werden":

In diesem Fall wird die Assembler-Routine nicht per SYSCODE eingebunden, sondern wird mit den BASIC Wertzuweisungen selbst "gesetzt".
Ist nicht schön (zu Lesen, für uns Menschen), macht aber für den Rechner keinen Unterschied, woher die Bytes kamen...

02.03.2004, 20:40
jap aber das assemblerprogramm, das man schreibt, entspricht ja dem von ganz oben .. und da versteh ich net, wieso das immer in der schleife aufgerufen wird, was macht es und wie kommt dann der bytewert in "wert".

wozu is &HA2

02.03.2004, 20:42
sorry, hab net die obige message übersehen

02.03.2004, 21:32
wie weiß der prozessor, dass lda danach 2 byte für das argument verwendet .. man kann lda auch nur ein byte übergeben

jörg
02.03.2004, 22:14
LDA: das stimmt; das ist generell so bei dieser CPU: die Befehle können unterschiedliche Adressierungs-Arten haben. Damit die CPU das erkennen kann, haben sie auch unterschiedliche Op-Codes:

LDA = Load Accumulator from Memory:


Source Addressing
Forms Modes OpCode Operands
LDA (opr) IMM A6 ii
LDA (opr) DIR B6 dd
LDA (opr) EXT C6 hh ll
LDA ,X IX F6
LDA (opr),X IX1 E6 ff
LDA (opr),X IX2 D6 ee ff


Hier ist es der LDA mit dem OpCode "C6" -- also "Extended Addressing", es folgt noch die Adresse, bestehend aus high byte und low byte.

02.03.2004, 22:43
ok thx, gibts wo ne auflistung mit den opcodes und den adressierungsarten?

jörg
02.03.2004, 23:13
Datenblätter:
klar, ich denke, hier bei uns (https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=48), oder sonst bei Motorola.