Sollte eigentlich gehen. Das Kompilat sieht bei mir so aus:
Code: Alles auswählen
PsTEST_ss_MYSLEEPsSMALLINT: // Prozedur
push r29
push r28
push r3
push r2
in r28,61
in r29,62
subi r28,6
sbci r29,0
in r0,63
cli
out 62,r29
out 63,r0
out 61,r28 // bis hierher Vorgeplänkel, Stackpointer sichern, Statusregister sichern
std Y+2,r24
std Y+3,r25 // Variable übernehmen
ldd r2,Y+2
ldd r3,Y+3 // Variable t in Register
cp r2,r1
cpc r3,r1 // Prüfen auf Null, immer bei for-loop
brlt .Lj6
ldi r18,-1
ldi r19,-1 // init i mit Null minus 1, Startwert for-loop
std Y+4,r18
std Y+5,r19 // i zwischenspeichern
.Lj7:
ldd r19,Y+4
ldd r20,Y+5 // i wieder holen
ldi r18,1
add r19,r18
adc r20,r1 // i + 1
std Y+4,r19
std Y+5,r20 // und wieder zwischenspeichern
# CPU AVR5
nop // das NOP
# CPU AVR5
ldd r18,Y+4
ldd r19,Y+5 // i wieder rausholen
cp r18,r2
cpc r19,r3 // und mit t vergleichen
brlt .Lj7 // wiederholen solange kleiner
.Lj6:
subi r28,-6 // Stackpointer wiederherstellen
sbci r29,-1
in r0,63
cli
out 62,r29
out 63,r0
out 61,r28
pop r2
pop r3
pop r28
pop r29
ret // und fertsch mit Prozedur
main:
call FPC_INIT_FUNC_TABLE // Vorgeplänkel für den Controller, Stack einrichten und so
ldi r18,-1
out 4,r18 // DDRB = 255
.Lj10:
out 5,r1 // PORTB = 0
mov r24,r1 // lobyte von 256, könnte auch gleich in r25
ldi r26,1 // hibyte von 256
mov r25,r26 // muss man nicht verstehen
call PsTEST_ss_MYSLEEPsSMALLINT // Prozedur aufrufen
ldi r18,-1
out 5,r18 // PORTB = 255
mov r24,r1
ldi r26,1
mov r25,r26 // siehe oben
call PsTEST_ss_MYSLEEPsSMALLINT // Prozedur aufrufen
rjmp .Lj10 // Endlossschleife
Wie man sieht, ist die for-Schleife hier reichlich ineffizient. Das liegt aber am Inline-Assembler. Da speichert der Compiler lieber zwischen, weil er nicht weiss, was an Registern geändert wird.
In r1 steht immer NULL, das wird bei vielen Berechnungen oder Vergleichen für schnellen Zugriff benutzt.