keine Ausgabe bei assemblierter Datei
-
Hallo,
ich habe mir aus einem Forum ein Beispielscipt herauskopiert:
section .text global _start ; für den Linker (ld) notwendig msg db 'Hello world',0x0A ; unser Text incl. Zeilenumbruch LF (0x0A) len equ $ - msg ; Länge des Textes berechnen (12 Bytes) _start: mov eax,4 ; Systemaufruf Nr. 4 (sys_write) Textausgabe mov ebx,1 ; Ausgabekanal Nr.1 = stdout mov ecx,msg ; Adresse unseres Textes im Speicher mov edx,len ; Länge des Textes in Bytes int 0x80 ; Kernel aufrufen mit obigen System-Aufrufparametern mov eax,1 ; Systemaufruf Nr. 1 (sys_exit) Programmende int 0x80 ; Kernel aufrufen mit obigen System-Aufrufparametern
Danach habe ich es mit
nasm -fbin -o test.com test.asm
assembliert.Erhalte aber dabei keine Ausgabe, wenn ich die com-Datei ausführe.
Muss ich da noch irgendwas mit int 10 oder etwas ähnlichem hinzufügen
-
Hi.
Es waere sinnvoll gewesen, noch das OS anzugeben, fuer das du programmierst.
Der Fakt, das du eine .com-Datei erstellt hast und den int 10h verwenden willst, legt die Vermutung nahe, dass du unter Windows arbeitest und fuer DOS programmierst.
In diesem Fall solltest du dir darueber im Klaren sein, dass der Codeabschnitt, den du kopiert hast, Systemaufrufe fuer Linux enthaelt und deshalb unter Windows/DOS nicht die gewuenschten Resultate bringen kann.BTW:
Fuer alternative Tutorials fuer DOS/Win32 kannst du dich in den Assembler-FAQ umsehen. Dort gibt es aber auch kein Tutorial fuer NASM auf anderen Systemen als Linux.Meine Empfehlungen:
1. Weniger blind C&P machen.
2a. Auf Linux umsteigen
2b. Alternativ erstmal NASM-Syntax halbwegs verstehen, bzw. Unterschiede der Syntax zu TASM(/MASM) (gibt dazu auch einen Abschnitt in den NASM-Docs) und dann mit entsprechendem Tutorial fuer TASM weiterarbeiten.
2c. Auf TASM umsteigen.
-
Moin, Moin...
Das obige Assemblerprogramm ist für Linux geschrieben, NICHT für DOS. Wenn Du also eine Binärdatei erzeugst, ist diese unter Linux nicht ausführbar. Auch unter DOS wirst Du nichts sehen, da der Interrupt 0x80 unter DOS nicht definiert ist.
Unter Linux muss die Datei zu einer Object-Datei assembliert und diese dann zu einer ELF-Datei gelinkt werden.
Unter DOS musst Du die entsprechende Ausgabefunktion der DOS-API benutzen.
Ciao...
-
Oh, na sowas. Linux.
Ok, danke für die Tipps, dann werde ich es wohl mal unter Linux machen.
Das dumm ist bloß, das TASM nicht als Freeware zur Verfügung steht und ich mit NASM den einzigen Freewareassempler gefunden habe.
Aber ich bekomme das schon gebacken
-
BasicMan01 schrieb:
Ok, danke für die Tipps, dann werde ich es wohl mal unter Linux machen.
Das dumm ist bloß, das TASM nicht als Freeware zur Verfügung steht und ich mit NASM den einzigen Freewareassempler gefunden habe.Nasm ist doch gut. Also ich persoenlich finde Nasm sehr nett. Wenn du lieber unter Windows programmierst, hier mal ne Hallo-Welt für DOS (nasm-tauglich und als COM nur 20 Bytes wobei schon 11 Bytes davon Text sind - kleiner habe ich's selbst noch nicht geschafft)
ORG 100h ; Com-Datei mov dx,msg ; offset von msg nach dx mov ah,09h ; funktion 09h (gibt $-terminierten string (offset in dx) aus) int 21h ; aufruf ueber int 21h ret ; ende der com-datei Daten: ; daten segment msg db "Hallo Welt!","$" ; unser string der ausgegeben werden soll
Assembliert wird es dann z.B. mit nasmw -o datei.com datei.asm.
-
BasicMan01 schrieb:
Das dumm ist bloß, das TASM nicht als Freeware zur Verfügung steht
Wenn du dich auch mit TASM32 zufriedengibst: er ist im Borland C++BuilderX enthalten (1.0 oder 1.5).
Moritz