Dies ist ein Ausschnitt des disassemblierten AVR-Codes von einem C-Projekt, an dem ich gerade arbeite. Ich habe bemerkt, dass dieser seltsame Code erzeugt wurde, und ich kann nicht verstehen, wie er funktioniert. Ich nehme an, es ist eine Art lächerliche Optimierung ...Warum wird dieser Code von avr-gcc erzeugt und wie funktioniert es?
Was ist die Erklärung?
92: ticks++; // unsigned char ticks;
+0000009F: 91900104 LDS R25,0x0104 Load direct from data space
+000000A1: 5F9F SUBI R25,0xFF Subtract immediate
+000000A2: 93900104 STS 0x0104,R25 Store direct to data space
95: if (ticks == 0) {
+000000A4: 2399 TST R25 Test for Zero or Minus
+000000A5: F009 BREQ PC+0x02 Branch if equal
+000000A6: C067 RJMP PC+0x0068 Relative jump
Insbesondere warum hat der zweite Befehl subtrahieren 0xFF von R25 statt nur INC R25
?
Falls es nicht offensichtlich ist, beziehe ich mich auf die zweite Zeile: Subtrahiere 0xFF von R25 ... warum nicht einfach "INC R25"? –
Welcher C-Datentyp ist Ticks? – Inshallah
unsigned char (8 bits) –