Autor Thema: problem bei bildschirmausgabe ?!  (Gelesen 4646 mal)

livinskull

  • Beiträge: 27
    • Profil anzeigen
    • Livinskulls site
Gespeichert
« am: 09. November 2007, 18:10 »
Hallöle,

mal wieder ne Frage (die letzte is ja schon seehr lang her)
Also ich hab jetz mein os soweit am laufen, tastaturtreiber und timer-programmierung haben funktioniert. Jetzt hab ich gedacht ich tu noch ein e CPU-erkennung einbauen. Seitdem kommt immer ein page-fault, weil der auf irgendeinen speicherbereich zugreifen will den ich gar nich in den page-tables drinhab, da er nicht benötigt wird.
Ich denke da hab ich irgendeinen fehler mit nem pointer gemacht, ich habe auch schon eine Vermutung wo er sein koennte, aber ich komme einfach nicht drauf was da falsch ist, deswegen poste ich hier mal den code fuer meine bildschirmausgabe und nen screenshot von der exception, und hoffe hier kann mir jemand helfen ;)



und er code:
Ich denke das Problem liegt in der scroll_down() funktion bei dem memcpy und memset...

//textmode.c Ausgabefunktionen für Textmode

#include "textmode.h"
#include "../kernel/livinos.h"  //fuer memcpy und memsetD

unsigned int gpos=0;
unsigned short *pScreen=(unsigned short*) 0xB8000;
unsigned short gattr=0x0700;

static char hexmap[] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

unsigned short attribut(unsigned char vogr, unsigned char higr)
{
unsigned short temp;

temp= higr;
temp=temp<<4;
temp= temp | vogr;
temp=temp<<8;
//gattr=temp;
return temp;
};

void set_attribut(unsigned char vogr, unsigned char higr)
{
gattr=attribut(vogr,higr);
return;
};

void gotoxy(unsigned char x, unsigned char y)
{
gpos= x+(y*COLS);
return;
};

void scroll_down()
{
unsigned blank, temp;

blank = 0x20 | (gattr << 8);

if (GETY >= 25)
{
temp = GETY - 25 +1;
memcpy(pScreen, pScreen + temp*80, (25 - temp) * 80 * 2);
memsetw(pScreen + (25-temp) *80, blank, 80);
gpos = 1920;
}

return;
};

void move_cursor()
{
outportb(0x3D4, 14);
outportb(0x3D5, gpos>>8);
outportb(0x3D4, 15);
outportb(0x3D5, (unsigned char) gpos);
};

void putch(unsigned char ch)
{

switch(ch) {
case '\n':
gotoxy(0,GETY+1);
break;
case '\r':
gotoxy(0,GETY);
break;
default:
pScreen[gpos++]= (unsigned short) ch | gattr;
break;
};
scroll_down();
move_cursor();
return;
};

void puts(char *s)
{

while(*s)
putch(*(s++));
return;
};


void clearscreen(unsigned char character, unsigned short attr)
{
unsigned short temp=gattr;
unsigned int i;

gattr=attr;
gotoxy(0,0);
for(i=0;i<=1999;i++)
{
putch(character);
};
gotoxy(0,0);
gattr=temp;
return;
};

/*detect_vid()
 *gibt 1 zurueck wenn Farbgrafikkarte gefunden, sonst 0
*/

unsigned char detect_vid(void)
{
unsigned char temp;
char c=(*((unsigned short*) 0x410)&0x30);

if(c==0x30)
temp=0; //mono
else
temp=1; //color

return temp;
};


/* kprintf
*/
void kprintf(char *format,...)
{
int *args = ((int*)&format) + 1;
char *t, d[10], xx[8];
xx[8]=0;
unsigned char aktarg=0;
unsigned int u;
int n, i;
//erstes argument in args[0]

while (*format)
{
if (*format== '%') {
format++;
if (*format == 0) break;

switch (*format) {
case 's': //string
//format++;
t = args[aktarg];
while (*t != 0) {
putch(*t);
t++;
}
break;

case 'c': //einzelnes zeichen
//format++;
putch(args[aktarg]);
break;

case 'x': //32 bit hex
//format++;
u = args[aktarg];
//putch('0');
//putch('x');
for(i=7;i>=0;i--) {
xx[i]=hexmap[u & 0x0F];
u >>= 4;
}
puts(xx);
break;

case 'd': //signed integer
//format++;
n = args[aktarg];
if (n < 0) {
u = -n;
putch('-');
} else {
u = n;
}
goto u2;

case 'u': //unsigned integer
//format++;
u = args[aktarg];
      u2:
      i=9;
      do {
      d[i] = (u%10) + '0';
      u /= 10;
      i--;
      } while (u && i>=0);
      while (++i < 10) {
      putch(d[i]);
      }
      break;
     
case 'X': //8 bit hex
//format++;
n = args[aktarg];
//putch('0');
//putch('x');
putch(hexmap[(n & 0xF0) >> 4]);
putch(hexmap[n & 0x0F]);
break;

default:
putch(*format);
} //ende switch
aktarg++;
} else { //gehoert zu if '%'
putch(*format);
}
format++;
} //ende while
}

Schonmal danke im vorraus,
livinskull


MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 09. November 2007, 19:50 »
Ich vermute du hast zur CPU-Erkennung ASM-Code geschrieben. Wenn ja dann überprüf den mal, denn das EIP den Fehler verursacht hat lässt auf einen fehlerhaften Stack schließen. Das deine Scroll_down-Funktion den stack zerstört kann ich mir nicht vorstellen(höchstens mit extrem falschem GETY)
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

livinskull

  • Beiträge: 27
    • Profil anzeigen
    • Livinskulls site
Gespeichert
« Antwort #2 am: 09. November 2007, 20:40 »
omg, wenn man zuviel win32asm codet vergisst man schnell das man ohne die high-level syntax von masm32 den stack selber anpassen muss, auch am ende von der funktion.... DANKE :D

allerdings bin ich jetz beim naechsten problem... jetz ist in eax ne riesige zahl und ein fehler beim schreiben diesmal...
bin mi diesmal ziemlioch sicher wo er liegt weiss aber nicht wie ich das anders machen soll?

;cpu.asm -> cpu.h ->cpu.c
%include "../macros32.asm"


global is_cpuid_supported
global cpu_id


;################################################
;int is_cpuid_supported(void)
;Rueckgabe: 0 cpuid nicht unterstuetzt
;    1 cpuid unterstuetzt

is_cpuid_supported:
push ebp
mov ebp,esp
push ebx

pushf ;push flags
pop eax ;flags->eax
mov ebx, eax ;save flags in ebx
xor eax, 0x200000 ;toggle cpuid-flag; Bit 21
push eax ;new flags ->stack
popf ;new Flags ->flags
pushf
pop eax ;new flags->eax
xor eax, ebx ;xor newflags, oldflags
jz not_supp
mov eax, 1
jmp end_is_cpuid_supported

not_supp:
xor eax,eax

end_is_cpuid_supported:
;################################
pop ebx                                          <== diese 3 zeilen hier hab ich vergessen :DD
mov esp,ebp
pop ebp
ret

;####################################################
;void cpu_id(level, *eax, *ebx,*ecx, *edx)
;pointer auf unsigned long fuer rueckgabe aus entsprechenden registern

cpu_id:
push ebp
mov ebp, esp
sub esp, 16 ;platz fuer vier lok vaiablen

pusha

mov eax, [Param1] ;level nach eax
cpuid
mov [Var1], eax
mov [Var2], ebx
mov [Var3], ecx
mov [Var4], edx
mov eax, [Param2]
mov ebx, [Var1]
mov [eax], ebx                      ;und hier i-wo is wohl der nächste fehler
mov eax, [Param3]               ; da ich ja hier in den speicherbereich wo eax hinzeigt reinschreib
mov ebx, [Var2]
mov [eax], ebx
mov eax, [Param4]
mov ebx, [Var3]
mov [eax], ebx
mov eax, [Param5]
mov ebx, [Var4]
mov [eax], ebx

popa

mov esp,ebp
pop ebp
ret

EDIT:
hat sich erledigt... schuld war die macros32.asm...
anstatt das da ebp+8 steht stand da bp+8

mannmannnmann
das hat ja ne weile gebraucht...
« Letzte Änderung: 10. November 2007, 00:42 von livinskull »


 

Einloggen