[ Jovovic @ 25.06.2005. 14:27 ] @
Imam nekoliko pitanja u vezi asemblera za 286. Interesuje me kako da "dohvatim" registre CS i IP iz prekidne rutine koju sam
definišem, odnosno, koje registre čuva hardver na steku i kojim redosledom?

U svom programu imam proceduru koja se izvršava prilikom prekida:

Code:
void interrupt interruptHandler();


koja se prevodi u asembler na sledeći način:

Code:
@interruptHandler$qv proc far
push ax
push bx
push cx
push dx
push es
push ds
push si
push di
push bp
mov bp,DGROUP
mov ds,bp
mov bp,sp
/////////////////////////////////
// ovde se nalazi telo procedure
/////////////////////////////////
pop bp
pop di
pop si
pop ds
pop es
pop dx
pop cx
pop bx
pop ax
iret
@interruptHandler$qv endp


Pomoću BP mogu da pristupim steku i na taj način pročitam kontekst procesora (ax, bx, ...bp), ali ne znam koliko registara i
koji se sve registri i kojim redom čuvaju na steku pre pozivanja procedure interruptHandler().
[ daxx @ 11.08.2005. 16:30 ] @
Eh, taj projekat... :)
[ Vuk Nikolić @ 12.08.2005. 23:46 ] @
ne bi da se pravim pametan, ali koristi setjmp i longjmp.
ja sam njih koristio za projekat... imam samo 5-6 linija asemblera sve ukupno. (treba jos event da sredim)
[ daxx @ 17.08.2005. 22:42 ] @
Kako si uspeo da nabudzis setjmp i longjmp da cuvaju ax?
I jel treba mi da kompajliramo to za 8086 ili 286??
Pisi bre tamo na nasem forumu, vidis da pojma nemamo :)

OFF: Sta je sa daskom covece!?
[ daxx @ 17.08.2005. 22:48 ] @
Eh da, da odgovorim kolegi na prvo pitanje.
Pre poziva interrupt funkcije na stek se stavlja PSW. Pri samom pozivu dolaze jos CS i IP (jer je procedura far), a onda naravno krece to sto si napisao, dakle pushovanje registara i telo funkcije. Pri povratku se popuju registri, kao sto znas, a IRET skine IS, CP i flegove i upise ih gde treba.

I ne zaboravi da u svakoj datoteci iz koje pozivas interrupt funkciju, deklarises tu funkciju kao interrupt, da bi prevodilac znao da treba da gurne flegove pre poziva. Ja sam zbog toga imao grdnih problema.