TASM中print_string过程内POP指令无法正常工作的原因咨询
问题分析:TASM过程中POP操作导致乱码的原因
核心原因:call指令的栈行为差异
当执行call print_string时,CPU会自动把当前指令流的下一条指令地址(也就是主程序中mov ax, 4c00h的地址)压入栈中,这是为了执行完过程后能回到原位置继续执行。
你的print_string过程第一句是pop dx,此时弹出的不是你之前push offset msg的字符串指针,而是call指令压入的返回地址。用这个返回地址作为字符串指针调用DOS打印功能int 21h 09h,自然会输出乱码。
而内联代码的场景中,push offset msg之后直接pop dx,栈里只有你手动压入的字符串指针,因此dx能正确获取到msg的偏移地址,打印行为正常。
修复方案
要让过程正确工作,可采用规范的栈参数访问方式:
print_string proc push bp ; 保存基址指针 mov bp, sp ; 用bp定位栈中的参数 mov dx, [bp+4] ; bp+4对应手动压入的offset msg(bp+2是call指令压入的返回地址) mov ah, 09h int 21h pop bp ret 2 ; ret 2表示执行返回后,自动跳过栈中2字节的参数(offset msg的长度) print_string endp
调用逻辑保持不变:push offset msg后执行call print_string即可正常打印。
内容的提问来源于stack exchange,提问作者V.D.
相关产品推荐
相关产品推荐

