Díky za další zajímavý článek.
Osobně musím říct, že co jsem přišel do styku s různými CPU, tak nejlepší mi přišel assembler MC68000 (Amiga). Jen mi tehdy trošku přišlo škoda, že je bigendian.
Možná by neškodilo napsal samostatný článek věnovaný problému endianity. Jak se to seběhlo :-), kdy se která hodí atd.
Zajímavý. Mně se právě big endian líbil. Přišel mi logičtější. Vono načíst ze souboru řetězec "JFIF" a muset ho porovnávat na "FIFJ" mi přijde strašlivý. Jediná výhoda little endianu je snad, pokud bych sčítal po bajtech dvou nebo čtyřbajtový čísla, ale jenom u procesoru, kterej neumí indexovat. Nevím nevím, faktický vítězství little endianu považuju za strašlivou tragédii pro lidstvo a zpomalení vývoje vo desítky let :-)
Proč je x86 little endian jsem někde četl. Zdědila to po 8080, ta po 8008 a ta po Datapointu 2200, kterýho první verze neměla RAM, ale posuvnej registr a tudíž sčítání delších čísel za pomocí dekrementace by zabralo neúměrně moc času, protože se musel posuvnej registr protočit skoro celej dokola.
6502 to podle mě vzala taky vod 8080, ARM to vzal vod 6502.
Jojo. Tady to je: http://silicongenesis.stanford.edu/transcripts/mazor.htm
Přímo odstavec, kde Stan Mazor říká, že little endian byl omyl :-)
SM: Well, one that's kind of interesting is this Little Indian, Big Indian thing. It's turned out that when I was at Intel, I defined the 8008 instruction set and the 8008 addressing modes and I did it in a strange way which we ended up calling Little Indian, which means the low address comes first. And I did that because the DataPoint machine was bit serial and I was trying to do something compatible for them, although I knew it was backwards at the time. Well, as it turned out, they never used any so that by making the Little Indian first was kind of a mistake. And the Intel 8080 and 8086 also were then Little Indian. So we have something in the industry where the Intel way has been more or less the wrong way and we did it for the wrong reason. And that's one of the…
RW: And you're responsible.
SM: And I'm the guy that did it and it was my mistake.
RW: They didn't give you an award for that.
Tezko rict, kde zrovna 6502 zdedila pouzivani little endian, protoze ji vyvijeli ex-pracovnici z Motoroly.
Jinak snad jedina dobra vec na little-endian je ta, ze pokud mam ukazatel (nebo v assembleru adresu), tak se trosku jednoduseji delaji typove konverze (nebo spis se chyba dlouho skryva nez cislo pretece ;-)
Aby bylo hur, tak nektere architektury to maji pomichane, takze 4bajtova slova jsou ukladany napriklad formou 2 wordy podle big endian, ale kazdy word jsou dva bajty v orderingu little endian (nebo presne naopak). Par procesoru to dokaze prepinat, ale dneska bych to fakt moc neresil, soucasny architektury maji vic problemu nez prohazovani bajtu :-)
Me zas prijde logictejsi little endian. Ale az na druhy pohled, kdyz si uvedomim jak jsme vlastne prisli k pozicni cislene soustave. Ti ucenci, kteri ji ve stredoveku privezli z arabie ji okopirovali doslova, tedy i se smerem zapisu, ignorujic ze puvodni uzivatele psali z naseho pohledu pozpatku.
Pro ne tedy bude little-endian prirozeny zpusob. Je to docela pochopitelne kdyz uvazime hypotezu ze pozicni soustava vznikla zaroven s algoritmem scitani (jako `datova struktura' pro jeho efektivni implementaci). Bezne scitani (bez zrychleneho prenosu) postupuje od nizsich radu a je tedy prirozene, ze ten kdo toto vymyslel, to zacal zapisovat v poradi ve kterem normalne psal.
6502 byla little-endian zamerne, protoze ji to umoznilo byt rychlejsi nez 6800 pri indexovych adresovych rezimech. Zatimco se nacital vyssi byte offsetu, nizsi uz byl v CPU a mohl se k nemu pricitat obsah 8bit indexoveho registru. Usetril se tim 1 takt.
Jak uz jste psal, ma little endian vyhodu pri implementaci aritmetiky dlouhych cisel. Taky v pripade pouziti pointeru nekdy byva prijemne (i kdyz neportabilni), ze nejnizsi cislice je na stale stejne adrese at uz ten pouinter ma typ i16* nebo i32*.
Jedina nevyhoda je, pokud si debuggerem binarne prohlizite obsah pameti -- v tom pripade ale postaci vzit se do uvazovani typickeho gramotneho araba a mate vyhrano. V tom pripade tez doporucuji kreslit si bity ve slove (napr. v I/O registrech periferie) od nejnizsiho po nejvyssi z leva do prava a mate to logicke jak jste chtel ;)
No názory na to jsou různý :-)
No, asi to Arabovi může připadat přirozený... O ukazatelích __int16* vs __int32* si spíš myslím, že to může zakrývat chybu v programu, na kterou se přijde až pozdě. Výhoda při aritmetice dlouhých čísel je pouze u starých procesorů, které neumějí indexovat (tak někde na úrovni i8080). Jinak mám v jednom registru začátek čísla a ve druhém index, pomocí kterého ho pozpátku procházím. Prostě ten evropskej způsob myšlení je ve mě až příliš zakořeněnej a na první pozici očekávám vyšší (důležitější) řády. Flamů na tohle téma asi byly tisíce a tisíce :-)
To neni tim. CPU cte z cache data po celych slovech, nebo dnes uz spise jejich nasobcich, takze ten trik, ktery pouzivala 6502 by byl k nicemu.
Je to tim jak se spekulativne doplnuje cache. Novejsi procesory myslim uz maji prediktor takze poznaji kterym smerem program jde. Uplne jistej si ale nejsem, meril jsem to tenkrat jen na ty K6ce a ta predpokladala jen vzestupne jdouci adresy (coz je prece jen beznejsi a troufnu si tvrdit ze i na big-endianech (napr. kdyz se zpracovava retezec)).
Mimochodem ještě bych opravil názor ohledně arabských číslic. Ty byly převzaty (okopírovány doslova) z indických číslic a indové psali zleva doprava, takže napřed ty vyšší, důležité řády. Evropani to pak další převzetím "doslova" pouze zpět obrátili k původnímu pořadí. Mimochodem staré evropské zápisy (latinské, řecké) mají taky napřed ty vyšší řády, čínské taky, egyptské taky. A to hlavně z důvodu toho, že v řeči taky říkáme prvně tisíce, stovky, desítky a pak až jednotky. Akorát němci si v nějakým deliriu přehodili jednotky a desítky, ale zbytek taky říkají dobře. Takže přirozenost je prvně koukat na vyšší řády.
68000 neni spatna, ale ja za nejpeknejsi assembler (vhodny pro vyuku) povazuju instrukcni sadu ARMu, pripadne jeste MIPS. 68000 obsahuje spoustu zbytecnych instrukci a navic to podivne rozdeleni registru na adresove a datove, coz pri prvnim setkani s assemblerem zbytecne odvadi pozornost nepatricnym smerem. I tak je ale 68000 daleko lepsi nez x86.
Mate pravdu, x86 je takovej kockopes. Je tam videt, ze se vychazelo z instrukcni sady zalozene na jedinem akumulatoru (na 8080/8085 A, pozdeji AX, jeste pozdeji EAX) a nekdo si myslel, ze je dobry napad, aby urcite typy instrukci pracovaly jen s urcitymi registry (indexove SI DI, bazove BP BX, akumulator AX, pocitadlo CX), jenze to v dusledku vedlo k tomu, ze snad 25% instrukci v programech byly MOVy :-)
(mno radeji ani nebudu zminovat segmentove adresovani se sestnactibitovymi offsety)