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

x86汇编寄存器传参存变量后字符串输出截断仅显示'llo world'

问题根因

你的代码存在3个核心错误,直接导致输出不符合预期:

  • 字符串定义方式错误:汇编中字符串是连续的单字节序列,必须使用db(字节定义)伪指令声明,你错误使用了dw(字定义)。dw每次分配2字节空间,受x86小端序规则约束,每2个字符为一组的存储顺序会被颠倒,字符串内存布局完全混乱。
  • 参数传递逻辑错误:你写mov bx, bye时未加offset关键字,这行代码实际是将bye变量存储的第一个字的数值读入bx,而非将bye字符串的起始地址传入bx。后续你将bx中的数值写入ln变量的前2字节,直接覆盖了ln字符串开头的2个字符,最终从ln位置开始输出时,被覆盖的前2字节无法组成正确的He字符,后续字节刚好对应llo world $,就出现了你看到的错误输出。
  • 功能调用逻辑冗余且存在隐患:DOS中断int 21h的ah=09h字符串输出功能,仅要求dx存储待输出字符串的偏移地址,不需要把字符串内容拷贝到固定内存位置再输出。此外你在printf过程中直接写入了程序退出的中断调用int 21h(ah=4ch),会导致过程末尾的ret指令永远无法执行,后续扩展代码时会出现异常退出的问题。
修正后可运行代码
.model tiny
.code
org 100h

printf proc 
    ; bx已存储待输出字符串的偏移地址,直接传给dx即可
    mov ah, 09h
    mov dx, bx
    int 21h
    ret ; 过程执行完成后返回主流程,不要在通用过程里直接退出程序
printf endp

main proc near
    mov bx, offset bye ; 加offset关键字,将bye字符串的偏移地址传入bx
    call printf
    ; 所有业务逻辑执行完成后再调用程序退出中断
    mov ah, 4ch
    mov al, 00
    int 21h
endp
; 所有字符串统一使用db定义,禁止用dw声明长字符串
ln db "Hello world $"  
bye db "Bye WORLD $"
end main

运行上述代码会正确输出Bye WORLD $,如果需要输出Hello world $,只需要将main中mov bx, offset bye改为mov bx, offset ln即可。

内容的提问来源于stack exchange,提问作者theLawyer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 01:36:27