汇编语言中CMP语句与用户输入分支执行异常问题咨询
问题根源
你的汇编代码之所以不管输入值是什么,都会执行第一个分支甚至连带运行后续分支,核心是两个问题:
- 分支未添加终止跳转:每个分支执行完毕后没有跳转指令,CPU会自动按内存顺序向下执行。比如跳转到
_redLight完成操作后,会直接进入_greenLight的代码块,接着再执行_offLight的逻辑。 - 无无效输入处理:如果输入值不是1、2、3,三次
cmp都不会触发beq跳转,程序会直接从cmp之后顺次进入_redLight分支,完全没有被拦截。
修复后的代码
给每个分支添加跳转指令,确保执行完当前分支后回到输入判断的起点,同时补上无效输入的处理逻辑:
loop_start: bl _inputFunc cmp r1, #1 beq _redLight cmp r1, #2 beq _greenLight cmp r1, #3 beq _offLight ; 输入不是1/2/3,直接回到输入步骤 b loop_start _redLight: GPIOWrite pin17, high bl _inputFunc b loop_start ; 完成操作后跳回判断入口 _greenLight: GPIOWrite pin18, high bl _inputFunc b loop_start ; 完成操作后跳回判断入口 _offLight: GPIOWrite pin17, low GPIOWrite pin18, low bl _inputFunc b loop_start ; 完成操作后跳回判断入口
关键修改说明
- 新增
loop_start标签作为循环入口,确保每次操作完成后都能重新获取输入并执行判断 - 每个分支末尾添加
b loop_start,强制跳回循环入口,彻底避免CPU顺次执行后续分支 - 补充无效输入的处理逻辑,防止输入不符合要求时直接进入
_redLight分支
额外提示:如果你的需求是一次输入对应一次操作,分支内的bl _inputFunc属于重复调用——可以将输入函数只放在loop_start开头,分支内完成灯光操作后直接跳回loop_start即可。
内容的提问来源于stack exchange,提问作者Joy Cheng
相关产品推荐
相关产品推荐

