Sollte eigentlich gehen. Das Kompilat sieht bei mir so aus:
Code: Alles auswählen
PsTEST_ss_MYSLEEPsSMALLINT: [color=#0000FF]// Prozedur[/color]
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 [color=#0000FF]// bis hierher Vorgeplänkel, Stackpointer sichern, Statusregister sichern[/color]
std Y+2,r24
std Y+3,r25 [color=#0000FF]// Variable übernehmen[/color]
ldd r2,Y+2
ldd r3,Y+3 [color=#0000FF]// Variable t in Register[/color]
cp r2,r1
cpc r3,r1 [color=#0000FF]// Prüfen auf Null, immer bei for-loop[/color]
brlt .Lj6
ldi r18,-1
ldi r19,-1 [color=#0000FF]// init i mit Null minus 1, Startwert for-loop[/color]
std Y+4,r18
std Y+5,r19 [color=#0000FF]// i zwischenspeichern[/color]
.Lj7:
ldd r19,Y+4
ldd r20,Y+5 [color=#0000FF]// i wieder holen[/color]
ldi r18,1
add r19,r18
adc r20,r1 [color=#0000FF]// i + 1[/color]
std Y+4,r19
std Y+5,r20 [color=#0000FF]// und wieder zwischenspeichern[/color]
# CPU AVR5
nop [color=#0000FF]// das NOP[/color]
# CPU AVR5
ldd r18,Y+4
ldd r19,Y+5 [color=#0000FF]// i wieder rausholen[/color]
cp r18,r2
cpc r19,r3 [color=#0000FF]// und mit t vergleichen[/color]
brlt .Lj7 [color=#0000FF]// wiederholen solange kleiner[/color]
.Lj6:
subi r28,-6 [color=#0000FF]// Stackpointer wiederherstellen[/color]
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 [color=#0000FF]// und fertsch mit Prozedur[/color]
main:
call FPC_INIT_FUNC_TABLE [color=#0000FF]// Vorgeplänkel für den Controller, Stack einrichten und so[/color]
ldi r18,-1
out 4,r18 [color=#0000FF]// DDRB = 255[/color]
.Lj10:
out 5,r1 [color=#0000FF]// PORTB = 0[/color]
mov r24,r1 [color=#0000FF]// lobyte von 256, könnte auch gleich in r25[/color]
ldi r26,1 [color=#0000FF]// hibyte von 256[/color]
mov r25,r26 [color=#0000FF]// muss man nicht verstehen[/color]
call PsTEST_ss_MYSLEEPsSMALLINT [color=#0000FF]// Prozedur aufrufen[/color]
ldi r18,-1
out 5,r18 [color=#0000FF]// PORTB = 255[/color]
mov r24,r1
ldi r26,1
mov r25,r26 [color=#0000FF]// siehe oben[/color]
call PsTEST_ss_MYSLEEPsSMALLINT [color=#0000FF]// Prozedur aufrufen[/color]
rjmp .Lj10 [color=#0000FF]// Endlossschleife[/color]
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.