Kviz - podivna chovani programu pro 8bitove uP
Lukas Grepl
L.Grepl@sh.cvut.cz
Pondělí Leden 8 14:10:37 CET 2007
> Jestli nekdo spravne pozna, jaka bude konecna hodnota promenne "result" a hlavne proc?
Rekl bych, ze to bude predevsim silne zavisle na prekladaci a architekture.
Napriklad bude jiste zasadni rozdil mezi tim, jestli o pobezi na 16
(nebo vice) bitovem CPU, kde se int bude zpracovavat atomicky a nebo na
osmibitovem, kde se 16bitove operace budou rozkladat na osmibitove.
Dale protoze neni u promenne counter ani result klicove slovo volatile,
muze chytry prekladac celou smycku while vyhodit, protoze ze zapisu
jejich definice vyplyva, ze by se mu nemely "nepredpokladane menit pod
rukama".
Jinak konkretne tedy napriklad na 16bitovem procesoru bych rekl, ze
result bude pravdepodobne 10, protoze kdyz pujde poprve counter z -22
dolu, pri -30 se nastavi result na 10, na -10 nikdy nebude a ostatni
podminky se take nesplni.
Na 8bit to na zacatku pujde na 10 stejne jako v predchozim pripade a pak
to nejspis drive ci pozdeji preskoci na result = 100 - drive ci pozdeji
dojde k tomu, ze zpracuje counter jako 0x00ff pri prechodu 0 na -1 nebo
0x00d8 pri prechodu -40 na 0. Ktera z variant nastane zalezi na tom, v
jakem poradi rozlozi 16bit operace na 8bitove.
Nicmene je to cele samozrejme pekna prasarna. V praxi je jednak potreba
rozhodne pouzit volatile (i kdyz se to bez nej muze nahodou prelozit
stejne a fungovat), dale - kdyz to jde - pouzit osmibitovy typ ktery se
i na osmibitovem CPU zpracuje atomicky a/nebo obalit inkriminovana mista
zakazanim preruseni nebo jinak zajistit synchronizaci.
Lukas Grepl
Další informace o konferenci Hw-list