LC3模拟器加载更新文件后仍显示旧指令,排查发现未汇编新代码
LC3模拟器调试踩坑:修改指令后不生效的低级错误
最近在LC3模拟器上调试代码时踩了个特别容易疏忽的低级坑,分享出来给各位同好避避坑:
问题背景
我需要用TRAP x22陷阱指令打印字符串,而这个指令要求字符串的起始地址必须存在R0寄存器中。但一开始我写错了指令:
LEA R2, ZSTR
发现问题后,我找到代码里的ZERO CASE INSTRUCTIONS区块,把指令修正为正确的版本:
LEA R0, ZSTR
诡异的现象
我保存了项目文件,然后加载更新后的文件并重启了模拟器,结果运行时发现代码依然在执行旧的LEA R2, ZSTR指令,修改完全没生效!
排查与解决
折腾了好一会儿才反应过来——我犯了一个超基础的错误:只保存了源文件,却没有重新汇编代码!
LC3模拟器实际执行的是汇编后的机器码文件,仅仅修改源文件而不重新汇编的话,模拟器读取的还是之前生成的旧机器码,自然不会有任何变化。重新执行汇编操作后再加载文件,新的LEA R0, ZSTR指令就正常生效了,TRAP x22也能通过R0正确打印字符串了。
总结
这是个典型的"当局者迷"的低级错误:在汇编语言开发场景下,修改源文件后一定要重新生成对应的机器码文件,否则模拟器或处理器执行的始终是旧版本的代码,你的修改根本不会被生效。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

