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

使用x86 BIOS中断实现回车终止输入时第6个字符报错问题

问题分析与修复

你的代码核心问题是栈操作不平衡,导致程序执行到ret时跳转到错误地址,表现为输入第6个字符时异常。

错误点拆解

  • 开头冗余的push dx:连续执行push dx、push bx、push dx,多push了一次dx,后续无对应pop操作平衡栈。
  • 栈未恢复:程序结束前未弹出之前入栈的寄存器,ret指令取出的不是正确返回地址,而是栈中残留的dx值,进而引发错误。

修正后的代码

push dx
push bx
mov bx, dx          ; bx指向输入缓冲区起始地址
inputBuffer:
    mov ah, 0
    int 0x16         ; 调用BIOS键盘中断读取字符
    cmp al, 13       ; 判断是否按下回车键(ASCII 13)
    je exit
    mov [bx], al     ; 存储输入字符到缓冲区
    inc bx
    jmp inputBuffer
exit:
; 给字符串添加结束符
mov byte ptr [bx], 0
; 打印字符串
mov ah, 0x0e         ; BIOS teletype输出功能
mov bx, dx
printString:
    mov al, [bx]
    cmp al, 0
    je endString
    int 0x10         ; 调用BIOS视频中断输出字符
    inc bx
    jmp printString
endString:
pop bx               ; 恢复bx寄存器
pop dx               ; 恢复dx寄存器
ret

额外建议

如果需要避免缓冲区溢出,可以在inc bx后添加边界检查:

cmp bx, dx + MAX_BUFFER_SIZE  ; MAX_BUFFER_SIZE为你定义的缓冲区最大长度
je inputBuffer                ; 超过长度则忽略当前输入

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:22:41