Moin,
da Xcode anscheinend mit Inlineassembler nicht ganz zurechtkommt, wollte
ich nochmal in reinem Assembler programmieren. Dafür habe ich zum Test
das Programm geschrieben:
1
mov $Text1,%dx
2
mov $0x09,%ah
3
int $0x21
4
mov $0x4C01,%ax
5
int $0x21
6
7
Text1: .ascii "Hallo Welt!$"
Das sollte meines Wissens ein einfaches x86 "Hallo Welt" Programm sein
(Zumindest wird es in die erwarteten Maschinenbefehle übersetzt).
Das kann ich so auch assemblieren, indem ich im Terminal "as as.s"
eingebe (as.s ist der Name der Datei). Das Ergebnis ist eine a.out
Datei. Diese kann ich nicht direkt ausführen. Wenn ich versuche, sie zu
starten, startet Saturn (was immer das ist) und schließt sich wieder,
anscheinend ohne, dass etwas getan wird. Oder wird mein Programm
ausgeführt und direkt wieder geschlossen, weil ich ja nur eine Ausgabe
habe?
Nach Nachforschungen über die .out Datei kam ich auf die Idee, mal mit
"ld a.out" zu linken. Da bekomme ich aber entweder den Fehler
"ld: in a.out, in section __TEXT,__text reloc 0: bad vanilla relocation
length for inferred architecture i386"
oder
"ld: could not find entry point "start" (perhaps missing crt1.o) for
inferred architecture i386"
.text, .data und .org 100 einfügen bringt nichts.
Kann mir jemand bitte erklären, wie man aus dem oben geschriebenen
Programm ein ausführbares Hallo Welt Programm erstellt? Das System ist
Mac OSX mit Intel Prozessor, also sollte der Code grundsätzlich richtig
sein. Assembliert wird ja auch ohne Probleme.
Vielen Dank
> Das sollte meines Wissens ein einfaches x86 "Hallo Welt" Programm sein
Dein "Wissen" ganze erinnert mich stark an das "Wissen" über
irgendwelche "geheimen" Peek- und Poke-Befehle, welche man als sehr
junger Mensch auf seinen C20 losgelassen hat, und dann (ohne daß man
wußte was da passiert) plötzlich der Cursor lila wurde, oder andere
wundersame Dinge passieren.
Meines Wissens (aus einem anderen Beitrag) nutzt Xcode den gcc. Das wird
also nichts bringen. Deshalb habe ich verlinkte Dokument schon von vorne
bis hinten durchgelesen und ausprobiert.
Soweit ich weiss, nutzt Xcode nicht nur gcc, sondern auch clang... was
passiert, wenn man inline assembler in llvm und dann zurück übersetzt,
ist eine andere Frage.
Man kann auf jeden Fall explizit gcc verwenden. Die Frage ist daher
vielleicht eher, was Du eigentlich tun willst und was nicht geht.
Der Weg, wie die Assembleranweisungen schlussendlich in Binärform in
eine ausführbare Datei kommen, ist recht irrelevant, wenn die
Assembleranweisungen Code ausführen, der vom Vorhandensein eines BIOS
ausgeht.
Ein BIOS in diesem Sinne gibt es auf dem Mac nicht, und um Ausgaben in
ein Terminalfenster zu machen, können folglich keine BIOS-Routinen
verwendet werden.
Stattdessen sind die üblichen Vorgehensweisen anzuwenden, die zu nutzen
sind, wenn Assemblerprogramme für Unix geschrieben werden.
Nach Assembler in Xcode habe ich da:
Beitrag "Xcode inline Assembler" schonmal gefragt. Nach
vielen Versuchen und verschiedenen Fehlermeldungen läuft es immer wieder
darauf hinaus, dass am Ende die Meldung "invalid Mnemonic 'mov' " (oder
movl, movb, inc, incl, sin, fsin…) übrigbleibt. Nur 'nop' funktioniert
einwandfrei ;-)
>wenn die Assembleranweisungen Code ausführen,>der vom Vorhandensein eines BIOS ausgeht.
Wie gesagt, wusste ich nicht, dass der Interrupt das BIOS benötigt.
Natürlich hat der Mac kein BIOS. Auf der Basis muss ich dann mal
weitersuchen.
Danke für die Hilfe.
@Dussel wieso sollte ein Mikroprozessor irgendwelche Mimiken zur Ausgabe
von Text eingebaut haben? Und selbst wenn, woher sollte er wissen wo der
Text in einer Umgebung wie OS X hin soll?
Das wird uebrigens auch unter Windows so nicht funktionieren, ausser Du
bringst die DOS/Win16-Emulation von Windows (sofern eine dabei ist -
Windows 7 64Bit zB hat keine) mit ins Spiel indem Du als 16-Bit
kompilierst.
Besorg Dir am besten einen Assemblerkurs der nicht von einer solchen
Umgebung ausgeht, oder benutze in der Tat einen physikalischen oder
virtuellen DOS-PC. Wobei das Wissen um DOS/BIOS-Schnittstellen langsam
aber sicher fuer allgemeine Anwendungen wertlos wird.