x86汇编实现冒泡排序程序输入后卡住故障排查求助
代码问题点梳理
- 核心死循环原因1:
INPUT输入循环使用LOOP指令执行完毕后,CX寄存器的值已经被递减为0。输入完成后你直接执行MOV BX,CX,会把BX赋值为0,紧接着执行DEC BX会让BX变为0FFFFH,后续冒泡排序的外层循环NXTPASS会拿到一个超大的循环计数,直接进入死循环,这就是程序卡住的根本原因。你应该从存储元素个数的变量N中取值赋值给BX,而不是用已经清零的CX。 - 核心死循环原因2:排序完成后输出结果的环节,你再次执行
MOV BX,CX,此时排序结束后CX的值已经是0,赋值给BX后执行DEC BX又会变为0FFFFH,输出环节也会进入死循环。这里也应该从变量N中读取数组长度赋值给BX。 - 冗余逻辑:
.STARTUP伪指令已经自动完成了DS段寄存器的初始化,你在输入完成后额外添加的MOV AX,@DATA、MOV DS,AX属于冗余代码,虽然不致命但属于多余操作。 - 输入输出逻辑不匹配:你在输入元素时添加了大于
09H就减07H的逻辑,这是适配十六进制输入的转换逻辑,但你输出时直接给数值加'0'转字符,仅支持0-9的十进制数输出,二者逻辑不匹配。如果你的程序定位为仅输入0-9的十进制数,可以直接删掉这段十六进制转换逻辑,避免输入非数字字符时出现异常输出。
核心修复代码
修改三处赋值逻辑即可解决卡死问题:
- 输入完成后给
BX赋值的代码替换为:
MOV BL,N MOV BH,0 DEC BX
- 输出前给
BX赋值的代码替换为:
MOV BL,N MOV BH,0 MOV SI,00H
- 删除冗余的
MOV AX,@DATA、MOV DS,AX两行代码。
内容的提问来源于stack exchange,提问作者Sharvansh Shukla
相关产品推荐
相关产品推荐

