... rozdíl oproti typickým mikroprocesorům s architekturou CISC, u nichž je délka instrukcí proměnná a mnohdy může přesahovat hranici slov (což ve svém důsledku vedlo k nutnosti vytvoření takzvané „fronty instrukcí“, jejíž vlastnosti se mj. využívaly či spíše zneužívaly při tvorbě virů, které nešlo odhalit debuggerem).
Byl by nějaký odkaz na relevantní informace? Ta fronta je snad implementována na úrovni HW a nedá se softwarově ovládat... nebo jsem mimo?
Pokusim se to trosku vysvetlit: Intelacke cipy snad od 286 maji frontu instrukci, kterou opravdu nejde softwarove ovladat, jak sam pisete. Problem byl ten, ze se program mohl chovat jinak v pripade, kdy byl spusten primo (instrukce sly do fronty) nez kdyz byl krokovan v debuggeru.
Prikladem muze byt samoomodifikujici se kod, ktery zmeni bajt=instrukcni kod nachazejici se IHNED za provadenou instrukci, neco na zpusob:
mov CS:[IP+4], kod_instrukce
V disassembleru je to samozrejme videt, stejne tak lze tuto instrukci krokovat v debuggeru: v tomto pripade se skutecne kod ZA instrukci zmeni jak je patrne z dissasemblovaneho vypisu a vir/ochrana hry/atd. pozna, ze je prohlizena v debuggeru a muze na to zareagovat, idealne zavest ladeni do -/dev/null :-)
Ovsem jak jsem psal, na nekterych cipech se instrukce umistene ve fronte uz nemohly menit, takze figl byl ten, ze ten automodifikujici se kod proste tu druhou instrukci nezmenil (resp. zmenil kod v RAM a nikoli ve fronte) a cely program se tak mohl chovat uplne jinak - provest skok, nastavit nejaky priznak atd. atd.
Jinak vznik fronty instrukcí u 8086 nebo 8088 je asi dán snahou urychlit zpracování programu. Nejkratší instrukce (nějakej MOV) trvá 2 takty, ale čtecí cyklus z paměti 4 takty. Takže se procesor pokoušel přednačíst pár bajtů dopředu, pokud prováděcí jednotka dělala nějakou delší instrukci.
Nejsem si uz jisty, ale neni nejkratsi nejake DAA, INC nebo neco podobneho, co pracuje s jednim registrem, idealne s AL nebo AX? I kdyz popravde receno jsem pro x86 psal assembler tak pred deseti lety a byl to dost humus, v porovnani napriklad s cistym assemblerem 68000, ktery se spis podobal cecku :-)
Tak jsem se podíval, jsou to MOV reg, reg, prefixy, blbosti typu SALC, CLI, STI, HLT, CMC apod. U těch MOVů to byl prefetch ještě důležitější, protože byly dvoubajtový. Tudíž 8086 je načetla minimálně za 4 takty, 8088 minimálně za 8 taktů.
Jinak to, že Intel sál a Motorola pravítkovala bylo jasný každýmu soudnýmu člověkovi :-)