Assemblerprogramm (Fakultät)

Hallo!

Ich habe hier mal ein Programm, dass ihr mal checken müsst ob das auch so richtig ist. Berechnet werden soll die 10te Fakultät. Befehlssatz vom Motorola MC68000. Zum Schluss soll das Erg. auf Adr. $4000 verschoben werden und start ab Adr. $2100

org $2100

move.l #$0001,D2
move.l #$0000,D1

loop

add.l #$0001,D1
mulu D1,D2

cmp.l #$35980,D2
bne loop

move D2,$4000

Könnte man das so machen oder doch nicht ganz richtig?

Dann habe ich noch eine andere Aufgabe. Der Inhalt des Datenregisters D1 ist $A45B9C1D. Der Inhalt soll mit ASR.L #6,D1 verschoben werden. Was steht dann in D1 drin?

Also ich habe mir jetzt gedacht diese Zahl erstma binär darstellen. Beim ASR rechts verschieben bleibt doch das höhste Bit immer an der gleichen Stelle. Jetzt dachte ich mir, die letzten sechs Stellen diese r Binärzahl wegstreichen und zwischen 1 und den anderen vorn 6 Nullen einzufügen. kP ob das so richtig ist.

10100100010110111001110000011101 = A45B9C1D
10000000100100010110111001110000 = 40916E70 in D1

Ist das so korrekt?

Vielen Dank

Dann habe ich noch eine andere Aufgabe. Der Inhalt des
Datenregisters D1 ist $A45B9C1D. Der Inhalt soll mit ASR.L
#6,D1 verschoben werden. Was steht dann in D1 drin?

Also ich habe mir jetzt gedacht diese Zahl erstma binär
darstellen. Beim ASR rechts verschieben bleibt doch das höhste
Bit immer an der gleichen Stelle. Jetzt dachte ich mir, die
letzten sechs Stellen diese r Binärzahl wegstreichen und
zwischen 1 und den anderen vorn 6 Nullen einzufügen. kP ob das
so richtig ist.

10100100010110111001110000011101 = A45B9C1D
10000000100100010110111001110000 = 40916E70 in D1

Ist das so korrekt?

Lang, lang ists her. Soweit ich weiss wird bei arithmetischen Schiebeoperationen das Vorzeichenbit „ansteckend“, um korrektes Verhalten für 2k-Darstellung zu erreichen, dh das Bit wird (a) erhalten und (b) in den eigentlichen Operand übernommen, so dass das richrige Ergebnis das wäre:

11111110100100010110111001110000 = FE916E70

Hallo Fragewurm,!

Ich habe hier mal ein Programm, dass ihr mal checken müsst ob
das auch so richtig ist. Berechnet werden soll die 10te
Fakultät. Befehlssatz vom Motorola MC68000. Zum Schluss soll
das Erg. auf Adr. $4000 verschoben werden und start ab Adr.
$2100

org $2100

move.l #$0001,D2
move.l #$0000,D1

loop

add.l #$0001,D1
mulu D1,D2

cmp.l #$35980,D2
bne loop

move D2,$4000

Könnte man das so machen oder doch nicht ganz richtig?

Sollte laufen ist aber viel zu kompliziert:

move.l #$35980,D1
move.l D1,$4000

Wäre sinnvoller, denk mal etwas über meinen Vorschlag nach und wieso ich darauf komme !!

Also ich habe mir jetzt gedacht diese Zahl erstma binär
darstellen. Beim ASR rechts verschieben bleibt doch das höhste
Bit immer an der gleichen Stelle.

Nein das hast du falsch verstanden, schau nochmal genau nach !!!

MfG Peter(TOO)

Hey danke euch…habe aber trotzdem noch zwei Fragen.

zu 1. Meinst du, wenn gleich die 10te Faktultät in das Register schieben würde, ohne die Scheife und das Hochzählen?

zu 2. Also werden anstatt der von mir gedachten Nullen doch Einsen am Anfang eingeschoben? Gibts dazu irgendeine Seite, wo das mal genauer erklärt ist. Finde immer nur so allgemeine Sachen dazu.

Danke

zu 1. Meinst du, wenn gleich die 10te Faktultät in das
Register schieben würde, ohne die Scheife und das Hochzählen?

So siehts wohl aus. Warum sollte man sich die ganze Mühe mit einer Schleife machen, wenn doch sowieso immer nur das selbe Ergebnis rauskommt? OK, für Hausaufgaben/Übungen vielleicht, aber selbst da ist die Aufgabenstellung beknackt. Man könnte wenigstens eine kleine Routine schreiben, die n als Parameter erwartet und dann n! berechnet.

zu 2. Also werden anstatt der von mir gedachten Nullen doch
Einsen am Anfang eingeschoben? Gibts dazu irgendeine Seite, wo
das mal genauer erklärt ist. Finde immer nur so allgemeine
Sachen dazu.

Hier ist mal eine kleine Dokumentation zum Befehlssatz:
http://www.tigernt.com/onlineDoc/68000.pdf

Selbst das könnte man noch interpretieren, aber wenn man sich zB mal mit 4bittigen Zahlen die -2 anschaut (1110) und die arithmetisch eine Stelle nach rechts verschiebt, dann kommt mit „ansteckendem“ Vorzeichen -1 (1111) raus, ohne aber -5 (1011). Insofern sieht das doch recht gut aus.

Hallo Fragewurm,

zu 1. Meinst du, wenn gleich die 10te Faktultät in das
Register schieben würde, ohne die Scheife und das Hochzählen?

Genau da liegt dein Denk-Fehler.

Dein Programm kann man erst dann schreiben, wenn man das Ergebnis schon kennt !! Dabei stellt sich die Frage, wofür man dann ein Programm zur Berechnung schreiben soll.

Zudem was machst du, wenn dein Programm die Fakultäten von 1! bis 10! berechnen soll ???

zu 2. Also werden anstatt der von mir gedachten Nullen doch
Einsen am Anfang eingeschoben? Gibts dazu irgendeine Seite, wo
das mal genauer erklärt ist. Finde immer nur so allgemeine
Sachen dazu.

Das sollte aber bei den Allgemeinen Sachen stehen !!
Es gibt logische und arithmetische Schiebebefehle.

http://www.freescale.com/files/archives/doc/ref_manu…
Seite 3-9 (PDF = Seite 80)

MfG Peter(TOO)

Da hast du natürlich recht. Aber wie könnte mans anders machen? Wahrscheinlich brächte ich anstatt des CMP Befehls irgendwas anderes. Zum Beispiel, dass die Schleife dann nur 10mal durchlaufen wird.

Danke
Rene

Hallo Rene,

Da hast du natürlich recht. Aber wie könnte mans anders
machen? Wahrscheinlich brächte ich anstatt des CMP Befehls
irgendwas anderes. Zum Beispiel, dass die Schleife dann nur
10mal durchlaufen wird.

Der CMP befehl ist schon richtig, aber du musst ihn auf den Schlufenzähler anwenden.
Dann kann man den Wert noch als Variable statt Immiadiate einrichten und schon kann man die Funktion verwenden um alle möglichen Fakultäten zu berechnen, bis des Register überläuft.

MfG Peter(TOO)