Forum: PC-Programmierung Mac as (Assembler) Programm erstellen


von Dussel (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Glaubst Du wirklich, daß OS X etwas mit int21-Aufrufen anfangen kann?

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

> 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.

von Mäckel Eppentosch (Gast)


Lesenswert?

Int21 ist ein DOS Bios Einsprung.
Dein Mac benutzt ein EFI statt Bios, geht also nicht.

von Dussel (Gast)


Lesenswert?

Ok, das wusste ich nicht. Ich dachte, dass Int 21 Prozessor (Intel) 
spezifisch ist. Dann hätte das Betriebssystem wenig damit zu tun…

von Peter II (Gast)


Lesenswert?

Innerhalb von einer Dos-Box sollte es gehen.

http://www.dosbox.com/

von Mäckel Eppentosch (Gast)


Lesenswert?

Genau, im Emulator geht es natürlich doch.
Aber ob es beim Problem hilft?

Dussel schrieb:
> da Xcode anscheinend mit Inlineassembler nicht ganz zurechtkommt

Ja dann nimm GCC.

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

von Dussel (Gast)


Lesenswert?

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.

von Klaus T. (gauchi)


Lesenswert?

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.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Clang unterstützt Inline Assembler genauso wie der GCC.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Dussel (Gast)


Lesenswert?

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.

von faustian (Gast)


Lesenswert?

@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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.