Mail Archives: djgpp/1998/12/23/06:54:06
I have modified the code a little bit. Now it looks something like this.
I have tested if the selector is valid (via _farpeekb) and it is. I
could write to the framebuffer without problems.
Concerning to the answer of Shawn Hargreaves, I now use these switches
to store the values in specific registers.
As there is no switch to load a value into the ds or es-register I have
to use the q-switch what should not be a problem, shouldn't it ?
If this is a problem how can I load a value to those registers without
using those switches ?
Although that are only 9 simple instructions, I can't figure out where
the bug is. But it seems that the counter register (cx) does not have
the correct values, because sometimes when it doesn't crash (this
happens if I only execute this code onetime) it writes to much bytes to
the screen.
What if I want to save, let's say the es-register in ax ? How can I make
sure that those registers, I want to use, are not used by gcc temporarly
?
As I have to load the selector into es, I have to load it temporarly via
%0 (there is no special switch to do that). But what if gcc stores this
selector temporarly into ax or another one and I want to uses this
register ? So how can I make sure that those registers, I want to use,
are not used by gcc temporarly ?
asm("pushw %%es\n\t"
"movw %0,%%es\n\t"
"movl %%ecx,%%ebx\n\t"
"shr $2,%%ecx\n\t"
"and $3,%%ebx\n\t"
"rep\n\t"
"movsl\n\t"
"movb %%ebx,%%ecx\n\t"
"rep\n\t"
"movsb\n\t"
"popw %%es":
:"c"((unsigned short)width),
"D"(address),"S"(buffer),"q"((unsigned short)vesa_framebuffer)
:"%ecx","%esi","%edi","%ebx");
And this is the traceback I got.
Exiting due to signal SIGSEGV
Page fault at eip=000041a6, error=0004
eax=00000000 ebx=00000102 ecx=022fc23d edx=00000000 esi=000f0000
edi=0008fff8
ebp=00055498 esp=0005547a program=E:\DJGPP\FILES\VESA.EXE
cs: sel=00f7 base=82e4a000 limit=ffcdbfff
ds: sel=00ff base=82e4a000 limit=ffcdbfff
es: sel=012f base=c5d39000 limit=003fffff
fs: sel=012f base=c5d39000 limit=003fffff
gs: sel=010f base=00000000 limit=ffffffff
ss: sel=00ff base=82e4a000 limit=ffcdbfff
Call frame traceback EIPs:
0x000041a6
0x00004fde
0x00005f6e
- Raw text -