X-Authentication-Warning: delorie.com: mailnull set sender to djgpp-bounces using -f From: "Joel Saunders" Newsgroups: comp.os.msdos.djgpp Subject: Easy question about pseudo registers Date: Tue, 5 Mar 2002 16:07:56 +0000 (UTC) Organization: Mailgate.ORG Server - http://www.Mailgate.ORG Lines: 63 Message-ID: <5331cfdd479ed421f470c47fd11207f4.62691@mygate.mailgate.org> NNTP-Posting-Host: spider-ntc-ta053.proxy.aol.com Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Trace: news.mailgate.org 1015333447 25792 198.81.16.43 (Tue Mar 5 17:07:56 2002) X-Complaints-To: abuse AT mailgate DOT org NNTP-Posting-Date: Tue, 5 Mar 2002 16:07:56 +0000 (UTC) Injector-Info: news.mailgate.org; posting-host=spider-ntc-ta053.proxy.aol.com; posting-account=62691; posting-date=1015333447 User-Agent: Mailgate Web Server X-URL: http://mygate.mailgate.org/mynews/comp/comp.os.msdos.djgpp/5331cfdd479ed421f470c47fd11207f4.62691%40mygate.mailgate.org To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com Ok, I made this real mode int 0xD exception handler. I test it with a program that makes EBX equal 0x10000 and then does a (using intel syntax here) mov [ebx], eax which in real mode causes int 0xD to be called. Now the first thing I have my handler do is print a message...so far so good. Now the problem. IP points to the opcode that caused int 0xD to be called. I want to increase IP by 4 so that it'll skip the mov[ebx], eax. The way I tried doesn't work. If someone would look at the "Print_Error_Message" routine at the end of this message, and tell me what I'm doing wrong and what I need to do, I'd greatly appreciate it. Thanks. #include #include #include #include #include unsigned char SChar; int _crt0_startup_flags = _CRT0_FLAG_LOCK_MEMORY; static __dpmi_regs callback_regs; static _go32_dpmi_seginfo info; void Print_Error_Message(_go32_dpmi_registers *r); main() { unsigned short Offset, Segment; Offset = _farpeekw(_dos_ds, 0x34); Segment = _farpeekw(_dos_ds, 0x36); printf("\nOld 0DH Segment%X\nOld 0DH Offset%X\n", Segment, Offset); __dpmi_regs r; info.pm_offset = (long)Print_Error_Message; _go32_dpmi_allocate_real_mode_callback_iret(&info, &callback_regs); _go32_dpmi_set_real_mode_interrupt_vector(0xD, &info); /* This is needed for my 486 */ r.x.ax = 0x250D; r.x.ds = info.rm_segment; r.x.dx = info.rm_offset; __dpmi_int(0x21, &r); /*****************************/ Offset = _farpeekw(_dos_ds, 0x34); Segment = _farpeekw(_dos_ds, 0x36); printf("\nNew 0DH Segment%X\nNew 0DH Offset%X\n", Segment, Offset); /* __djgpp_exception_toggle(); */ /* Only needed if exceptions linked */ r.x.ax = 0x3100; r.x.dx = 16; __dpmi_int(0x21, &r); } void Print_Error_Message(_go32_dpmi_registers *r) { __dpmi_regs reg; printf("You Have Caused A General Protection Fault.\n"); r->x.ip+= 4; //reg.x.ax = 0x4c00; //__dpmi_int(0x21, ®); } -- Posted via Mailgate.ORG Server - http://www.Mailgate.ORG