PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ein paar Anfängerfragen zu Assemblerprogrammierung


Gast
2009-12-13, 23:06:39
Hallo miteinander,

wie der Titel schon sagt hab ich ein paar Fragen zur Assemblerprogrammierung, mein Skript ist leider sehr ungenau.

(Es geht um den M68000 falls das von Interesse ist, aber die Fragen sind eher allgemein denke ich).

1. Ich würde gerne eine Zahl in einer "Variablen" speichern. Was genau ist der Unterschied zwischen EINS DC 1 und EINS EQU 1? Kann man Konstanten nachträglich nicht mehr verändern oder was ist der Sinn von DC? Wenn man das ganze mit einer Hochsprache vergleicht, dann entspricht EQU wohl noch am ehesten dem "="?

2. Ich würde mit MOVE.W gerne eine Zahl in ein Datenregister, sagen wir D0, schreiben. Muss ich das Datenregister erst mit CLR leeren, oder darf ich auch direkt drüberschreiben?

3. Die Controlbefehle, z.B. BNE (Branch not equal) sind vom Programmfluss völlig unabhängig und schauen einfach immer nur, was bei ihrem Aufruf im Statusregister steht, völlig egal wer zu welcher Zeit das Statusregister verändert hat? Beispiel:

LABEL SUB.W #1, D0 ; erniedrigt Inhalt des Datenregisters D0 um 1
BNE LABEL ; falls in D0 nicht die 0 steht, wird wiederholt.

Was ich jetzt genau meine: die BNE-Zeile hat ja offensichtlich gar keinen Bezug zum Subtraktionsbefehl (vom Loop mal abgesehen) und das ganze funktioniert trotzdem, weil der Subtraktionsbefehl bei einem 0-Ergebnis eben das Zerobit setzt und BNE das später bemerkt. Würden zwischen Subtraktion und BNE noch tausend andere Dinge stehen, die das Zerobit allerdings in Ruhe lassen, so würde das ganze trotzdem funktionieren?

4. Was steht nach einem CLR im Speicher, die Zahl 0 mit der man auch rechnen kann? Also

CLR.L D0
ADD.L #5, D0 ; in D0 würde jetzt 5 stehen, weil das CLR zu Beginn eine 0 reinschrieb?


5. In welchen Situationen muss ich mit DS Speicher reservieren? Ich könte ja auch erst mit EQU eine Wertzuweisung machen und dann CLR aufrufen, hätte das den selben Effekt? Dann hätte ich ja meinen Speicherplatzund könnte mit MOVE etwas neues reinschreiben, ohne DS benutzt zu haben.


Mir fällt sicher noch mehr ein, aber das solls fürs erste gewesen sein.

Danke!

Coda
2009-12-13, 23:37:21
0. Das ganze ist sehr wohl hochgradig Motorola spezifisch
1. Weiß ich nicht, weil ich die Instruction nicht kenne.
2. Kann man mit ziemlicher Sicherheit drüberschreiben
3. Ja.
4. Schau im Instruction-Manual (http://www.tigernt.com/onlineDoc/68000.pdf): [destination] <- 0
5. Ich nehme mal an EQU ist irgend eine Load-Instruction? Naja, wenn du die Daten hast auf die man mehrfach zugreift, dann sollten sie schon ins Datensegment ;)

Coda
2009-12-13, 23:45:11
EQU definiert nur eine Konstante. Das ist also wohl das gleiche wie wenn du den Wert direkt als Instruction-Parameter angibst.

Das ist natürlich nur vorteilhaft, wenn man die Werte lokal braucht und nicht verändern muss.

Tiamat
2009-12-14, 08:51:17
Zufällig HS-Mannheim ? ^^

Ja da fängt die Verwirrung schon zu Recht an.
Equ deklarierte Konstanten sind fix, können nicht mehr verändert werden.
DC ( define Constant ) deklarierte Konstanten können soweit ich mich erinnern kann, noch verändert werden.
Jetzt gibt es noch DS ( define Storage ). Damit wird einfach ein Speicherbereich reserviert, der später dynamisch belegt wird.

Bei DS meint die Angabe :
var: DS 1 ; Ein Long Speicherberreich wird reserviert.
während hingegen die Angabe
const: DC 6 ; Dieser Speicherbereich hat den vorinitialisierten Wert 6

2. Mit Mov D1, D6 überschreibst du sowieso den Wert des Datenregisters. In D6 steht dann nur der Inhalt von D1

Wenn du in einem Register z.B summierst und vorher alle Register ausgelastet waren, dann sollte man das Ergebnisregister clearen, um keine Überraschungen zu erleben.

3. Die CCR werden nach jeder Zeile aktualisiert, beziehen sich also auf zuletzt festgestellte Konditionen.
Beim Branchen muss man sich selbst Gedanken machen, was sinnvoll ist.
loop: SUB #1, D0
...
bne 0, D0 ; hatte glaub ich 2 Parameter ? oder
bnz loop ; Branch if not zero

Wenn du ein positiven Registerwert auf 0 prüfst, dann rödelt der Loop natürlich bis zum Overflow und weit darüber hinaus.

Bei einem CLR wird das Register einfach genulled. Man kann sofort weiterarbeiten damit.

Gast
2009-12-14, 09:22:37
0. Das ganze ist sehr wohl hochgradig Motorola spezifisch
1. Weiß ich nicht, weil ich die Instruction nicht kenne.
2. Kann man mit ziemlicher Sicherheit drüberschreiben
3. Ja.
4. Schau im Instruction-Manual (http://www.tigernt.com/onlineDoc/68000.pdf): [destination] <- 0
5. Ich nehme mal an EQU ist irgend eine Load-Instruction? Naja, wenn du die Daten hast auf die man mehrfach zugreift, dann sollten sie schon ins Datensegment ;)

Typisch Keine Ahnung , aber als "Experte" antworten.
Immer diese Halbwahrheiten. Traurig


1.versuchs dir wie in Basic vorzustellen
xxx Equ wert würde einem LEt XXX = Wert
x: DC wert1,wert2,wert3,... entspricht Data wert1,wert2,wert...
x: DS.l wert würde einem DIm x(wert) as Long

2. Ein CLR ist nicht nötig den wert den du mit MOVE #$05,d0 in Do schreibst ist $05. (Btw Adressierung beachten nicht $05,d0 sondern #$05,d0 !)

3. Nein würde nicht immer funktionieren :
MOVE #$00,d1
MOVE #$10,d0
Loop: SUBQ #1,d0
ADD #1,d1
CMP #$02,d1
BNE loop :ergebnis aus CMP #$02,d1 würde verwendet !

Da sich Bxx oder andere Testbefehle immer auf den letzen Vergleich (Test) bezieht

4. nach CLR.l D0 steht $0 im Register (Speicherstelle)

5. EQU reservieren keinen Speicherplatz, sondern sind nur Assembler interne Definition. Nur mit DS bzw DC wird auch Speicher im Data-Teil assoziiert.




6. Lass dich nicht von sogenannten "Experten" vollquatschen !

Oid
2009-12-14, 11:51:24
Hallo miteinander,

wie der Titel schon sagt hab ich ein paar Fragen zur Assemblerprogrammierung, mein Skript ist leider sehr ungenau.

(Es geht um den M68000 falls das von Interesse ist, aber die Fragen sind eher allgemein denke ich).

1. Ich würde gerne eine Zahl in einer "Variablen" speichern. Was genau ist der Unterschied zwischen EINS DC 1 und EINS EQU 1? Kann man Konstanten nachträglich nicht mehr verändern oder was ist der Sinn von DC? Wenn man das ganze mit einer Hochsprache vergleicht, dann entspricht EQU wohl noch am ehesten dem "="?


Das EQU entspricht in z.B. C dem #define xy.

Beispiel:

LEN EQU $100


Der Assembler ersetzt hier einfach alle "LEN" im Quelltext durch "$100", bevor er den Code generiert. Es wird also kein Speicher belegt.

Mit DC wird nun tatsächlich ein Wert in den Speicher geschrieben. Das "Define Constant" bedeutet hier nur, dass der Befehl eigentlich für Daten im ROM vorgesehen ist. Aber natürlich kann man damit auch Daten in den RAM schreiben, dessen Daten ja nicht konstant sind.


2. Ich würde mit MOVE.W gerne eine Zahl in ein Datenregister, sagen wir D0, schreiben. Muss ich das Datenregister erst mit CLR leeren, oder darf ich auch direkt drüberschreiben?

Kannst direkt drüberschreiben.

3. Die Controlbefehle, z.B. BNE (Branch not equal) sind vom Programmfluss völlig unabhängig und schauen einfach immer nur, was bei ihrem Aufruf im Statusregister steht, völlig egal wer zu welcher Zeit das Statusregister verändert hat? Beispiel:

LABEL SUB.W #1, D0 ; erniedrigt Inhalt des Datenregisters D0 um 1
BNE LABEL ; falls in D0 nicht die 0 steht, wird wiederholt.

Was ich jetzt genau meine: die BNE-Zeile hat ja offensichtlich gar keinen Bezug zum Subtraktionsbefehl (vom Loop mal abgesehen) und das ganze funktioniert trotzdem, weil der Subtraktionsbefehl bei einem 0-Ergebnis eben das Zerobit setzt und BNE das später bemerkt. Würden zwischen Subtraktion und BNE noch tausend andere Dinge stehen, die das Zerobit allerdings in Ruhe lassen, so würde das ganze trotzdem funktionieren?

Jo, BNE schaut einfach nur auf das Zero-bit. Egal wodurch es zuletzt verändert wurde. Es ist natürlich ratsam den bedingten Sprung direkt nach der Bedingung zu schreiben :D.


4. Was steht nach einem CLR im Speicher, die Zahl 0 mit der man auch rechnen kann? Also

CLR.L D0
ADD.L #5, D0 ; in D0 würde jetzt 5 stehen, weil das CLR zu Beginn eine 0 reinschrieb?

Richtig.


5. In welchen Situationen muss ich mit DS Speicher reservieren? Ich könte ja auch erst mit EQU eine Wertzuweisung machen und dann CLR aufrufen, hätte das den selben Effekt? Dann hätte ich ja meinen Speicherplatzund könnte mit MOVE etwas neues reinschreiben, ohne DS benutzt zu haben.


Siehe meine Antwort zu 1.
DS reserviert nur Speicher (ohne den Inhalt zu verändern!), DC belegt ihn zudem mit einem Wert vor.

KhanRKerensky
2009-12-14, 11:59:29
Typisch Keine Ahnung , aber als "Experte" antworten.
Immer diese Halbwahrheiten. Traurig

3. Nein würde nicht immer funktionieren :
MOVE #$00,d1
MOVE #$10,d0
Loop: SUBQ #1,d0
ADD #1,d1
CMP #$02,d1
BNE loop :ergebnis aus CMP #$02,d1 würde verwendet !

Da sich Bxx oder andere Testbefehle immer auf den letzen Vergleich (Test) bezieht

Lern lesen.
die das Zerobit allerdings in Ruhe lassen
Unter der Bedingung ist Codas Aussage vollkommen richtig, Herr "Experte".

Gast
2009-12-14, 14:21:05
Lern lesen.

Unter der Bedingung ist Codas Aussage vollkommen richtig, Herr "Experte".

Wenn ein Post den Satz
"versuchs dir wie in Basic vorzustellen"
kann man es getrost ignorieren :D

Coda
2009-12-14, 23:11:29
Flamende Gäste ignorier ich sowieso ;)