Proč je tento kód je generován avr-gcc a jak to funguje?

hlasů
4

To je úryvek z rozebraném AVR kódu z C projektu jsem pracoval. Všiml jsem si tuto podivnou kód je generován, a nemohu pochopit, jak to funguje. Jsem za předpokladu, že je to jakýsi směšný optimalizace ...

Co je to vysvětlení?

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

Konkrétně, proč druhá instrukce odečíst 0xFF z R25, ne jen INC R25?

Položena 26/08/2009 v 23:13
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
4

Instrukce SUBI lze přidat / odečíst jakýkoli 8 bitů konstantní z / na 8 bitovou hodnotou. To má stejnou cenu jako INC, tj velikosti instrukce a spuštění času. Takže SUBI je přednostní kompilátor, protože to je obecnější. Neexistuje žádná odpovídající instrukce ADDI, pravděpodobně proto, že by byl nadbytečný.

Odpovězeno 27/08/2009 v 06:53
zdroj uživatelem

hlasů
3

tl, dr kompilátor byl navržen tak, aby použít více přenosný, efektivnější a obecné řešení zde.

Tyto SUBIinstrukční sady C(carry) a H(half-carry) CPU vlajky pro použití s následnými pokyny (není ADDIv 8-bit AVR BTW, takže přidat okamžitou hodnotu z xodečteme -xod ní), zatímco INCnení. Vzhledem k tomu, jak SUBIsi INCmají 2 bajty délky a provést během 1 hodinového cyklu, ztratíte nic pomocí SUBI- OTOH, pokud použijete 8-bitové velikosti pult, pak můžete snadno zjistit, zda to převrátil (o BRCC/ BRCS), a pokud byste mít 16 nebo 32-bit-velké počítadlo, to vám umožní ji zvýšit velmi jednoduchým způsobem - jen s INC, 0x00FFby si zvýšil na 0x0000, takže budete muset zkontrolovat, zda je nejnižší bajt je 0xFFpřed INCing , OTOH, s SUBIkterou jste právě SUBI -1nejnižšího bytu, a pak se ADC 0v těchto bytech, zajišťující všechny potenciální carry bity byl zaúčtován.

Další čtení:

https://lists.gnu.org/archive/html/avr-gcc-list/2008-11/msg00029.html

http://avr-gcc-list.nongnu.narkive.com/SMMzdBkW/foo-subi-vs-inc

Odpovězeno 26/08/2009 v 23:27
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more