1
Lowlevel-Coding / Re: V86 Modus
« am: 04. September 2007, 21:32 »
Vielen Dank für deine Hilfe bluecode
09. December 2024, 19:52
Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.
unsigned char opcode[2];
opcode[0] = 0xCD;
opcode[1] = 0x10;
mem_set(0x500, 0, 0xffff);
mem_cpy(0x500, opcode, 0x02);
Neuer_Task_vm86( 0x500, "v86task", KERNEL_TASK, NORMAL_PRIORITY );
Bei welcher Instruktion tritt denn der Fehler auf?
00084951475-i-@00102142-[CPU ] IRET to V86-mode: ignoring upper 16-bits
00084951522-e-@00101852-[CPU ] seg = DS
00084951522-e-@00101852-[CPU ] seg->selector.value = 0000
stackptr=kernstack;
*--stackptr=0x20|3;
*--stackptr=0x20|3;
*--stackptr=0x20|3;
*--stackptr=0x20|3;
*--stackptr=0x20|3;
*--stackptr=(unsigned long)userstack;
*--stackptr=0x20002L;
*--stackptr=0x18|3;
*--stackptr=(unsigned long)startpunkt;
*--stackptr=0x0; //EAX
*--stackptr=0x0; //ECX
*--stackptr=0x0; //EDX
*--stackptr=0x0; //EBX
*--stackptr=0x0; //-->ESP kann Null sein
*--stackptr=0x0; //EBP
*--stackptr=0x0; //ESI
*--stackptr=0x0; //EDI
*--stackptr=0x10; //ds
*--stackptr=0x10; //es
*--stackptr=0x10; //fs
*--stackptr=0x10; //gs
00084951475-i-@00102142-[CPU ] IRET to V86-mode: ignoring upper 16-bits
00084951478-i-@00000003-[CPU ] LOCK prefix unallowed (op1=0x53, attr=0x0, mod=0x0, nnn=0)
00084951522-e-@00101852-[CPU ] seg = DS
00084951522-e-@00101852-[CPU ] seg->selector.value = 0000
int main( void )
{
unsigned int zahl1 = 100;
unsigned int zahl2 = 200;
asm("movl %0, %%ebx" :: "r" (zahl1)); // Übergabeparameter
asm("movl %0, %%ecx" :: "r" (zahl2)); // Übergabeparameter
asm("movl $0x0001, %eax"); // Funktionsnummer
asm("int $0x30"); // Systeminterrupt
return 0;
}
int main( void )
{
unsigned char text[] = "Test Test Test";
asm("movl %0, %%ebx" :: "r" (text)); // Übergabeparameter
asm("movl $0x0002, %eax"); // Funktionsnummer ( 2 - Textausgabe )
asm("int $0x30"); // Systeminterrupt
return 0;
}
extern _system_int
global _dein_int
_dein_int:
cli
call _system_int
sti
iretd
void system_int()
{
unsigned long EAX,EBX,ECX,EDX;
// Infos aus Registern holen, und in EAX,EBX,... speichern
if( EAX == 0x01 )
Textausgabe( "Hallo Welt" );
}
int main()
{
asm( "movl $0x1,%eax" );
asm( "int $0x33" ); // Statt int 33h musst du deinen SYSINTERRUPT angeben
while( 1 );
return;
}