Diverse Fragen zu Assemblerprogrammierung unter Linux / Zeichen ausgeben
-
Hallo zusammen,
ich hab mal ne kleine Frage, die mir hier bestimmt jemand schnell und ohne Kompromisse beantworten kann: DOS-Assemblerprogramme nutzen ja Betriebssystem-Funktionen des Interrupts 0x21, worunter man u.a. Funktionen findet, die z.B. ein Zeichen ausgeben.
Unter DOS würde man ja sagen:
mov ah, 2 mov dl, 'a' int 21h
aber unter Linux habe ich im Interrupt 0x80 nur die Funktion write() gefunden, die ja einen Zeiger auf einen Characterbuffer erwartet.
Meine Frage: Gibt es unter Linux eine äqivalente Funktion wie obige, oder muß ich, um ein Zeichen auszugeben, ein Nullterminiertes 2-Byte Array benutzen? Ist write() dann nicht definitiv langsamer, da man ja drei Parameter übergeben und entsprechend vorher Register setzen muß? Wie ist fputc() dann implementiert?
Danke & Gruß
~cp
-
Eigentlich haben deine Fragen fast alle nichts direkt mit Assembler zu tun, weshalb du im Linux-Teil wohl eher Antworten bekommen koenntest.
Wie auch immer, zu dem, was noch am ehesten mit Assembler zu tun hat:code_pilot schrieb:
DOS-Assemblerprogramme nutzen ja Betriebssystem-Funktionen des Interrupts 0x21, worunter man u.a. Funktionen findet, die z.B. ein Zeichen ausgeben.
Ja... Das hat aber an sich nichts mit der Programmiersprache zu tun. Die DOS-API wird nun mal ueber int 21h programmiert. Die WinAPI allgemein ueber dynamisch gelinkte Funktions-"call"s und bei Linux laeuft das eben ueber int 80h. Nicht nur in Assembler - Hochsprachen verkapseln das halt nur.
code_pilot schrieb:
Ist write() dann nicht definitiv langsamer, da man ja drei Parameter übergeben und entsprechend vorher Register setzen muß?
Die 3 Register zu setzen ist mit Sicherheit das bei weitem Unaufwendigste an der ganzen Sache und ob dabei nun 3 oder 1 Register relativ einfach initialisiert wird, ist praktisch komplett zu vernachlaessigen. Eher unschoen ist groesserer/umstaendlicherer Code.
code_pilot schrieb:
Wie ist fputc() dann implementiert?
Hat zwar auch nicht das Geringste mit Assembler zu tun, aber ich schlage vor, das schaust du dir in den entsprechenden sources selbst an oder disassemblierst ein einfaches Programm (jeder brauchbare C-Compiler kann auch Assemblercode ausgeben).
-
Mit diesen Antworten kann ich nun mal gar nix anfangen, da diese meine Frage in keinster Weise beantworten, daher würde ich dich bitten, den Thread ins Unix/Linux-Forum zu verschieben, damit ich ihn nicht neu aufmachen muß - Danke.
~cp
-
code_pilot schrieb:
Meine Frage: Gibt es unter Linux eine äqivalente Funktion wie obige, oder muß ich, um ein Zeichen auszugeben, ein Nullterminiertes 2-Byte Array benutzen? Ist write() dann nicht definitiv langsamer, da man ja drei Parameter übergeben und entsprechend vorher Register setzen muß? Wie ist fputc() dann implementiert?
~cpHier ein Paar Antworten:
write Systemaufruf erwartet eine Adresse von deiner Zeichenkette und die Länge davon (und noch ein Handle auf deine Datei, unter Linux ist ja angeblich alles eine Datei). Die Zeichenkette muss nicht nullterminiert sein. Du musst einfach die Länge 1 übergeben. Bezüglich ob langsamer oder nicht, weiss ich nicht. Ich bin der Meinung, das ist unwichtig. Weigere mich auch, die beiden Betriebssysteme und deren Systemaufrufe zu vergleichen. Bezüglich Implementierung der fputc() Funktion könnte man im Quellcode der stdlib nachschauen.
-
abc.w schrieb:
Die Zeichenkette muss nicht nullterminiert sein.
Argf stimmt das muss sie auch nicht, Fehler meinerseits! Also scheint es wohl wirklich so, daß ich, um ein einzelnes Zeichen zu "printen" ein write-syscall mache, mit der Länge 1 Byte.
Danke! Hätte ich auch selbst drauf kommen können ;)...
~cp
-
Dieser Thread wurde von Moderator/in Nobuo T aus dem Forum Assembler in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.