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 | ||
| ||
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) |