Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: "Variablen" in ASM die 2. Kategorie: Progr. Assembler, TaskingTools, OS (von André H. - 12.08.2004 10:34)
Als Antwort auf "Variablen" in ASM die 2. von Thomas - 11.08.2004 23:18
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT_V2, OSOPT V3.0
Hallo Thomas,

Zuerst: Bitte benutze nicht das pre-Tag für Quellcode.
Der Text/Quellcode wird dann unleserlich klein. Das habe ich schon öfters im Forum erwähnt.
Benutze dafür bitte die speziellen Tags, die ich für's Forum eingeführt habe, die über
dem Kommentarfeld bei den Hinweisen zum Einfügen von HTML stehen.
Benutze deshalb bitte für
- C2-Code: <code>Quellcode</code>
- ASM-Code: <asm>Quellcode</asm>
So wird der Quellcode nebenbei auch nochkorrekt formatiert und u.a. Schlüsselwort
hervorgehoben, wie in den Entwicklungsumgebungen.
Ich war so frei und habe in diesem Posting Dein pre-Tag durch das asm-Tag ausgetauscht.

Nun aber zu Deinem Problem:

> so ich hatte vor einiger Zeit schon mal eine Frage zu "Variablen" in Assembler gestellt. Leider
> habe ich anscheinend immer noch ein paar Verständnisprobleme. Ich habe nun einmal folgendes
> probiert:

zahl  equ  11111111b

                public  lauflicht
lauflicht       proc far
                ;alle Ports auf Ausgang setzen
                extr#1
                mov     DP1L,#255
                mov     R2,#8
        loop1:
                ;Adresse in R12 schreiben
                mov     R12,#zahl
                ;Wert in R1 laden
                mov     R1,[R12]
                ;Shift-Rechts
                shr     R1,#1
                ;zahl zurück auf Speicherplatz
                mov     [R12],R1
                ;Ausgabe
                mov     P1L,#zahl
                mov     R3,#65000
        loop2:
                nop
                nop
                nop
                nop
                nop
                nop
                nop
                nop
                nop
                nop
                cmpd1   R3,#0
                jmpr    cc_NE,loop2

                cmpd1   R2,#0
                jmpr    cc_NE,loop1

                rets            ;Ruecksprung
lauflicht       endp

>
> Das Programm sollte eigentlich ein Lauflicht erzeugen. Ich bekomme jedoch die Fehlermeldung ILL OPA.
> Soweit ich weiÃ? bedeutet dies das ich einen Speicherzugriff auf eine ungerade Adresse vorgenommen
> habe. Ich habe also mal bei der Suche nach dem Fehler mit einer geraden Zahl angefangen, also
> beispielsweisezahl equ     11111110bNun bekomme ich zwar keine Fehlermeldung mehr, aber es leuchten auch nur die durch 11111110
> gesetzten LEDs.
> Mir ist eigentlich klar, dass das auch nicht anders sein kann, da der Fehler logischerweise woanders
> zu suchen ist, da es ja egal ist was für eine Zahl im Speicher steht. 'zahl' wird also bei einem
> der Befehle nicht als Konstante betrachtet sondern als Speicheradresse. Leider habe ich nicht
> herausgefunden bei welchem Befehl mein Fehler liegt. Ich hoffe ihr könnt mir mal wieder weiterhelfen.

Der Fehler liegt, wie Du richtig erkannt hast, an der ungeraden Adresse.
Undzwar genau hier:

                ;Adresse in R12 schreiben
                mov     R12,#zahl
                ;Wert in R1 laden
                mov     R1,[R12]
                ;Shift-Rechts
                shr     R1,#1
                ;zahl zurück auf Speicherplatz
                mov     [R12],R1

Bei Word(16Bit)-Zugriffen muÃ? die Adresse immer geradzahlig sein, da der Datenbus
ebenfalls mit 16Bit arbeitet. (Sonst wird der Opa krank ;-) )
Mit einem mov R1,[R12], wobei R12 z.B. 100 ist, greifst Du gleichzeitig
auf die Adresse 100(Lo-Byte) und 101(Hi-Byte) zu.

Ungerade Adresse sind nur bei Byte-Operationen möglich.
Da Du aber, so wie ich es sehe, nur mit Byte-Werten hantieren willst, solltest Du
besser mit MOVB arbeiten.
Also so:

                ;Adresse in R12 schreiben
                mov     R12,#zahl
                ;Wert in RL1 laden
                movb    RL1,[R12]
                ;Shift-Rechts
                shr     R1,#1
                ;zahl zurück auf Speicherplatz
                movb    [R12],R1L


�brigens, bei Dir müsste eigentlich der Assembler meckern, da Du bei den Speicherzugriffen
kein Segment mittels EXTS angibst !?

MfG André H.
 


Antworten bitte nur ins Forum!
Fragen per EMail auf Forum-Postings werden nicht beantwortet!

Das macht meine Heizung gerade


    Antwort schreiben


Antworten:

Re: "Variablen" in ASM die 2. (von Thomas - 13.08.2004 20:34)
    Re: "Variablen" in ASM die 2. (von André H. - 18.08.2004 17:48)
        Re: "Variablen" in ASM die 2. (von Thomas - 18.08.2004 19:34)
            Re: "Variablen" in ASM die 2. (von André H. - 19.08.2004 8:33)
                Re: "Variablen" in ASM die 2. (von Thomas - 20.08.2004 16:00)
                    Re: "Variablen" in ASM die 2. (von André H. - 20.08.2004 22:14)