kajla>
uputstva na
developer.intel.com/design/PentiumII/manuals/, ima nekih i za optimizaciju i jos ponesto.
predatore> CS moze da se menja sa POP zar ne? naravno i JMP i CALL u FAR varijantama to isto rade.
A sto se tice tog primera koji si dao kajla jednostavno je objasniti. Moraces da se postavis u poziciju onog koji pravi kompajler.
while (uslov) { rad(); } ciklus se implementira u tom kompajleru najverovatnije uvek na isti nacin.
Na primer, prvo cemo staviti label na pocetak (kompajler naravno ne stavlja label posto ide preko adresa :).
Zatim ide testiranje uslova, kakav god on bio: jednostavan kakav si ti naveo, ili mozda ((i>5) && (p || q)). Kada implementiras while ciklus, ti ne zelis da proveravas kakve sve mogucnosti postoje, pa da svaku pojedinacno obradjujes. Jasno je da taj kompajler (tc zar ne) ima losu optimizaciju, i zato to tako radi.
U boljem slucaju bi bilo uradjeno sa AND i JNE, a ne CMP i JNE, posto je ovde bitno samo da li je jednako nuli.
Svaki uslov treba da bude moguce istestirati na samom pocetku, pa pretpostavljam da tc generise ovakav kod.
Code:
MOV AX,i ; ili mu je i vec u registru, ili mozda radi preko memorije
pocetak:
CMP AX,AX ; ovde moze doci obrada bilo kakvog uslova
JNE ciklus ; i u zavisnosti od toga na kraju ukoliko ispunjava neki JMP na ciklus
JMP kraj
ciklus:
call rad ; ili sta god da se radi ovde
kraj:
; nastavak
Mislim da je jasno da se na ovaj nacin moze implementirati bilo koji while ciklus, dok sa loop se retko koji moze (tvoj je jedan primer), pa se nadam da ti to objasnjava zasto je ko god je pravio tc izabrao taj nacin.
I samo da napomenem, vestacki sam se drzao "JNE" iako bi bilo bolje tu ubaciti "JE kraj" ili "JZ kraj", a onda sledeca JMP instrukcija ne bi bila potrebna. Naravno, sve ovo su samo pretpostavke, najverovatnije tc ne generise ovakav kod, ali ovako se dosta jednostavno implementira while(i) ciklus u asembleru (iako ne bas najbolje).
Toliko.
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.