Assembler (Jazyk symbolických adres)

(10. část)

Úkol

Implementujte ve vkládaném nebo externím Assembleru standardní funkci printf (int printf(const char *format, ...)) omezenou na základní podporou pro typy i (celé číslo se znaménkem), c (znak) a s (řetězec). Funkce bude pro realizaci výpisu využívat pouze standardní funkci putchar pro výpis znaku (int putchar(int c)). Podporovány budou i řídící znaky \n (nový řádek, ASCII hodnota 10), \t (horizontální tabulátor, 9), \\ (obrácené lomítko, 92), \" (uvozovka, 34).

Použijte následující kód v C jako kostru programu a pro ověření funkčnosti a správnosti vaší implementace printf_ics omezené funkce printf.

Poznámky

Funkce printf má obecně neomezený počet parametrů, jejich počet je dán počtem uvedení typu ve formátovacím řetězci (první parametr). Přístup k těmto parametrům je tedy nejlepší realizovat pomocí přičítání k registru EBP. V případě implementace v externím Assembleru uveďte v hlavičce procedury pouze první parametr (formátovací řetězec).

Číslo se znaménkem u typu i je 32-bitové (long z jazyka C), tento typ lze alternativně zadat i písmenem d. Řetězec u typu s je posloupnost znaků zakončená hodnotou 0 (řetězec v pojetí jazyka C) a tyto znaky se vypisují jako takové, tj. řetězec se nijak nevyhodnocuje (např. řídící znaky). Typ se uvádí za znakem % (procento), pro výpis tohoto znaku samotného je potřeba jej uvést ve formátovacím řetězci dvakrát, tj. %%.

Nezapomeňte, že funkce printf vrací číslo udávající, kolik znaků celkem bylo vypsáno (včetně řídících znaků)!

Bonus

Přidejte podporu pro typy X (celé číslo bez znaménka v hexadecimální soustavě s velkými číslicemi A, B, C, D, E a F) a p (hodnota ukazatele, tj. adresa, na kterou ukazatel ukazuje, v hexadecimální soustavě). Číslo bez znaménka u typu X je opět 32-bitové.



Jan Outrata
outrataj@phoenix.inf.upol.cz