keil c51 汇编程序调试有的指令不能执行

供稿:hz-xin.com     日期:2025-01-13
我用keil进行调试时,程序总是自汇编的一段程序里反复执行,无法跳到main函数,请问一下大家怎么解决

1. 正式产品的C51程序应该是一个死循环。如果不是死循环,执行完main后,执行RET,将会将堆栈里的数据当做地址压入PC,程序跑错。最后会回到地址0000H,重新开始,进入main。你仿真在00H做中断,就会发现他回去了。
2. 你说的不清楚,跳转还是会跳转的。程序运行结果正确就说明没有错。除非你程序错误。如果你是在仿真时看到没有跳转,还是在那一行,那是他还有数据要处理,看汇编就知道了。

可能是优化导致程序的运行过程与你的源代码并不能严格对应。
你可以查看生成的汇编,应当是符合你的预期流程的,只不过编译器自动将一些可以合并的代码段合并了。例如你每个函数中都有完全相同的代码块,这正是优化大显身手的机会。
代码级的调试应当以看汇编为主、源码为辅。

C语言会被优化掉一些代码,汇编没有用过,但我判断不大可能,汇编好像是没有优化处理的。你光标在MOV R0,#00H的上一行是PC值是多少?跳过不跳过时相同吗,如果相同不可跳过,PC值怎么会突变的?如果不同就是被优化了,你调出Disassemble窗口就知道有没有被优化掉了。

看不到图。我是说MOV R0,#00H上一行肯定不是跳转指令,PC值怎么会变,PC值不变肯定会连续执行了。能发到我邮箱不?t_cl@sohu.com.
还有一点,如果你修改了程序,没有重新编译,进入调试窗口将执行以前的代码。如果整行的增加或减少很容易发现,如果你在一行后面增加删减,不注意不好发现的。

肯定是你的PC值被改变了
要不就是你的程序逻辑错误
汇编是不会被KEIL C51优化的,它是最贴近机器的语言。
你再看看你的程序逻辑。

c和汇编的混合编程没做过
但对于th0、tl0、p1.0这些,你可以是直接用绝对地址代替它们试试