为何未分支到标签时,6502汇编标签下的代码仍会执行?
6502汇编:BCS未跳转却执行标签后代码的问题
先看你的代码:
LDA #$FA ADC #$01 BCS OverflowOccurred LDA #$AA OverflowOccurred: LDA #$99
为什么没跳转还是执行了LDA #$99?
这是因为6502 CPU是顺序执行指令的,标签OverflowOccurred:只是给汇编器用的地址标记——它不是能阻止CPU执行的指令,只是告诉汇编器“这个内存地址叫这个名字”。
当BCS因为进位标志没置位而不跳转时,CPU会执行完LDA #$AA,然后继续按内存地址往下读指令,自然就跑到了OverflowOccurred:下面的LDA #$99,把A寄存器的值改成了$99。
BRK的作用是什么?
BRK是6502的中断指令,它会让CPU立刻停止当前的程序执行流程。所以你加了BRK之后,CPU执行完LDA #$AA就触发中断停住了,不会再去执行后面的LDA #$99,A的值自然就是$AA了。
BRK是必须的吗?
不是必须的。你只需要在执行完目标代码后,阻断CPU的顺序执行就行。比如可以在LDA #$AA后面加一条无条件跳转指令,跳到程序的终止点:
LDA #$FA ADC #$01 BCS OverflowOccurred LDA #$AA JMP ProgramEnd ; 跳转到终止点 OverflowOccurred: LDA #$99 ProgramEnd: BRK ; 终止程序
或者如果这就是程序的最后一段逻辑,BRK是一种简单的终止方式,但核心是要避免CPU继续跑到你不想执行的代码段里。
内容的提问来源于stack exchange,提问作者Federico Egidi
相关产品推荐
相关产品推荐

