NASM, *.com und *.exe
-
Hallo
Ich habe ein kleines Problem mit dem NASM, habe vorher TASM benutzt und versuche umzusteigen da es den NASM auch unter Linux gibt.
Folgender Code lässt sich einwandfrei assemblieren und tut auch genau das was ich will, HeAlo World ausgeben.org 100h section .data Hello db "Hello World!!",0Dh,0Ah,"$" section .text mov ah,09h mov dx,Hello mov bh,65 mov byte [Hello+2],bh ;lea dx,[Hello] int 21h mov ah,4Ch int 21h
Compilert wird er mit "nasm -fbin -ohekllo.com hello.asm
Compiliere ich ihn ohne dem "org 100h" mit "nasm -fobj -hello.obj hello.asm" und Linke ihn mit Tlink hello.obj, so wird ein bisschen ASCII Schrott ausgegeben, dann HeAlo World!!.
Wieso wird zuerst der ASCII Schrott ausgegeben? Auch wenn ich das lea verwende ändert sich nix.
Unter TASM ging das schön mit OFFSET Hello.Was ist an dem Code oder den Assembleroptionen falsch? Unter Linux gibt das, mit entsprechenden Parametern auch nur einen Speicherzugriffsfehler.
mfg Beginner
-
Durch die Verwendung von "org" wird ein bestimmter Wert zu allen nicht-relativen Offsets addiert.
Damit dann z.B. in einer .exe-Datei, deren Segmente schliesslich anders als bei .com-Dateien alle bei offset 0 beginnen, die offset-pointer noch an die richtigen Stellen zeigen, muessten eigentlich so viele 0-Bytes an den Anfang des Segments gesetzt werden, wie in der org-anweisung angegeben... (In deinem Fall 100h 0-Bytes).
Aus irgendeinem Grund tut das aber der NASM nicht. (was auch ein Grund ist, weshalb sich damit so gut Bootstraps schreiben lassen ;))
Ich wuerde also vorschlagen, "org 0" zu verwenden, wenn du Objectfiles erstellst, die hinterher noch gelinkt werden.hth
[ Dieser Beitrag wurde am 10.10.2002 um 13:23 Uhr von Nobuo T editiert. ]
-
Wenn ich versuche den Code mit org 0 anstelle von org 100h zu assemblieren (nasm -fobj -oTest.obj Test.asm)kommt ein "Test.asm:1: parser: instruction expected".
mfg Beginner
-
Vielleicht deutet NASM die 0 als eine Zahl im Hexadezimalsystem (aber nur als Prefix)....
Versuch es mal mit 0x0 statt 0...lg, phreaking
-
Ich hab schon 0, 0x0 und 0h versucht, kommt immer das Gleiche.
mfg Beginner
-
Ich hab nochmal die NASM-Dokumentation konsultiert
Anscheinend funktioniert die Org-Direktive nur im bin-Format.Aber folgendes kleines Programm laeuft... Vielleicht hilft dir das ja weiter. (Mit TLink gelinkt)
BITS 16 section .text ..start mov ax,data mov ds,ax mov dx,TestText mov ah,09h int 21h mov ax,4C00h int 21h section .data TestText db "Das hier ist eine mit NASM erstellte .exe-datei.",0Ah,0Dh,24h
-
Ja, das hilft super weiter, danke.
mfg Beginner