使用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
相关产品推荐
相关产品推荐

