Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Cheebi am 03. June 2008, 12:42
-
hallo,
nachdem ich's jetzt geschafft habe, dass gcc meinen code auch unter linux übersetzt steh ich jetzt noch vor einem letzten problem beim linken der objektdateien:
folgender code erzeugt nachfolgenden fehler:
void PrintHexNumber(ulong ulNumber, ulong ulColor)
{
char c = 0;
char acNumber[10];
for ( ; c < 8; c++ )
{
acNumber[c] = ulNumber & 0xf;
ulNumber >>= 4;
}
acNumber[c++] = 'x';
acNumber[c] = 0;
for ( ; c >= 0; c-- )
{
switch (acNumber[c])
{
case 'x' : PrintChar('x', ulColor); break;
case 15 : PrintChar('f', ulColor); break;
case 14 : PrintChar('e', ulColor); break;
case 13 : PrintChar('d', ulColor); break;
case 12 : PrintChar('c', ulColor); break;
case 11 : PrintChar('b', ulColor); break;
case 10 : PrintChar('a', ulColor); break;
case 9 : PrintChar('9', ulColor); break;
case 8 : PrintChar('8', ulColor); break;
case 7 : PrintChar('7', ulColor); break;
case 6 : PrintChar('6', ulColor); break;
case 5 : PrintChar('5', ulColor); break;
case 4 : PrintChar('4', ulColor); break;
case 3 : PrintChar('3', ulColor); break;
case 2 : PrintChar('2', ulColor); break;
case 1 : PrintChar('1', ulColor); break;
case 0 : PrintChar('0', ulColor); break;
default : PrintChar('-', ulColor); break;
}
}
}
fehler:
ld -m elf_i386 -T link.ld -o kernel.sys
video.o: In function `_PrintHexNumber':
video.c:(.text+0x3327): undefined reference to `___stack_chk_fail'
grüße
Cheebi
-
:-o Soo viel code, nur um ne hexzahl auszugeben, oder verstehe ich den code falsch?
So, kannst du das switch-case - gedöns spaaren ;)
char c;
PrintChar('0', ulColor);
PrintChar('x', ulColor);
for ( ; c < 8; c++ )
{
c = (ulNumber & 0xf) >> 28;
if(c>9) PrintChar(c-10+'A', ulColor); //bzw 'a'
else PrintChar(c+'0', ulColor);
ulNumber <<= 4;
}
Aber zum eigentlichen Problem:
Ich habe zwar noch nie so ein Fehler gehabt, aber es scheint so, als würde der Compiler da irgendetwas am code ergänzen. Und zwar irgendetwas, was mit dem Stack, bzw dessen schutz zu tun hat. (___stack_chk_fail)
Wie Compilierst du die Datei?
-
Versuch mal -fno-stack-protector beim Compilieren und jo, soviel Code ist schon ein bisschen übertrieben :-)
-
@ ReadEagle
hast du den code mal ausprobiert? ich würde sagen, der hat noch 2 3 Fehlerchen.
1. char c wird doppelt verwendet ( Laufvariable und temp )
2. char c wird in der for schleife nicht innitallisiert ( unschön )
3. c = (ulNumber & 0xf) >> 28; wird wohl immer 0 werden, wenn ich nicht total daneben liege
für die Ausgabe von Hex zeichen verwend ich normalerweise eine art lookup table.
const char [] HEX = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
for ( i = 0; i < 8; i++ )
{
c = ( ulNumber >> 28) & 0x0F;
PrintChar(HEX[c], , ulColor);
ulNumber <<= 4;
}
-
Ich habe das nur aus den schnipseln des originals zusammenkopiert ;)
Hier was richtiges:
char c,chr;
PrintChar('0', ulColor);
PrintChar('x', ulColor);
for (c=0 ; c < 8; c++ )
{
chr = (char)(ulNumber >> 28)&15;
if(chr>9) PrintChar(chr-10+'A', ulColor); //bzw 'a'
else PrintChar(chr+'0', ulColor);
ulNumber <<= 4;
}
Ein array geht natürlich auch - ist wahrscheinlich sogar schneller :)
-
oh mann... sry, dass ich zu doof war, mir ein wenig einfacheren code einfallen zu lassen :roll:
Versuch mal -fno-stack-protector beim Compilieren und jo, soviel Code ist schon ein bisschen übertrieben :-)
danke, vielen dank! damit klappts.. so, muss jetzt aber ins bett...
gute nach
Cheebi
-
oh mann... sry, dass ich zu doof war, mir ein wenig einfacheren code einfallen zu lassen :roll:
"Experience macht einen guten Assembler" oder so :-D :mrgreen:
-
In diesem Falle: "Experience macht einen profesionelen C-Code..."
Gruss
-
In diesem Falle: "Experience macht einen profesionelen C-Code..."
Ich rede aber von "Montagearbeitern" (http://dict.leo.org/ende?lp=ende&lang=de&searchLoc=0&cmpType=relaxed§Hdr=on&spellToler=on&chinese=both&pinyin=diacritic&search=assembler&relink=on). :mrgreen: