Char vergleichen

Du definierst einmal short i=0 und short finished=0 und in der funktion die gleichen Namen nochmals mit dem Typ int... ändere da mal was, vielleicht gehts dann.
 
Nein, es wird bei gleichen Namen immer die lokalste Variable angesprochen, das bedeutet die globalen Variablen mit gleichen Namen stören den Compiler nicht.
 
Ich hab das Ganze mal mit dem selben Compiler ausprobiert, einfach folgendermassen:

C:
#include <stdio.h>
int printString(char* szString);
 
short i=0;
short finished=0;
 
int main() {
    printString("Ha");
    while(read() != 'r');
    return 0;
}
 
int printString(char* szString) {
    int i=0;
    int finished=0;
    while (finished != 1)
    {
        if (szString[i] == '\0') {
            finished=1;
        }
        else {
			printf("%c", szString[i]);
			i=i+1;
        }
    }
    return 0;
}

Ich weiss dass du stdio.h nicht verwenden kannst. Aber die Tatsache, dass es so funktioniert lässt darauf schliessen, dass die print() Routine nicht funktioniert...
Oder kannst du sagen wo genau das Programm hängen bleibt?
 
Und falls es wirklich nicht print sein sollte, üäpöol, nocheinmal:
Welche Rolle/Position hat dieses Programm in deinem OS?
Das main weckt den Verdacht auf Missverständnisse...

Wie kompilierst du genau?
Wie wird das Ganze mit dem Asm-Teil zusammengehängt?
Wie von Asm aus aufgerufen...?
 
Das Problem ist print(). Ich muss die Funktion nochmal verändern. Ich kompiliere das C Programm mit gcc ins elf-Format. Die Asm-Dateien werden auch ins elf-Format assembliert und am Ende wird alles zusammen ins binäre gelinkt.

EDIT:
Genauer gesagt ist das Problem mit print, dass ich es nur einmal aufrufen kann und danach alles abstürzt. Ich vermute, dass das am Stack liegt.
 
Zuletzt bearbeitet:
Ich hätte auch auf ein Problem mit dem Stack oder so getippt.

Noch etwas. Weiss gerade nicht mehr wie das verarbeitet wird. Du übergibst ja "Ha" und hast danach nur noch ein Pointer zu diesem String, welcher temporär abgespeichert wird.
Kann es sein dass dieses "Ha" nicht mehr am existiert (an diesem Speicherplatz) nachdem du print() aufgerufen hast? Wenn ja, übergib mal ne Variabel...
Aber eben, mit ist nicht mehr bewusst wie das verarbeitet wird vom PC
 
Genauer gesagt ist das Problem mit print, dass ich es nur einmal aufrufen kann und danach alles abstürzt. Ich vermute, dass das am Stack liegt.
Evtl. solltest du einfach mal den gesicherten Stackpointer wieder zurückschreiben?
Noch etwas. Weiss gerade nicht mehr wie das verarbeitet wird. Du übergibst ja "Ha" und hast danach nur noch ein Pointer zu diesem String, welcher temporär abgespeichert wird.
Kann es sein dass dieses "Ha" nicht mehr am existiert (an diesem Speicherplatz) nachdem du print() aufgerufen hast?
Nein, das kann nicht sein. Der String ist die ganze Programmlaufzeit über verfügbar.

Gruß
 
Ich bin jetzt nicht so der ASM-Profi, aber könnte das nicht so funktionieren:

Code:
[BITS 16]
global print
 
print:
    push bp
    mov bp, sp
    mov al, [bp+4]
    mov ah, 0x0E
    int 0x10
    mov sp, bp
    pop bp
    ret
 
Wow, das ist ja genial! Zumindest stürzt das Programm jetzt nicht mehr (zumindest wenn ich print() selbst mehrfach aufrufe) ab, aber den Paramter bekomme ich leider nur beim ersten Aufruf der print() - vielleicht wird die Funktion auch nur einmal aufgerufen - und die Funktion printString gibt nur Müll aus, wonach alles wieder abstürzt.
Aber ich glaube, das geht in die richtige Richtung! Vielen Dank, saftmeister!

EDIT:
Ich habe jetzt herausgefunden, dass print() nicht mehrfach aufgerufen wird. Ich habe keinen Schimmer, warum nicht. Ich hoffe ihr könnt mir nochmal helfen.
 
Zuletzt bearbeitet:
Zurück