Char vergleichen

Ich glaube so langsam, das es am GCC liegt, der 32Bit-Code erzeugt. Zu mindest wird das Thema hier http://forum.osdev.org/viewtopic.php?f=13&t=14157&start=0 behandelt.

Ich denke, du fährst besser, wenn du gleich in den Protected-Mode wechselst und 32-Bit-Code verwendest. So schwer ist das auch nicht, GrUB als Bootloader nimmt dir da einiges ab.

Edit: Hier gibts noch eine Erklärung, wie man mit GCC 16Bit-Code erzeugt: http://forum.lowlevel.eu/index.php?topic=1288.0

Meine Vermutung ist, das dein Code das derzeit nicht ist. Was gibt objdump auf das .o-File deines C-Codes aus?
 
Zuletzt bearbeitet:
Hm. Ich bin mir sicher, dass es am GCC liegt. Der 16-bit Trick funktioniert leider auch nicht, es funktioniert nichts mehr; ich kann keine Funktion aufrufen. Ich versuche jetzt mal in den PM zu wechseln.
 
Wow! Inzwischen funktionert der Trick!
Meine Funktion sieht so aus:
C:
int printString(char* szString) {
	int i=0;
	int finished=0;

	while (finished != 1)
	{
		if (szString[i] != '\0') {
			print(szString[i]);
			i++;
		}
		else {
			finished=1;
		}
	}
	return 0;
}
und ich rufe sie so auf:
C:
char szString[] = "Hallo Welt!";
printString(szString);
Leider stoppt die Funktion jetzt nie und es wird ewig Hallo Welt! ausgegeben... Ich verstehe leider nicht, warum. Ich hoffe mir kann jemand helfen. :)

EDIT:
printString("Hallo Welt!") funktioniert nicht, weil der String nicht übergegeben wird.

EDIT2:
Ich benutze zurzeit asm(".code16gcc\n");.
Wenn ich asm(".code16\n"); stattdessen schreibe, werden mit 11 leere Zeichen ausgegeben. Ich fürchte hinter dem Problem steckt doch noch ein bisschen mehr.
 
Zuletzt bearbeitet:
Leider stimmt das nicht. Ich kann ganz normal Buchstaben ausgeben (mit mov al, 'X'). Deshalb kann es kaum am 10er Interrupt liegen. Hast du noch andere Ideen?

EDIT:
Ich glaube, ich spinne:
C:
int printString(char* szString) {
	int i=0;
	while (i != 2)
	{
		print(szString[i]);
		i=i+1;
	}
	return 0;
}
Dieser Code gibt ewig HaHaHaHa usw. aus.
Ich versteh's nicht. Vielleicht will der Computer mich ja auslachen. :D
 
Zuletzt bearbeitet:
Wie gesagt, ich bin kein ASM-Profi, ich klau mir auch die Sachen aus dem Netz zusammen ;-)

Was mir allerdings noch aufgefallen ist: Der Datentyp int ist in der Regel 32bit groß. Versuch mal statt dessen short.

Hast du mal das Objekt-File deines C-Sources disassembliert? Wenn da irgendwelche 32bit-Register vorkommen, ist das natürlich ungünstig.

Edit: Kannst du mal den Code zeigen, der "printString" aufruft? Also alles, was so da drum rum ist.
 
Zuletzt bearbeitet:
:D short oder int ändert nichts. Ich hab das ganze disassembliert, und es werden 32bit Register verwendet. Hier ist der gesamte Sourcecode:
C:
asm(".code16gcc\n");
extern void print();
extern void restart();
extern char read();
int printString(char* szString);

int main() {
	char szString[] = "Hallo Welt!";
	printString(szString);
	while(read() != 'r');
	restart();
	return 0;
}

int printString(char* szString) {
	short i=0;
	while (i != 2)
	{
		print(szString[i]);
		i=i+1;
	}
	return 0;
}
Wie gesagt, ich verstehe nicht, warum das Programm nicht aus der Funktion zurückkehrt.

EDIT:
Das ist übrigens das disassemblierte:
Code:
00000210  6653              push ebx
00000212  6683EC14          sub esp,byte +0x14
00000216  67668B5C241C      mov ebx,[dword esp+0x1c]
0000021C  67660FBE03        movsx eax,byte [ebx]
00000221  6650              push eax
00000223  E87A00            call word 0x2a0
00000226  67660FBE4301      movsx eax,byte [ebx+0x1]
0000022C  6766890424        mov [dword esp],eax
00000231  E86C00            call word 0x2a0
00000234  66B800000000      mov eax,0x0
0000023A  6683C418          add esp,byte +0x18
0000023E  665B              pop ebx
00000240  C3                ret
00000241  67668D4C2404      lea ecx,[dword esp+0x4]
00000247  6683E4F0          and esp,byte -0x10
0000024B  6766FF71FC        push dword [ecx-0x4]
00000250  6655              push ebp
00000252  6689E5            mov ebp,esp
00000255  6651              push ecx
00000257  6683EC20          sub esp,byte +0x20
0000025B  6766C745EC48616C  mov dword [ebp-0x14],0x6c6c6148
         -6C
00000264  6766C745F06F2057  mov dword [ebp-0x10],0x6557206f
         -65
0000026D  6766C745F46C7421  mov dword [ebp-0xc],0x21746c
         -00
00000276  67668D45EC        lea eax,[ebp-0x14]
0000027B  6650              push eax
0000027D  E890FF            call word 0x210
00000280  6683C410          add esp,byte +0x10
00000284  E82900            call word 0x2b0
00000287  3C72              cmp al,0x72
00000289  75F9              jnz 0x284
0000028B  E83200            call word 0x2c0
0000028E  66B800000000      mov eax,0x0
00000294  67668B4DFC        mov ecx,[ebp-0x4]
00000299  C9                leave
0000029A  67668D61FC        lea esp,[ecx-0x4]
 
Zuletzt bearbeitet:
Für Compiler/Linker, bin ich dieser Seite gefolgt: http://www.lowlevel.eu/wiki/Crosscompiler_für_Windows.
Ich benutze eine Batch zum Erstellen.
So sieht sie aus:
Code:
nasm\NASM.exe -f bin -o bootloader.bin bootloader.asm
nasm\NASM.exe -f bin -o padding.bin padding.asm
nasm\NASM.exe -f elf -o kernelA.elf kernel.asm
nasm\NASM.exe -f elf -o functions/read.elf functions/read.asm
nasm\NASM.exe -f elf -o functions/restart.elf functions/restart.asm
nasm\NASM.exe -f elf -o functions/print.elf functions/print.asm
compiler_linker\bin\i586-elf-gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -fno-builtin -I./include -c -o kernelB.elf kernel.c
compiler_linker\bin\i586-elf-ld.exe -T link.ld -o kernel.bin kernelA.elf kernelB.elf functions/print.elf functions/read.elf functions/restart.elf
copy bootloader.bin+kernel.bin+padding.bin OS.img
mkisofs\mkisofs.exe -b OS.img -o OS.iso OS.img
PAUSE
 
Ich komme dem Problem auf die Schliche.
Wenn ich das print() weglasse funktionierts (mit der .code16gcc Variante). Aber erklären kann ich mir das immer noch nicht.
 

Neue Beiträge

Zurück