tasm >> nasm
-
Hallo!
Ich hab mal angefangen ein assembler tutorial mit Intel-Syntax zu lernen, versteh auch soweit alles(wow).Aber ich compilier des halt mit nasm und in dem tut sind die beispiele für tasm
Drum ne kleine bitte an euch schreibt mir mal das kleine ding da unten um so das es auf nasm läuft.
DOSSEG .MODEL SMALL .STACK 200h .CODE String DB "Hallo!$" START: MOV AX, CS MOV DS, AX MOV DX, OFFSET Message MOV AH, 9 INT 21h MOV AX, 4C00h INT 21h END START
thx tobZel
-
org 0x100 bits 16 mov dx, message mov ah, 9 int 0x21 mov ax, 0x4c00 int 0x21 message db "Hallo!$"
Ungetestet und ist keine 1:1-Umsetzung des Codes.
1. weil das Beispiel fehlerhaft ist (das Label "Message" ist undefiniert) und
2. weil das auch nicht so ohne weiteres klappen wuerde.
Dafuer funktioniert das ganze direkt indem du nur
"nasm -o test.com -f bin test.asm" machst (Dateinamen nat. entspr. ersetzen). Die erzeugte .com-Datei kannst du gleich starten.BTW:
Wenn du mit Tutorials lernst, solltest du IMO aber auch die Tools benutzen, die im Tutorial benutzt werden. Ich denke mal nicht, dass diese Umsetzung oben dir sehr viel weiter hilft, als evtl. dein Ego aufzubauen.
-
Hm, bei mir funkts net.
Das einzigste was funkt ist der code(hab ich bei google gefunden ;)); Beispielprogramm fr nasm/val ; Geht NICHT unter Linux! segment .text public align=16 ; Hier f„ngt das Programm wirklich an, der folgende ; Code dient zur Initialisierung von Daten und ; Stacksegmenten und muss immer drin bleiben! Start: ..start mov bx, ds ; DS und ES zeigen auf das Datensegment mov ax, data mov ds, ax mov es, ax ; Stack aufsetzen mov ax, stack mov ss, ax mov sp, tos ; Eigenen Stack mit gemerkten Rcksprungdaten versehen push bx mov ax, 0 push ax ;---------------------------------------- ; Hier f„ngt das eigentliche Programm an ; Bsp: Addition von zwei Zahlen, die in addrA und ; addrB liegen mov ax,[addrA] mov bx,[addrB] add ax,bx ; jetzt wird eine Routine angesprungen, die den Wert ; in AX als Hex-Zahl ausgibt. call hex_out ; Am Schluss zu DOS zurckspringen retf ; Gibt eine 16Bit-Zahl in AX in Hex aus. ; Der int 0x21-Befehl gibt mit AH=2 ein ASCII-Zeichen in DL aus hex_out: pusha mov bx,4 mov cx,ax hxloop: rol cx,4 mov dx,cx and dx,0xf cmp dx,0xa jge abcdef add dx,0x30 jmp char_out abcdef: add dx,0x41-10 char_out: mov ah,2 ; Cconout pusha int 0x21 popa dec bx jnz hxloop mov ah,2 mov dx,0xd int 0x21 ; Carriage Return mov ah,2 mov dx,0xa int 0x21 ; Newline popa ret ; Daten Segment, vorinitalisierte Werte sind hier drin ; segment .data public align=16 addrA: dw 0x99 addrB: dw 0x42 ; Stack Segment, tos bedeutet ; top of stack segment .stack stack align=16 resw 0x100 ; 256 Words, kann man veraendern tos: dw 0