Uložení registrů do stacku

Ahoj, to ti napsat můžu, ale předem upozorňuji, že je to hodně “pseudo-multitasking”.

Vycházím z toho, že mám flešku a ramku rozdělenou na dvě části. Jedné říkám “BIOS” a druhé “APLIKACE”. V první části běží funkce, které obsluhují vstupy/výstupy, komunikaci, filesystém, ADC, přerušení atd… V druhé části běží užívatelský program. V tomto programu se provádí výpočty, beží regulace, řeší se interakce s uživatelem a logujou data na SD kartu.

Důvodem rozdělení programů na tyto dvě části je požadavek na upgrade aplikace z SD karty. Funkce biosu se totiž mění s časem jen velmi pomalu (je z 90% dána hardwarem) zatímco aplikace se stále vyvíjí nebo se opravují chyby. Není proto důvod přehrávat celou flešku, ale jen to co se může změnit. Toto mi také řeší to, že pokud se při přehrávání stane nějaký problém, tak se zařízení nestane černou krabičkou.

Celým tímto punkovým projektem jsem si ale parádně nadělal do kalhot, protože mi chybí ještě velmi mnoho znalostí.
Např. nechápu proč po napsání:

asm("push {r0-r12}");

dojde k takovémuto překladu:

stmdb sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip}

nebo:

asm("pop {r0-r12}");

dojde k takovémuto překladu:

ldmia.w	sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip}

Doteď jsem totiž žil v přesvědčení, že to co napíšu jazykem assembler je svaté. No snad to ještě doženu…říkaj že to je jen o těch prvních deseti letech.