Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: Assembler ::  8-Bit Mal-Rechnen     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
achtbit
Unregistrierter




Beitrag 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
Beitrag 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
Beitrag 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.=-
c++.de :: Assembler ::  8-Bit Mal-Rechnen   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.