PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Macro gefolgt von Macro - Ratsam ?



pickelrobert
22.05.2006, 23:43
Hallo,

habe 2 Macros:

UeberspringeWennGerade MACRO Register
BTFSC Register,0
ENDM

und

IrgendeinMakro MACRO Register, Wert, Ziel
NOP
NOP
GOTO Ziel
ENDM

Jetzt mache ich Folgendes:

...
Gerade Reg1
IrgendeinMakro Reg1,H'1',Irgendwohin
GOTO BlaBla
...

Wie wird das vom Assembler behandelt ? Werden alle Anweisungen aus dem 2 Makro übersprungen, wenn Reg1=0 ?

the_Ghost666
31.05.2006, 15:40
probier das doch mit der Simulation von MPLAB aus. also ich würde nein sagen. Der Präprozessor tauscht zuerst alle Makros gegen den Code aus und danach kümmert sich erst der Compiler um den Code. Dh du bekommst nur einen Befehl übersprungen, hier dein erstes NOP des zweiten Makro.

Und MPLAB Sim ist ne feine sache, man muss sich einmal kurz einarbeiten, und je nach frequenz eine grundeinstellung ändern und ab gehts, wie bei einem guten PC-Compiler(zb Visual C++)... ich benutzt das ding immer, und kenn nichtmal 50% seiner funktionen.

kalledom
31.05.2006, 15:47
Hallo pickelrobert,
es wird immer nur der unmittelbar folgende Befehl 'übersprungen'; es heißt ja nicht goto, sondern skip. Wenn in einem darauf folgenden Macro mehrere Befehle stehen, wird nur der erste Befehl übersprungen. Das wird in den meisten Fällen 'schief' laufen.
In MPLAB werden die einzelnen Befehle eines Macros leider nicht angezeigt, zumindest habe ich dafür noch keinen Konfig-Schalter gefunden.

pickelrobert
01.06.2006, 13:39
Danke. Habe ein wenig herumprobiert und genau das festgestellt. Arrgghh.

Mobius
02.06.2006, 17:30
naja, aber ist leicht zu übergehen. Man muss nur ein wenig "verdreht denken :D



btfss register,0
goto Next_Jump

... alle befehle, die ausgeführt werden, wenn register,0 gesetzt war ...

Next_Jump:


Also, naja, da ich leider kein Pseudo-Code (gibt es den sowas, ne standartisierung für Pseudo-Codes?) beherrsche, kann ich dir das leider net aufschreiben. Aber halt, wenn das Bit gesetzt ist, so wird das goto übersprungen und die anschließenden Kommandos werden ausgeführt. Ansonsten wird das goto ausgeführt und alle Befehle übersprungen. (diese Art von Sprüngen ist extremst hilfreich, bei der Abarbeitung von Interrupts ^_^).

Naja, Macros kann man nur anschauen, indem man das Dissasembly-Fenster öffnet (aber leider funzt der Debuger dort drin nicht).
MfG
Mobius

the_Ghost666
03.06.2006, 11:08
Dann kannst du das aber nur machen, wenn du das makro nur einmal brauchst, wenn du es nochmal einsetzen willst, musst du ja das sprungziel ändern und damit wird ein Makro sinngemäß hinfällig