PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Versteh Hello World in Assembler nicht ganz


pippo
2009-06-08, 17:29:22
In der Abschlussprüfung könnte es vorkommen, dass wir ein derartiges Programm in Assembler schreiben oder erklären müssten. Allerdings hab ich mich mit Assembler immer etwas schwer getan, bzw. wurde es zu schnell überflogen. Könnte mir vielleicht deshalb jemand folgenden Code von einem Motorola MC68000 erklären?


LF equ $0A ; ASCII definitions for Linefeed and
CR equ $0D ; Carriage Return
org $400 ; start of program (>= $400)
lea text,A0 ; get address of text string in A0
trap #15
dc.w 7 ; call system function 7 (print string)
trap #15
dc.w 0 ; call system function 0 (exit program)

; string to print, string ends with NULL
text dc.b 'Hello World!',CR,LF,0

equ ist mir noch klar, da soll quasi dem ASCII-Zeichen ein "Name" zugewiesen werden.

org $400 hier startet das Programm???

lea text,A0 ???

trap #15 ???

dc.w 7 starte funktion 7, aber wo ist die???

dc.w 0 starte funktion 0, exit

Geht das Programm jetz noch weiter? Als nächstes kommt wohl ein Kommentar und dann wird "text" der String zugewiesen. Fehlt danach nicht ein Semikolon?

.b und .w nimm ich an bedeutet Byte und Word

Sephiroth
2009-06-08, 18:02:41
MOTOROLA M68000 FAMILY Programmer’s Reference Manual (http://www.freescale.com/files/archives/doc/ref_manual/M68000PRM.pdf)

vielleicht hilft's

mehr (http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MC68000&fpsp=1&tab=Documentation_Tab)

Gast
2009-06-08, 19:38:52
In der Abschlussprüfung könnte es vorkommen, dass wir ein derartiges Programm in Assembler schreiben oder erklären müssten. Allerdings hab ich mich mit Assembler immer etwas schwer getan, bzw. wurde es zu schnell überflogen. Könnte mir vielleicht deshalb jemand folgenden Code von einem Motorola MC68000 erklären?


LF equ $0A ; ASCII definitions for Linefeed and
CR equ $0D ; Carriage Return
org $400 ; start of program (>= $400)
lea text,A0 ; get address of text string in A0
trap #15
dc.w 7 ; call system function 7 (print string)
trap #15
dc.w 0 ; call system function 0 (exit program)

; string to print, string ends with NULL
text dc.b 'Hello World!',CR,LF,0

equ ist mir noch klar, da soll quasi dem ASCII-Zeichen ein "Name" zugewiesen werden.

org $400 hier startet das Programm???

lea text,A0 ???

trap #15 ???

dc.w 7 starte funktion 7, aber wo ist die???

dc.w 0 starte funktion 0, exit

Geht das Programm jetz noch weiter? Als nächstes kommt wohl ein Kommentar und dann wird "text" der String zugewiesen. Fehlt danach nicht ein Semikolon?

.b und .w nimm ich an bedeutet Byte und Word

Zufällig Student in Augsburg? ;)

lea - load effective address -> Zeiger auf etwas in ein Adressregister laden
trap - stößt eine ausnahmebehandlung an, sind z.B. in der IDE68k eingebaut um irgendwie nach außen kommunizieren zu können. Auf reiner Hardware ist da natürllch kein Ausgabefenster dahinter ;)
ein 68k oder auch die cpu32 (z.B. 68332) können Befehle 8, 16 oder 32 bit breit ausführen, entsprechend .b, .w, .l

Aber hätte dir das nicht jemand beibringen sollen?

pippo
2009-06-08, 19:59:15
Das Skript verwendet Prof. G****k nicht nur an der FH ;) Bei uns wurde Assembler nur sehr kurz angeschnitten und irgendwie schnallts keiner. Meistens isses ein Ratespielchen wo was passiert :D
Danke soweit


@Sephiroth
Danke, werds mir mal anschaun.

Gast
2009-06-08, 20:27:19
Das Skript verwendet Prof. G****k nicht nur an der FH ;) Bei uns wurde Assembler nur sehr kurz angeschnitten und irgendwie schnallts keiner. Meistens isses ein Ratespielchen wo was passiert :D
Danke soweit


@Sephiroth
Danke, werds mir mal anschaun.

Wo darf dieser *hust* Mensch denn sonst noch sein Unwesen treiben? Mein Beileid auf jeden Fall schon mal :(

Tiamat
2009-06-08, 21:14:35
Was für ein Simulator wurde hierbei benutzt ?
Ich würd erstmal Ordnung in den Krautsalat bringen.



ORG $2000 ; Prog beginnt bei Startadresse 2000 HEX
START:

LEA text,A1 ; Laden der Adresse des Strings nach A1
MOVE.B #13,D0 ; Task13 Ausgabe für null-terminated-Strings
TRAP #15 ; jetzt wird der String ausgegeben

MOVE.B #9,D0 ; Task 9 beendet das Programm
TRAP #15 ; Sorgt für die Ausführung des letztes Taskbefehls

* Variablen und Strings
text DC.B 'HelloWorld',$0D,$A,0 ; null-terminated String

END START


Joar, das is eigentlich die einfachste Art und Weise n String auszugeben.

Also was man auf jeden Fall wissen muss IO handeln zu können und das ist von Simulator zu Simulator anders.
Beim EASY68k lassen sich Tasks in das Datenregister D0 laden.
Diese werden allerdings erst aufgeführt, wenn nach dem Task TRAP #15 erscheint. Der TRAP Befehl ist nicht nur für das Laden des Supervisor-Mode oder für die Exceptionbehandlung zuständig, sondern insbesondere für IO.
Diese Tasks haben eigentlich immer unterschiedliche Beschränkungen, zum Beispiel hier laden der Adresse vom null-terminated String ins Adressregister A1. Bei Easy68k gibt es zig-Tasks die man benutzen kann.

Besorg dir mal den Easy68k , der is echt super. Die Help-Datei ist auch echt gut, da findest du eigentlich alles drin.
Wir bekommen von unserem Prof den BSVC vorgeschrieben, den ich absolut hasse.

pippo
2009-06-10, 01:04:08
@ Gast
Ich konnt es selbst kaum glauben, weil ich ihn von der FH kenn. Aber stell dir mal genau das gegenteil von ihm vor, dann weisst, wie er bei uns ist ;)


@ Tiamat
Danke, so langsam leuchtets mir ein.

pippo
2009-06-20, 23:06:30
Jetzt hab ich mich halbwegs in Assembler eingelesen, aber kleine Fragen sind noch offen:

1) Wann genau verwendet man "#".
2) () / Pointer
3) Schleifen

zu 1) Wie ich das jetzt verstanden hab, wenn man einen Wert in ein Datenregister laden will, z.B. move.b #$FF
Durcheinander komm ich aber damit, dass z.B. move.b VAR1,D0 den Wert von VAR1 ins Datenregister 0 läd und move.b #VAR1,D0 scheinbar die Adresse von VAR1. Doch was will ich mit der Adresse im Datenrigster?

zu 2) Brauch ich einen Pointer lediglich, um z.B. mit move.l (A0),D3 den Inhalt eines Adressregisters zu kopieren... oder verwendet man Pointer anderweitig auch noch?

zu 3) Wie funktionieren Schleifen, bzw. wie programmier ich eine Abbruchbedingung? Läuft das z.B. wie bei einer SPS ab, dass ein Wert (z.B. 12) in ein Register geladen wird und dieses bei jedem Durchlauf um 1 erniedrigt wird, bis schließlich eine 0 zum Ende der Schleife führt?


Ich muss sagen, je mehr ich mich mit Assembler beschäftige, desto mehr Wischi Waschi kommt mir das vor. Da bin ich um das gute alte C schon froh

Tiamat
2009-06-21, 00:23:47
Hi,
also # benutzt man in 2 Fällen.
Der häufigste Fall : #10 eine direkter Zahlenwert, #$10, (hex)
es gibt aber auch den Fall, wo du an der Adresse eines Wertes interessiert bist.
Das wäre dann dein #Var,D0 Fall, wobei ich auch der Meinung bin, dass die Adresse nichts in einem Datenregister verloren hat.

Den Zeiger benötigst du, wenn du mit LEA anyVar,Ax eine Variable ins Adressregister geladen hast und du auf den Inhalt des Adressregisters zugreifen möchtest.
Beispielsweise hättest du an der Adresse $10FF ein Array mit 1,2,3,4,5
Hier würde dein Zeiger auf das erste Element des Array zeigen. Um an die anderen Elemente zu gelangen, wird der Zeiger erhöht (Ax)+. Das ist halt um einiges bequemer als mit den Adressen $10FF,$1101, $11.. rumzuhantieren.

Bei Schleifen gibt´s mehrere Variante

$1000 loop: ADD (Ax)+,D1
$1002 SUB #1,(Ax)
$1004 JMP loop
$1006

Das ist praktisch ne Endlosschleife
Um irgendwelche Bedingungen zu überprüfen, musst du die Condition-Code-Register benutzen. Nach den meisten Befehlen wird das CCR-Register aktualisiert und gibt dir Information über Bedingungen , die nach dem letzten Befehl geschehen sind.
Beispiel von eben

$1000 loop: ADD (Ax)+,D1
$1002 SUB #1,(Ax)
$1004 CMP #0,(Ax)
$1006 BNE loop

BNE bedeutet Branch if not equal und springt hier solange wieder nach loop, bis der Inhalt von Ax 0 geworden ist.
Da gibt es noch ne Reihe anderer Bedingungen, kannst ja mal unter BCC Branch on Condition nachschauen

ShadowXX
2009-06-21, 02:48:04
Das wäre dann dein #Var,D0 Fall, wobei ich auch der Meinung bin, dass die Adresse nichts in einem Datenregister verloren hat.

Da denkst du ziemlich kurz.....denk immer daran das du bei Assembler vollen Zugriff auf alles hast und man Datenregister auch "missbrauchen" kann (z.B. auch als Zwischenspeicher).

Kennst du selbstmodifizierenden Code?

Tiamat
2009-06-21, 11:11:38
Meinst du seine Prüfer wären begeistert, wenn er mit selbstmodifizierenden Code seine Aufgabe löst? Meines Wissens genießt dieser einen ganz schlechten Ruf, in einigen Büchern heißt es sogar, es sei strikt verboten!
Man kann grundsätzlich auch den Programmcounter als Schleifenzähler benutzen, solche Scherze wären bei ner Prüfung jedoch ne ziemlich schlechte Idee.

@Pippo
Durch ne größere Aufgabe schafft man es beim 68k schnell alle Register auszulasten, da kann man sich dann nur noch mit dem Stack behelfen.
Bei den Zeigern gibt es auch noch ne Variante , den Indirect index mode mit dem du größere Erhöhungen des Zeigers vornehmen kannst.
Wenn beim Beispiel von eben der Zeiger auf das erste Element des Arrays zeigt, dann kannst du mit einem Befehl auch direkt an das letzte Element herankommen.
MOVE.B (Ax,5),Dx jedoch musst du aufpassen, da die Indexgröße immer von der Datengröße abhängt. 5 würde dann einfach zur Adresse von Ax addiert werden.

Bei Byte entspricht der einzusetzende Index der gewählten Zahl 5
Bei Word jedoch 2*index
Bei Longword 4*index

Insgesamt kann man sich damit einige Schleifen sparen und komfortabler arbeiten.

pippo
2009-06-21, 13:12:14
Danke, hast mir sehr weitergeholfen