Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: micha am 27. August 2013, 17:19
-
Moin.
ich bin grad dabei, fasm zu portieren. An sich läuft das ganze schon, aber ich hab da ein paar kleine probleme, die vielleicht durch den screenshot ganz deutlich werden.
Nach dem er den Versionsstring ausgegeben hat, assembliert er und gibt dann die etwas komische ausgabe. Zwischen jedem Buchstaben stehen noch andere Zeichen (unter anderem der dateiname). Wo die herkommen würde ich gern wissen. Wenn ich aber die eigentlichen Buchstaben entziffere, dann steht da folgendes:
3 passes, 157 bytes.
Also das gleiche ergebnis wie unter Linux.
Zweites Problem: die neue-programm datei wird korrekt angelegt und beschrieben. (siehe den cat aufruf). Aber wenn ich versuche, hello auszuführen, hat es angeblich nicht die richtige magic.
:?
Der code ist auf https://github.com/michamimosa/FruityOrange (https://github.com/michamimosa/FruityOrange) zu finden.
Ich hoffe, dass mir jemand da auf die sprünge helfen kann.
-
Zwischen jedem Buchstaben stehen noch andere Zeichen (unter anderem der dateiname).
Wenn ich raten soll, dann liegt es daran, dass du in syscall_wrappers.c, Zeile 134 (https://github.com/michamimosa/FruityOrange/blob/master/kernel/vfs/syscall_wrappers.c#L134) für die Deskriptoren 0-2 printf verwendest und die Länge ignorierst: Möglicherweise nutzt FASM den Syscall für jeden Buchstaben einzeln und hinter dem Puffer, in dem die Buchstaben stehen, steht hello.
Zweites Problem: die neue-programm datei wird korrekt angelegt und beschrieben. (siehe den cat aufruf). Aber wenn ich versuche, hello auszuführen, hat es angeblich nicht die richtige magic.
Ich hab keine Idee, was die Ursache sein könnte, aber deine Ausgabe in elf32.c, Zeile 65 (https://github.com/michamimosa/FruityOrange/blob/master/kernel/proc/elf32.c#L65) liest den Header um 1 Byte verschoben aus. Es ist erstmal sehr unelegant einfach die Variable header zu dereferenzieren, weil das eine Kopie davon auf dem Stack anlegt. Vielleicht kann dein printf damit nicht umgehen. Du solltest die ersten vier Bytes im ident-Feld einmal einzeln ausgeben, um das zu prüfen. Wenn auch diese Ausgabe den Header um 1 verschoben ausgibt, dann solltest du bei deinen Ladefunktionen weiterforschen, wo da eine 1 addiert werden könnte. Ich habe auf die Schnelle nichts gefunden, aber mit gezielten Debugausgaben könntest du da vielleicht vorankommen.
-
ok danke, die probleme sind erstmal gelöst.
aber noch eine frage: wie kann ich im fasm code den entrypoint verstellen?
-
Ich bin mir nicht sicher was ein Entrypoint ist, aber
im normalen Assembler könnte man am Anfang einfach einen
jump zu einer anderen Stelle machen, würde ich aber nicht Empfehlen, da es
bei mir in einen Spaghetti Code geendet ist.
Aber das wäre dann eine Vermutung.
-
Nein mit dem entrypoint meine ich die adresse, an die das programm gelinkt wird.
http://de.wikipedia.org/wiki/Einsprungspunkt (http://de.wikipedia.org/wiki/Einsprungspunkt)
-
FASM beherrscht die org-Direktive.
Oder meinst du etwas anderes?
-
Vermutlich meint er die entry-Direktive (http://lmgtfy.com/?q=fasm+entrypoint).
-
hat sich alles geklärt. danke