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

汇编程序输入29字符输出异常问题排查请求

汇编代码输入29字符输出异常的排查与解决

问题根源

  1. 栈空间不足:代码中.stack 10仅分配10字节栈空间,DOS的int 21h中断调用需要保存寄存器、执行内部逻辑,栈空间过小会触发栈溢出,破坏数据段中inputmsg末尾的$结束符,导致输出时无法正常终止,出现乱码。输入29字符时,数据段占用更接近栈溢出临界值,问题直接暴露。
  2. 未强制添加字符串结束符:虽然初始化时给inputmsg分配了带$的空间,但输入接近最大值时,栈溢出的影响会直接破坏末尾的$;若输入满30字符,会完全覆盖初始化的$,必然出现输出异常。

修复步骤

1. 扩容栈空间

将栈空间调整为足够大小,比如256字节,满足DOS中断的栈需求:

.stack 100h

2. 手动添加结束符

在输入完成后,根据实际输入字符数,在字符串末尾插入$,确保输出中断能正确识别字符串边界:

; 输入中断执行后插入这段代码
mov cl, inputmsg+1   ; 读取实际输入字符数
mov ch, 0
mov bx, offset inputmsg+2
add bx, cx           ; 定位到字符串末尾
mov byte ptr [bx], '$'  ; 添加结束符

修复后完整代码

.model small
.data
inputinvite db 'Input: $'
output db 'Output: $'
inputmsg db 30,(?),30 dup ('$') ; 1字节最大长度,1字节实际长度,30字节存储字符
.code
start:
mov ax,@data
mov ds,ax

; 输出输入提示
mov dx,offset inputinvite
mov ah,9
int 21h

; 读取输入字符串
mov dx,offset inputmsg
mov ah,10
int 21h

; 添加字符串结束符
mov cl, inputmsg+1
mov ch, 0
mov bx, offset inputmsg+2
add bx, cx
mov byte ptr [bx], '$'

; 输出结果
mov dx,offset output
mov ah,9
int 21h

mov dx,offset inputmsg+2
mov ah,9
int 21h

; 延迟避免窗口立即关闭
mov dx,0
mov ah,10
int 21h

; 程序退出
mov ax,4c00h
int 21h

.stack 100h
end start

效果验证

调整后,无论输入0到30个字符,输出都能与输入完全一致,不会出现乱码问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:55:23