Ako pracuje počítač

Úloha

Preložte nasledovný program v jazyku C do strojových inštrukcií procesora AVR a simulujte jeho vykonávanie
main (){ char suma = 0; for (char i=1; i<=10; i++){ suma += i; // suma = suma +i; } while(1); }

Teoretický rozbor

CPU je vec ktorá sa vo všeobecnosti nazýva konečný automat. Je vcelku jedno ako technológoiu je realizovaný. Pamätáte ešte generácie počítačov a ich stavebné prvky? Aktuálne budeme teda predpokladať že CPU je tvorený z logických hradiel, ktorých je vďaka obrovskému stupňu integrácie k dispozícii obrovské množstvá. Nie je teda žiadny problém vhodne poprepájať milióny, či miliardy logických hradiel do potrebných funkčných celkov.

Túto prácu za nás vykoná nejaký výrobca CPU. V našom prípade to bola pôvodne firma ATMEL, ktorá ale bola nedávno pohltená firmou Microchip. Kazdý takýto CPU je obdarený tzv. inštrukčnou sadou. Je to množina všetkých inštrukcií ktoré daný CPU vie vykonať. Obecne sú inštrukcie sa delia na nasledovné skupiny

  1. inštrukcie presunu dát
  2. aritmeticko logické inštrukcie
  3. inštrukcie riadenia toku programu
  4. riadiace inštrukcie
Inštrukcie nájdete popísané v prehľadnej tabuľke v katalógovom liste príslušného procesora. Úplne presne a detalne sú inštrukcie popísané v tomto dokumete a sú platné pre celú rodinu osembitových procesorov AVR.

Program v zadaní je napísaný vo vyššom proramovacom jazyku ktorý sa volá C. Je to jeden z najstarších dnes používaných programovacích jazykov. Principálne je to však jedno. ak sa aspoň trochu zoznamámime s inštrukciami ktoré je CPU schopné vykonávať vidíme že je to hodne ďaleko od toho čo je zapísané vo vyššom programovacom jazyku. Je preto potrebné previesť program vo vyššom programovacom jazyku do série jednotlivých strojových inštrukcií ktoré CPU vie vykonať. Tento prevod sa nazýva preklad/kompilácia Je to automatizovaný proces a vykonáva ho specálne na to vyvinutý program označovaný ako prekladač/kompilátor. Každý jazyk má svoj vlastný prekladač.

V začiatkoch počítačov keď prekladače neexistovali tak sa do pamäte vkladali priamo kódy inštrukcií. Rýchlo sa ale ukázalo že tento spôsob je veľmi náročný na vedomosti a pozornosť. Je veľmi pracný a zdĺhavy nakoľko pri každej aj malej zmene programu je potrebné prepisovať veľké kusy pamäte. Pre uľahčenie tejto otrockej práce sa preto vyvinul jazyk označovaný ako assembler V tomto jazyku miesto číselných kódov reprezentujúcich jednotlivé inštrukcie zapisujeme ich symbolické mená a k nim uvádzame aj príslušné parametre. Každá inštrukcia má zodpojedajúci symbolický zápis, ktorý čo najviac vystihuje jej činnosť.

Ďalšiu vec ktorú program napísaný v assembleri môže obsahovať sú symbolické mená pre premenné a pre návestia v programe. Návestie je symbolické meno adresy inštrukcie na ktorú sa potrebujeme odvolávať. Táto vlastnosť potom umožňuje jednoducho pridávať alebo odoberať inštrukcie. Po každej zmene programu sa vykoná kompilácia ktorá prevedie symbolické mená inštrukcií na ich binárne hodnoty a tiež sa vyhodnotia adresy podľa symbolických návestí.

V zadaní úlohy si máte vyskúšať obe činnosti. Jednak máte program v jazyku C preložiť do strojových inštrukcií procesora - teda vlastne vytvoriť program v assembleri ktorý bude funkčným ekvivalentom programu zapísaným v jazyku C.
Potom máte tento program previesť na binárny tvar pomocou online simulátora AVR procesora. Obe veci sa budú robiť sa s asistenciou vyučujúceho.

Postup

  1. Otvorte si simulátor na adrese
  2. Spolu s vyučujúcim si prejdite úvodnú prechádzku simulátorom a zoznámte sa s ovládaním a s blokmi MCU
  3. Program v jazyku C po preklade do strojových inštrukcií by mohol vyzerať napríklad takto
    LDI r16, 0 ;načítanie 8 bitovej konštanty do registra R16 LDI r17, 1 ;načítanie 8 bitovej konštanty do registra R17 loop: CPI r17, 11 ;porovnanie hodnoty v registri s hodnotou 11 (10+1) ;zmena hodnoty testu je preto lebo neexistuje inštrukcia menší rovný BRSH koniec ;skok na adresu koniec ak je hodnota rovnaká alebo väčšia (SH - Same or Higger) ;tu začína telo cyklu ADD r16, r17 ;pripočítaj k registru R16 hodnotu R17 INC r17 ;zvýš obsah registra R17 o jednotku JMP loop ;pokračuj (skoč JUMP) na adresu loop ;tu končí telo cyklu koniec: ;tu je koniec programu vytvorený nekonečnou slučkou JMP koniec ;ktorá zabezpečí aby CPU nepokračovalo ďalšími inštrukciami ktoré sú v pamäti
  4. Podľa pokynov vyučujúceho uložte jednotlivé inštrukcie do pamäte programu
  5. Nastavte si počítadlo inštrukcií na adresu 0 a spolu s vyučujúcim si odsimulujte činnosť celého programu
  6. Záver

    Po skončení tohoto cvičenia by ste mali mať aspoň rámcovú predstavu ako pracuje akýkoľvek počítač. Ďalej by ste mali mať predstavu o tom čo je to kompilácia z vyššieho programovacieho jazyka do strojového kódu.

    Otázky

    1. Ako sa bude spracovanie lýšiť ak program bude bežať na počítači na ktorom sedíte a nie na doske arduína
    2. Ako sa bude spracovanie lýšiť ak program bude bežať na mobilnom telefóne alebo na smart TV.
    3. Kde sa nachádza premenná suma i
    4. Skúste vymyslieť ako skrátiť celkové vykonanie uvedeného programu o 10 inštrukcií