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... :)
green day @ 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.