Mail Archives: djgpp/1995/07/22/05:11:18
Xref: | news-dnh.mv.net comp.os.msdos.djgpp:1070
|
Newsgroups: | comp.os.msdos.djgpp
|
Path: | news-dnh.mv.net!mv!news.sprintlink.net!cs.utexas.edu!swrinde!howland.reston.ans.net!news-e1a.megaweb.com!newstf01.news.aol.com!uunet!in2.uu.net!psinntp!psinntp!psinntp!psinntp!netrixgw.netrix.com!jasmine!ld
|
From: | ld AT jasmine DOT netrix DOT com (Long Doan)
|
Subject: | Re: [Q] Inline functions -- trying to do far call
|
To: | kenfoo AT techm DOT pl DOT my (Kenneth Foo)
|
Sender: | ld AT jasmine (Long Doan)
|
Reply-To: | ld AT netrix DOT com
|
Organization: | Netrix Corporation
|
References: | <806316619 DOT 115snx AT techm DOT pl DOT my>
|
Date: | Fri, 21 Jul 1995 21:11:03 GMT
|
Lines: | 84
|
Dj-Gateway: | from newsgroup comp.os.msdos.djgpp
|
There are a few things that you should do:
1. If the function that you jumps to is written for protected mode
(i.e. It uses 32 bits push/ret, etc.), then it should be easiest
to jump to that code. Ex:
void FarCallJump (int sel, int off) /* This is *MUCH* easier than to
* worry about the struct */
{
asm ("movl $L_f_cal1l, %ecx \n\
movb $0xea, (%ecx) \n\
movl 8(%ebp), %edx \n\
movw %dx, 5(%ecx) \n\
movl 12(%ebp), %edx \n\
movl %edx, 1(%ecx) \n\
movl %ebp, %esp \n\ /* Trash our stack frame */
popl %ebp \n\
popl %eax \n\ /* Return address */
pushl %eflag \n\ /* Make it looks like */
pushl %eax \n\ /* an interrupt */
L_f_call1: \n\ /* Jump instruction */
nop \n\
nop \n\
nop \n\
nop \n\
nop \n\
nop \n\
nop \n\
");
}
void FarCall (__dpmi_paddr *SelectorOffset32)
{ FarCallJump (SelectorOffset32->sel, SelectorOffset32->off);
}
2. If the code is real-mode code, use the simulate_int functions.
3. Is it really necessary to call a function to simulate an
interrupt? Maybe you can get away from it be using 'int' istructions.
Hope that helps,
Long.
In article <806316619 DOT 115snx AT techm DOT pl DOT my>, kenfoo AT techm DOT pl DOT my (Kenneth Foo) writes:
|> Concerning DJGPP 2...
|>
|> I need something like this..
|>
|> __dpmi_paddr SelectorOffset32;
|>
|> DoINT(SelectorOffset32);
|> //Simulate an interrupt by calling SelectorOffset32 (contains
|> //a selector:offset32 pair).
|>
|> However, I can't seem to do it (through inline assembly).
|>
|> The assembly code is 'roughly' like this (not exact, because I really don't
|> fully understand writing inline assembly code).
|>
|> inline void FarCall(__dpmi_paddr *SelectorOffset32) {
|> asm("
|> pushf
|> lcall (_SelectorOffset32) //I'm not sure how to put this.
|> )
|> :
|> : "m" SelectorOffset32 //Or this. :)
|> :"
|> }
|>
|>
|> I'm really very unsure about that inline assembly code there. DJGPP 2
|> probably gave some big errors. (ugh!).
|>
|> Thanks for any help!
|>
|>
|> PS: The reason for this is because I need to chain an original interrupt
|> after hooking to it. I can't use _go32_chain_protected_mode_interrupt
|> for some internal reasons. (I'm hooking to int 8h, and changing
|> its speed).
|> --
|> []----------------------------------------------------------[]
|> | Kenneth Foo Here's the question of the year: |
|> | kenfoo AT techm DOT pl DOT my Why do brains look like intestines? |
|> []----------------------------------------------------------[]
|>
- Raw text -