Díky za článek!
Jako člověka, který začal programovat až po roce 2010 a low level programování jsem moc času nevěnoval, by mě zajímalo další info o ne úplně běžně používaných instrukcích jako IN, OUT, HLT.
Věděl by někdo o webu, kam by mě odkázal? Případně chystá se další článek, věnující se těmto instrukcím?
Díky.
Díky. Budeme se tomu věnovat příště, tedy konkrétně instrukcím IN, OUT a jejich "blokovým" variantám (to je taky specialitka 8086).
HLT se používalo společně s mat. koprocesorem a popravdě si to musím hodně nastudovat, protože 8087 se právě v tom "čekání" odlišoval (tedy kde a na jak dlouho vkládat HLT a kde právě ne - je to trošku černá magie)
FWAIT jsme resili oftopic ve vlaknu pro ZX Spectrum a Z80.
https://www.root.cz/clanky/vyvoj-pro-zx-spectrum-dokonceni-realizace-prikazu-plot/nazory/
Nakonec jsme dosli k zaveru ze u 8087 s 8086 se musi delat FWAIT za/pred? (uz zas nevim...) KAZDOU instrukci... a ZAROVEN se to NIKAM nepise, protoze to za tebe dela prekladac!
Proto v dobove literature to bude popsano ruzne (protichudne) a ani studium vzorovych asm nepomaha, dokud se clovek nezacne divat primo na strojak... kde najednou vsude bude videt 9B.
Je to hodne prekvapiva vec, ze kdyz pises neco v asembleru tak to neni ta nejnizsi vrstva a linker ti tam bude klidne cpat jeste dalsi instrukce podle toho co das za cilovou architekturu.
Ale asi to byla snad jedina vyjmecna vec tohoto druhu, ktera resila vadny design toho hw. Kdo vi?
Od 286 to uz bylo zase vsechno jinak.
jj presne a ja jsem od te debaty nasel jeste dalsi popisy:
https://roboticelectronics.in/8087-interfacing-with-8086/
a https://www.ques10.com/p/10902/explain-interfacing-of-8087-co-processor-with-80-1/
(jinak NASM se snazi byt kompatibilni s MASMem, a to i v reseni wait/nowait instrukci, coz me osobne mate)
bude to v clancich?
14. 9. 2024, 09:16 editováno autorem komentáře
to nevim jak je mysleno, v NASMu explicitne zapisujes typ instrukce, takze treba FINIT nebo FNINIT:
BITS 16 ; 16bitovy vystup pro DOS
CPU 8086 ; specifikace pouziteho instrukcniho souboru
org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
start:
finit
fninit
se prelozi jako:
7 00000000 9BDBE3 finit
8 00000003 DBE3 fninit
A FWAIT se muze zapisovat primo jako instrukce (ne jako prefix - to je pravda matouci).
14. 9. 2024, 09:41 editováno autorem komentáře
Koprocesor pracoval asynchronně k CPU.
FWAIT "za" by zbytečně vynucoval plnou serializaci instrukcí, FWAIT "před" umožňoval maximální paralelizaci FPU s CPU.
Většina instrukcí měla WAIT implicitní, u pár výjimek byla volba.
Dalším efektem WAITu bylo vynucení volání handlerů FP výjimek (když byly povoleny), v tomto místě byla zaručena přerušitelnost + pokračovatelnost, předchozí FP instrukce byly již dokončeny a další ještě nezahájeny.
Koprocesor škudlil čekající výjimky ve stavovém registru a bez WAITu byly doručeny až na další FP instrukci.
FWAIT na 387 byl potřeba jen když koprocesor zapisoval výsledek/status do paměti odkud si jej vyzvedával CPU jinou než FPU instrukcí.