汇编程序输入29字符输出异常问题排查请求
汇编代码输入29字符输出异常的排查与解决
问题根源
- 栈空间不足:代码中
.stack 10仅分配10字节栈空间,DOS的int 21h中断调用需要保存寄存器、执行内部逻辑,栈空间过小会触发栈溢出,破坏数据段中inputmsg末尾的$结束符,导致输出时无法正常终止,出现乱码。输入29字符时,数据段占用更接近栈溢出临界值,问题直接暴露。 - 未强制添加字符串结束符:虽然初始化时给
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
相关产品推荐
相关产品推荐

