Är i slutfasen av mitt ibuttonprojekt och har ett återstående fel, hag jobbat mig runt det men det blir snyggare kod om jag löser även detta.
varför får jag följande kompileringsfel:
Error[116] E:\HEMSIDA\IBUTTON\IBUTTON.ASM 144 : Address label duplicated or different in second pass (JUMP)
Error[116] E:\HEMSIDA\IBUTTON\IBUTTON.ASM 150 : Address label duplicated or different in second pass (KORT)
Error[116] E:\HEMSIDA\IBUTTON\IBUTTON.ASM 155 : Address label duplicated or different in second pass (STOPP)
om jag anroper följade macro två eller flera gånger i samma kod, alltså skriver den på två ställen ett ställe som jag loopar kring funkar bra.
WAITSHORT MACRO
MOVLW H'FF'
MOVWF LOOP1
MOVWF LOOP2
JUMP
MOVLW H'FF'
MOVWF LOOP1
DECFSZ LOOP2,F
GOTO KORT
GOTO STOPP
KORT
WAIT .1000
DECFSZ LOOP1,F
GOTO JUMP
GOTO KORT
STOPP
ENDM
Litet jobbigt problem...
får det inte att funka fortfarande samma fel
har ändrat till följande:
WAITSHORT MACRO LOCAL JUMP, KORT, STOP
sen anropar jag det så här:
MOVLW H'0F'
MOVWF LOOP3
FELBLINK
BSF GPIO,LED
WAITSHORT LOCAL JUMP, KORT, STOP
BCF GPIO,LED
WAITSHORT LOCAL JUMP, KORT, STOP
DECFSZ LOOP3,F
GOTO FELBLINK
GOTO START
utan local joxet i anropet funkar det ännu sämre.
har ändrat till följande:
WAITSHORT MACRO LOCAL JUMP, KORT, STOP
sen anropar jag det så här:
MOVLW H'0F'
MOVWF LOOP3
FELBLINK
BSF GPIO,LED
WAITSHORT LOCAL JUMP, KORT, STOP
BCF GPIO,LED
WAITSHORT LOCAL JUMP, KORT, STOP
DECFSZ LOOP3,F
GOTO FELBLINK
GOTO START
utan local joxet i anropet funkar det ännu sämre.
-
- Inlägg: 2360
- Blev medlem: 16 september 2003, 17:18:13
- Ort: Dubai, United Arab Emirates
- Kontakt:
Problemet med att använda macron som har en label i sig är att samma label kommer och hamna på flera ställen i koden. Detta eftersom ett macro inte är en subrutin utan snarare en mall eller en förkortning av en sekvens med kod.
Om du har kod som ser ut som:
Så kommer assemblern att försöka assemblera följande kod när macroexpansionen har gjorts.
Och då har man plöstligt tre lablar som heter "foo" i programmet, och det är inte bra.
Genom att med LOCAL-kommandot tala om att "foo" är en lokal label så ser assembler till att lägga på något på "foo" varje gång som macros anropas. Tillexempel lägga på en siffra i slutet på det. På så sätt blir det olika lablar och inga problem uppstår.
Om du har kod som ser ut som:
Kod: Markera allt
Dum MACRO
MOVLW H'AA'
GOTO Foo
Foo
MOVLW H'55'
ENDM
MOVLW H'11'
Dum
Dum
Dum
MOVLW H'22'
Kod: Markera allt
MOVLW H'11'
MOVLW H'AA'
GOTO Foo
Foo
MOVLW H'55'
MOVLW H'AA'
GOTO Foo
Foo
MOVLW H'55'
MOVLW H'AA'
GOTO Foo
Foo
MOVLW H'55'
MOVLW H'22'
Genom att med LOCAL-kommandot tala om att "foo" är en lokal label så ser assembler till att lägga på något på "foo" varje gång som macros anropas. Tillexempel lägga på en siffra i slutet på det. På så sätt blir det olika lablar och inga problem uppstår.
Kod: Markera allt
MOVLW H'11'
MOVLW H'AA'
GOTO Foo1
Foo1
MOVLW H'55'
MOVLW H'AA'
GOTO Foo2
Foo2
MOVLW H'55'
MOVLW H'AA'
GOTO Foo3
Foo3
MOVLW H'55'
MOVLW H'22'