====== Čtvrtý domácí úkol - analýza kódu ====== Zadání bude studentům předané v papírové podobě. Zadání je též k stažení v PDF formátu na [[http://cmp.felk.cvut.cz/~pisa/apo/du4/|http://cmp.felk.cvut.cz/~pisa/apo/du4/]]. Každý student si vybere zadání podle svého pořadového čísla v sezanmu studentů přihlášených na předmět A0B36APO. Platí seznam na stránkách rozvrhu [[https://www.fel.cvut.cz/cz/education/rozvrhy-ng/public/html/paralelky/P12/58/par12581404.1.html|A0B36APO]] k datu 24. 4. === Materiály k řešení domácí úlohy č. 4 === Příklad řešení o něco složitější úlohy, než jsou úlohy v generovaných zadáních. {{.:homework-4-example.zip|}} Syntaxe i386 assembleru ve variantě AT&T a GNU assembleru/disassembleru [[http://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax|]] Popis několika málo v úlohách použitých systémových volání pro architekturu x86 32-bit verzi naleznete v materiálech k přednášce [[courses:a0b36apo:lectures:09:start|Předávání parametrů funkcím a virtuálním instrukcím operačního systému]] Mapování systémových volání pro architekturu MIPS naleznete na [[http://lxr.linux.no/#linux+v3.8.8/arch/mips/include/uapi/asm/unistd.h|]] nebo přímo repozitory zdrojových kódů jádra Linux v souboru [[https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/mips/include/uapi/asm/unistd.h|arch/mips/include/uapi/asm/unistd.h]] Systémová volání používají pro předání návratové hodnoty (pokud se jedná jen o jednu hodnotu do 64-bitů) na většině architektur stejné registry jako jsou použité pro uložení návratové hodnoty funkcí při běžném volání. Kromě běžné návratové hodnoty je ale ještě potřeba informovat volajícího o důvodu selhání systémového volání. Linuxové jádro i pro tuto informaci využívá návratové hodnoty, která je v takovémto případě "malé záporné číslo". Znamená to tedy, že systémová volání nemohou běžně vracet hodnoty blížící se maximu při uvažování typu bez znaménka. Knihovna C pak při zjištění hodnoty v tomto vyhrazeném rozsahu nastaví proměnnou errno a volajícímu programu vrátí informaci o selhání volání mechanismem, který je pro danou funkci určený standardem POSIX. Seznam chybových kódů je možné zjistit z dokumentace GLIBC nebo zdrojových kódů jádra [[https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/uapi/asm-generic/errno.h]] Přitom v případě návratové hodnoty je systémového volání je chyba vracená jako zápaorné číslo (to je například v případě požadavku s neexistujícím číslem služby -ENOSYS).