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 abermov 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.