Re: "Variablen" in ASM die 2. Kategorie: Progr. Assembler, TaskingTools, OS (von André H. - 19.08.2004 8:33) | ||
Als Antwort auf Re: "Variablen" in ASM die 2. von Thomas - 18.08.2004 19:34 | ||
| ||
Hallo Thomas, > Und hier sollte jetzt wohl mein Verständnisproblem liegen: Ich denke: > > zahl equ 11111111b > > definiert eine Konstante, die im Code in Segment 3 abgelegt wird und auf die ich mit Nein. "zahl" wird hier nicht in Segment 3 abgelegt. equ hei� hier equal, was hier die bedeutung von "gleichbedeutend" hat. "zahl" ist hier also nur ein Synonym für die Zahl 011111111b. Ob Du nun mov R12,#zahl oder mov R12,#011111111b schreibst, ist exakt dasselbe. Wenn Du Konstante, nicht änderbare Daten in ein Flash-Segment ablegen willst, mu�t Du z.B. db verwenden. > > mov R12,#zahl //Schreibt Speicheradresse in R12 Hier wird die Zahl 0b11111111 in R12 geschrieben, keine Speicheradresse. > exts #3,#1 //??? 3 oder 8 ??? Segment 3 ist das Flash-Segment in dem Du arbeitest, Segment 8 ist der RAM. > movb RL1,[R12] //Schreibt Wert von zahl in RL1 Stimmt so leider auch nicht. Du Schreibst hier den Inhalt von Byte 0b11111111 des Flash-Seg3 in RL1. > shr R1,#1 > > zugreifen kann, um anschlie�end wieder mit > > exts #3,#1 > movb [R12],RL1 //schreibt Wert aus RL1 an Speicheradresse von zahl > Hier versuchst Du auf das Flash-Byte 0b11111111 schreibend zuzugreifen. Aber so kann man nicht auf den Flash zugreifen. > den neuen Wert an die Speicheradresse zu bringen und dann mit > > mov PL1,#zahl > > auf den davor geschrieben Wert zugreifen zu können. Somit sollte die Konstante zahl nun den Wert > 11111110 enthalten, was sie ja aber anscheinend nicht tut, da ja immer noch alle 8 Portausgänge > auf 'ON' gesetzt sind. Mit dem letzten mov PL1, #zahl schreibst Du wieder die zahl 0b11111111 in P1L. Du kannst zahl equ 011111111b mit const zahl=0b11111111; in C2 vergleichen. In C2 werden Integer(&Byte)-Konstanten auch nicht im Konstanten abgeleget, sondern als Immediate-Data direkt bei der verwendeten Position verwendet. Wenn Du wirklich einen Temporären Speicher benötigst, mu� Du den RAM benutzen. Dazu benötigst Du entweder Segment8 (64kB-RAM) oder etwas vom unbenutzen RAM in Segment0. (freie RAM-Bereiche in Seg0 siehe "Buch MSR mit CC2") Ich gehe davon aus, da� Du Deine Routine aus C2 heraus aufrufst und irgendwann wieder zurückspringen willst. Dann darfst Du Segment8 nicht frei verwenden, sondern mu�t z.B. eine Bytearray definieren und als Parameter dem ASM-Aufruf übergeben. Die Startadresse des Arrays kannst Du mit der OS-Pop-Routine dann vom Threadstack holen. Du kannst dann den kompletten Speicherbereich des definierten Arrays in ASM frei nutzen. > Zur EDE: > Ich arbeite nicht direkt mit der EDE, sondern nur mit dem Konsolenassembler, da die EDE unter Linux > nicht richtig läuft. Für den Konsolenassembler habe ich jedoch noch keine Einstellungsmöglichkeiten > gefunden. Das erklärt natürlich einiges. :-) Hast Du in Deinem Linux-System einen Windoofs-Emulator ? Denn mit den Tasking-Tools lässt es sich einfacher programmieren. Auch ist eine nette Hilfe zu ASM dabei. Allerdings frage ich mich, warum Du Deinen Lauflichtwert unbedingt in einen Speicher schreiben willst. Die Register würden schlie�lich auch reichen. Genaugenommen sind die Register R0 bis R15 die Variablen in ASM mit denen man direkt arbeitet. Also würde Dein Programm eigentlich auch so seinen Zweck erfüllen: lauflicht proc far ;alle Ports auf Ausgang setzen extr#1 mov DP1L,#0FFh ;Wert in R1 laden mov R1,#080h mov R2,#8 loop1: ;Ausgabe mov P1L,R1 ;Shift-Rechts shr R1,#1 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 pop R1 ; nötig für Rücksprung in C2-Programm pop R1 rets ;Ruecksprung lauflicht endp 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 - 20.08.2004 16:00) Re: "Variablen" in ASM die 2. (von André H. - 20.08.2004 22:14) |