Assembly win xp上的INT 21H函数#9

Assembly win xp上的INT 21H函数#9,assembly,tasm,Assembly,Tasm,我试图编译并执行以下汇编代码 .model small .stack 2000H .data msg db 'Enter $'; .code .startup main: call readeq; jmp exitl; readeq proc near mov ah,9; mov dx,0; lea dx,msg; int 21H; ret; readeq endp exitl: end; .exit 结果是: Enterê♦FGÇ=u⌠░ 埃♦弗克斯├P

我试图编译并执行以下汇编代码

 .model small
 .stack 2000H
 .data
 msg db 'Enter $';
 .code
 .startup
 main:
 call readeq;
 jmp exitl;
 readeq proc near
 mov ah,9;
 mov dx,0;
 lea dx,msg;
 int 21H;
 ret;
 readeq endp
 exitl:
 end;
 .exit
结果是:

Enterê♦FGÇ=u⌠░ 埃♦弗克斯├PS.Ç>--m☺T♠eíδ╕ ♥ï河☼╢]☺♥√;╟~      e–t=♦Gδ≤∙GG[X├S3
e9E☻特ï╪X.Ç>--m☺T♠伊伊↔â╟&;√}直径:r☻δ∩∙δ☺°[├QRS3█3.∗>--m☺T♥â╟&e8♣塔尔♂δ⌠CYQ;┘T♣δ≡∙δ☺°[ZY├Φ╬ ╦Φÿ ╦Φ. ╦ΦH╦Φ[ ╦╦等等


如果我在Windows XP上使用TASM和TLINK,如何解决此问题?

要正确终止您的程序,如果它是COM,您可以执行
RET
,或
INT 20h
(旧的CP/M方式)。如果您是EXE,请使用
AX=4C00
(0是退出代码)然后
INT 21h

jmp exitl不会终止您的程序。它继续运行,执行垃圾。INT 21h/0或INT 21h/ah=4c和al=return codemov dx,0不是必需的。您可以用lea dx覆盖它。