; 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