Mail Archives: djgpp/1998/08/28/14:15:28
From: | igp AT vlc DOT servicom DOT es (Ignacio García Pérez)
|
Newsgroups: | comp.os.msdos.djgpp
|
Subject: | HELP!... execute CODE in DATA segment seems not work
|
Date: | Fri, 28 Aug 1998 17:46:19 GMT
|
Organization: | GND
|
Lines: | 92
|
Message-ID: | <35e6eadc.3949780@crispin>
|
Reply-To: | igp AT vlc DOT servicom DOT es
|
NNTP-Posting-Host: | rdsi23.vlc.servicom.es
|
Mime-Version: | 1.0
|
To: | djgpp AT delorie DOT com
|
DJ-Gateway: | from newsgroup comp.os.msdos.djgpp
|
Hi,
I've been playing around with the idea of using interrupt wrappers
located in C structures. But had no luck and can't guess what's wrong.
The following code has an array of bytes which corresponds to a simple
interrupt service routine that just increments a variable. This code
is patched with the proper DS selector value and the proper offset of
the variable to be incremented.
Afterwards, I just set the IRQ0 (INT8, timer tick interrupt) to point
to the byte array, and the print continuously the variable value.
If the interrupt service woutine were being serviced properly, the
printed value should increment (yes, I declared it volatile). If it
were being called properly but there was something wrong with the code
in the byte array, the machine would surely just hang up or blow away
with some SIGSEGV signal, but none of the two things happens. The
variable is not incremented.
I attach the sources just in case some DJGPP guru can tell me what's
wrong there:
#include <extdef.h>
#include <dpmi.h>
#include <sys\segments.h>
byte Test[]={
/* 0000 */ 0x50, /* pushl %eax */
/* 0001 */ 0x1E, /* pushl %ds */
/* */ /* */
/* 0002 */ 0x66,0xB8, /* movw $0000,%ax */
/* 0004 */ 0x00,0x00, /* */
/* 0006 */ 0x66,0x8E,0xD8, /* movw %ax,%ds */
/* 0009 */ 0xFF,0x05, /* incl 0 */
/* 000b */ 0x00,0x00,0x00,0x00, /* */
/* */ /* */
/* 000f */ 0xB0,0x20, /* movb $0x20,%al */
/* 0011 */ 0xE6,0x20, /* outb %al,$0x20 */
/* */ /* */
/* 0013 */ 0x1F, /* popl %ds */
/* 0014 */ 0x58, /* popl %eax */
/* 0015 */ 0xCF, /* iret */
};
#include <conio.h>
volatile dword TickCount;
void main(void) {
__dpmi_paddr A,B;
*(word *)(Test+0x0004)=(word)_my_ds(); // Path code so it can
*(dword *)(Test+0x000B)=(dword)&TickCount; // increment TickCount
B.selector=(word)_my_ds(); // New interupt vector will
B.offset32=(dword)&Test; // point to code in data
// segment
if (__dpmi_get_protected_mode_interrupt_vector(0x08,&A))
{ cprintf("Error GET\r\n"); return; }
if (__dpmi_set_protected_mode_interrupt_vector(0x08,&B))
{ cprintf("Error SET\r\n"); return; }
while (!kbhit()) {
cprintf("%lu\r\n",TickCount);
}
getch();
if (__dpmi_set_protected_mode_interrupt_vector(0x08,&A))
{ cprintf("Error SET\r\n"); }
}
Thanks. Nacho.
- Raw text -