Frage zu jmp (TASM)



  • Hallo !

    Ich hab hier das Code Segment von meinem kleinen Hello World Programm angehaengt. Dabei ist mir was aufgefallen:
    Der Code so wie er jetzt unten steht, gibt nichts aus, obwohl vor dem Jump Hello World ausgegeben werden sollte, wenn ich aber

    mov ax,4C00h
    int 021h
    

    was das Programm beendet, ganz nach untn kopiere, also nach dem code vom Label printNL, dann funktionierts wie es sollte..
    Warum ist das so ? Auch wenn der Codeteil noch vor printNL steht, sollte das erste mal die Meldung ausgegeben werden, beim JMP wird aber ncihts ausgegeben und das Programm sofort beendet. Wenn ich call statt jmp mache (und ein ret anhaenge an printNL), funktionierts so wie der code jetzt unten steht auch...
    (Mit ret und jmp tut sich auch wieder nichts, also die erste Asugabe wird ebenfalls verschluckt...)
    Kanns viell. sein das der auszugebende String in einem Puffer liegt und das Programm zu schnell beendet wird, bevor dieser noch ausgegeben wird ??

    Wäre dankbar über eine Aufklärung.

    CODE SEGMENT
              ASSUME CS:CODE,DS:DATA, SS:sta
    start:
    mov ax,DATA
    mov ds,ax
    mov dx,offset Meldung
    mov ah,09h
    int 21h
    
    jmp printNL
    ;call printNL
    
    mov dx, offset Meldung
    mov ah,09h
    int 21h
    
    mov ax,4C00h
    int 021h
    
    printNL: mov ax, SEG NEWLINE
    mov ds, ax
    mov dx, offset NEWLINE
    mov ah,09h
    int 21h 
    
    CODE ENDS
    END start
    


  • der code wird linear von oben nach unten durchgearbeitet wie soll der prozessor wissen das er nochmal zurückspringen sollte??
    ausserdem hast du:

    msg db Meldung "Hello World",0xa0
    

    im daten segment vergessen.

    als gedächtnisstüze:

    .code
    .data
    

    ausserdem wo ist das model des programms definiert? TINY SMALL FLAT etc..
    die processor definition wie .i586 oder i386 fehlt auch... entweder hast du das beispiel nicht ganz gepostet oder naja so wies du gepostet hast wirds wohl nicht mahl vom compiler zusammengebaut...

    gibt eh gute beispiele im TASM verzeichnis um einfache assembler anweisungen zu lernen.



  • Nochwas:
    Wenn du ein Tiny/Small Programm verwendest, dh. nur ein Datensegment, reicht es idR. wenn du ds nur einmal am Anfang des Programms setzt.
    Eine andere Kombination als call/ret ist selten eine gute Idee (es sei denn, man hat Ahnung).
    Ein Debugger ist eine wirklich tolle Erfindung - vor allem auch für asm-Programme.
    TASM enthaelt einen sehr guten Debugger: TD. Lade doch deine Programme einfach mal da rein, dann kannst du genau verfolgen, was vor sich geht.


Anmelden zum Antworten