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