| Autor |
Nachricht |
achtbit
Unregistrierter
|
achtbit Unregistrierter
19:04:39 05.06.2012 Titel: |
8-Bit Mal-Rechnen |
Zitieren |
Hallo zusammen!
Ich veruche gerade ein Programm in Assembler(uC-Familie: 8051) zu schreiben.
Das Programm soll 2 8 Bit-Zahlen multiplizieren mit der "Verschiebetechnik".
Angabe:
Multiply 2 8-Bit values R0 and R1 with the shift and add method. The
result has to be returned also in (R0,R1) with R0 Low-Byte and R1 High-Byte. The
method will be explained in the lecture.
Mein Code:
| Assembler: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | NAME arithlib_MAIN ;benennen des modules
;Hier werden Segmente eines bestimmten Segmenttyps definiert
MAIN_SUB segment CODE ; MAIN_SUB für Programmspeicher
DATEN segment DATA ; DATEN für indirekter interner RAM
STACK segment IDATA ; STACK für indirekter interner RAM
stacksize equ 10 ; stacksize=10
;---------reset---------
cseg at 0
jmp MAIN ; sprung ins Hauptprogramm
;--------stack----------
rseg STACK ; mit rseg kann man diese "Speichersegmente" auswählen
ds stacksize ; reserviert 10 Bytes für stack
;--------reservieren--------
rseg DATEN ; mit rseg kann man diese "Speichersegmente" auswählen
mult: ds 1
wert: ds 1
zwischenspeicher: ds 1
rseg MAIN_SUB
;-------main--------
MAIN: mov sp,#STACK-1
mov sp,#stack-1
call mult_8bit
;call mult_16bit
STATICRUN: JMP $
mult_8bit:
mov r0,zwischenspeicher
mov a,mult
mov r1,#0
jb acc.0,shift1
rlc R0
jnb acc.0,null1
shift1: rlc R0
null1: jb acc.1,shift2
rlc R0
jnb acc.1,null2
shift2: push a
mov a,zwischenspeicher
add a,r0
mov zwischenspeicher,a
rlc R0
null2: jb acc.2,shift3
rlc R0
jnb acc.2,null3
shift3: push a
mov a,zwischenspeicher
add a,r0
mov zwischenspeicher,a
rlc R0
null3: jb acc.2,shift4
rlc R0
jnb acc.2,null4
shift4: push a
mov a,zwischenspeicher
add a,r0
mov zwischenspeicher,a
rlc R0
null4: jb acc.2,shift5
rlc R0
jnb acc.2,null5
shift5: push a
mov a,zwischenspeicher
add a,r0
mov zwischenspeicher,a
rlc R0
null5: jb acc.2,shift6
rlc R0
jnb acc.2,null6
shift6: push a
mov a,zwischenspeicher
add a,r0
mov zwischenspeicher,a
rlc R0
null6: jb acc.2,shift7
rlc R0
jnb acc.2,null7
shift7: push a
mov a,zwischenspeicher
add a,r0
mov zwischenspeicher,a
rlc R0
null7: jb acc.2,shift8
rlc R0
jnb acc.2,null8
shift8: push a
mov a,zwischenspeicher
add a,r0
mov zwischenspeicher,a
rlc R0
null8: rlc R0
RET
END | |
Ich finde der Code ist nicht wirklich richtig. rlc register geht doch nicht mal, da nur rlc acc funktioniert. Und Pop a gehört auch noch irgendwo hin, aber habe ich das Programm soweiso anders schreiben muss, dass es funktioniert.
Ich hab jetzt einfach 8mal verschoben, da man ja 8mal schieben muss bei der 8bit multiplikation. Und kann mir einer erklären was mit dem Carry hier passiert? Bzw. was ich machen muss mit dem?
Und bitte gebt mir Tipps wie ich das programmieren kann.
Danke im voraus!
Es wird einfach R0*R1 gemacht. Und R0 wird immer um 1 nach links verschoben.
mfg achtbit |
|
|
|
 |
rkhb
Mitglied
Benutzerprofil
Anmeldungsdatum: 19.09.2010
Beiträge: 204
|
rkhb Mitglied
22:25:38 05.06.2012 Titel: |
Re: 8-Bit Mal-Rechnen |
Zitieren |
| achtbit schrieb: | | Multiply 2 8-Bit values R0 and R1 with the shift and add method. The result has to be returned also in (R0,R1) with R0 Low-Byte and R1 High-Byte. The method will be explained in the lecture. |
Mir scheint, Du stehst wie der Ochs vorm Berg. Zumindest stehe ich so vor Deinem Programm .
Zunächst musst Du Dir ohne Assembler klar werden, was zu tun ist. Am besten ist, Du machst mal eine russische Bauernmultiplikation (http://de.wikipedia.org/wiki/Russische_Bauernmultiplikation) mit 13*7 auf dem Papier. Dann machst Du dasselbe binär (13=00001101, 7=00000111). Der Trick ist, dass "Halbieren mit Abwärtsrundung" im Binärsystem gleich "shift right" und "Verdoppeln" gleich "shift left" ist. Verdoppeln kann man aber auch, indem man das Register mit sich selbst addiert (ADD A, acc). Der zweite Trick ist, dass Du mit der Addition nicht bis zum Schluss warten musst, sondern zwei Zahlen gleich addieren kannst. Mach das noch ein paar Mal mit verschiedenen Binärzahlen. Wenn Du Dir sicher bist, dass Du das geschnallt hast, dann versuche Dich am Assemblercode.
Es gibt noch (mindestens) eine weitere "shift and add method": Bei dieser Methode wird nicht der Multiplikator, sondern das Zwischenergebnis verdoppelt. Das läuft so ähnlich wie die Schulmethode der Multiplikation. Welche Methode Du anwenden sollst, "will be explained in the lecture".
Das Carry nimmt sowohl das herausgeschobene Bit auf wie auch den Überlauf bei einer Addition. Beachte, dass beim Schieben (bzw. Rotieren) das vorige Carry auch hineingeschoben wird. Wenn es notwendig werden sollte, dass auf jeden Fall eine '0' hineingeschoben werden muss, musst Du vorher das Carry mit 'CLR C' löschen.
Normalerweise gibt es tatsächlich nur den 'RLC A'-Befehl. Du musst also A sichern, A mit dem zu schiebenden Wert laden, schieben, geschobenes A abspeichern, gesichertes A zurückholen. Und überlegst Dir, wie Du ohne Sichern und Laden auskommen könntest. Vielleicht gibt es aber auch Prozessoren, die ein 'RLC R0' verarbeiten können. Guck in Deine Unterlagen, welchen 8051-Prozessor Du genau nehmen sollst.
viele grüße
ralph |
|
|
|
 |
nachtfeuer
Moderator
Benutzerprofil
Anmeldungsdatum: 08.04.2010
Beiträge: 1432
|
nachtfeuer Moderator
08:06:03 06.06.2012 Titel: |
|
Zitieren |
So eine ähnliche Frage hatten wir schon mal:
http://www.c-plusplus.de/forum/280689
Wichtig sind eigentlich nur die Linksverschiebung (und add) und die Überlegung, wie groß das Ergebnis sein darf.
Wie man guckt, ob man addieren muß oder nicht kann man so oder so hinbekommen. |
_________________ HhxV9rU5D8o236dZF7bMQ4Dys1_TuUmI4mZM.d2qD15ERi_0dgcHP0UViL3e-4WUi0nXXNwDYqA10sLEgjBVtdhE
tpehI7qHRZESiO_7LhPZFMQWNoiVrJDsEGD26n.H0lV8wOwYAe8UsbUJe5m65NyPaghnSoMzROo2gJ6nTeVSkxLk
a6hvNe11r9U7xddV9mq6NEi_V0C9k4augEKVSW3PV8LgCYum7KaXc9Ijq_ZT7zhspI.=-
|
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|