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 fr 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 Rcksprungdaten 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 zurckspringen        
            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
    

Anmelden zum Antworten