ON VALUE/de
Contents |
Funktion
Verzweigung zu einem von mehreren angegebenen Labels in Abhängigkeit des Wertes einer Variablen.
Syntax
ON var [GOTO] [GOSUB] label1 [, label2 ] [,CHECK]
Anmerkungen
var |
Die zu prüfende numerische Variable. Kann auch ein SFR wie zum Beispiel PORTB sein. |
label1, label2 |
Label (Sprungmarken) zu denen je nach Wert der Variablen gesprungen werden soll. |
CHECK |
Optionale Prüfung der Anzahl der Sprungmarken. |
Die Verzweigung erfolg nullbasiert. Wenn der Wert also Null ist dann wird zur ersten angegebenen Sprungmarke verzweigt.
Es ist wichtig, dass es zu jedem möglichen Wert eine zugehörige Sprungmarke gibt.
Wenn nicht genügend Sprungmarken vorhanden sind dann läuft der Stack über. Beispiel:
ON value label1, label2
Wenn value = 2 dann gibt es keine zugehörige Sprungmarke.
Wenn man den optionalen CHECK Parameter benutzt dann wird geprüft ob genügend viele Sprungmarken vorhanden sind und wenn das nicht der Fall ist dann wird kein GOTO oder GOSUB ausgeführt sondern die nächste Zeile wird ausgeführt.
Siehe auch
Assembler
The following code will be generated for a non-MEGA micro with ON value GOTO.
Ldi R26,$60 ; load address of variable
Ldi R27,$00 ; load constant in register
Ld R24,X
Clr R25
Ldi R30, Low(ON_1_ * 1) ; load Z with address of the label
Ldi R31, High(ON_1_ * 1)
Add zl,r24 ; add value to Z
Adc zh,r25
Ijmp ; jump to address stored in Z
ON_1_:
Rjmp lbl1 ; jump table
Rjmp lbl2
Rjmp lbl3
The following code will be generated for a non-MEGA micro with ON value GOSUB.
;##### On X Gosub L1 , L2
Ldi R30,Low(ON_1_EXIT * 1)
Ldi R31,High(ON_1_EXIT * 1)
Push R30 ;push return address
Push R31
Ldi R30,Low(ON_1_ * 1) ;load table address
Ldi R31,High(ON_1_ * 1)
Ldi R26,$60
Ld R24,X
Clr R25
Add zl,r24 ; add to address of jump table
Adc zh,r25
Ijmp ; jump !!!
ON_1_:
Rjmp L1
Rjmp L2
ON_1_EXIT:
As you can see a jump is used to call the routine. Therefore the return address is first saved on the stack.
Beispiel
'----------------------------------------------------------------------------------------- 'name : ongosub.bas 'copyright : (c) 1995-2005, MCS Electronics 'purpose : demo : ON .. GOSUB/GOTO 'micro : Mega48 'suited for demo : yes 'commercial addon needed : no '----------------------------------------------------------------------------------------- $regfile = "m48def.dat" ' Mikrocontroller $crystal = 4000000 ' Taktfrequenz $baud = 19200 ' Baudrate $hwstack = 32 ' default use 32 for the hardware stack $swstack = 10 ' default use 10 for the SW stack $framesize = 40 ' default use 40 for the frame space Dim A As Byte Input "Enter value 0-2 " , A 'Nach Eingabe fragen Rem Zu beachten: Der Startwert beginnt mit Null On A Gosub L0 , L1 , L2 Print "Zurück aus GOSUB" If Portb < 2 Then 'Man kann auch den Port-Wert benutzen On Portb Goto G0 , G1 End If End_prog: End L0: Print "0 eingegeben" Return L1: Print "1 eingegeben" Return L2: Print "2 eingegeben" Return G0: Print "P1 = 0" Goto End_prog G1: Print "P1 = 1" Goto End_prog
Languages | English • Deutsch |
---|