You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 11:40:28