为什么我用keil仿真时,每次单步执行都跳出反汇编窗口?谢谢

为什么我用keil仿真时,每次单步执行都跳出反汇编窗口?谢谢,第1张

楼上的说得太简单了,我来补充一下吧。
1)、先用keil打开一个用C语言编写的工程文件(一定要是C写的);
2)、转到仿真模式(CTRL+F5),将程序窗口缩小点(这步很关键),就是按右上角的那个象麻将里的白板的那个(不是KEIL软件窗口喔!!),然后就按一下F10或F11,会马上看到反汇编窗跳出,把程序窗口和反汇编窗口分开一点,以便能同时看到两个窗口;
3)、再继续按F10或F11运行时你会看到箭头会在两窗口内同向下运行,(看到这样的情况就接近成功了!)
4)、现在关掉反汇编窗口(这个最要命),就是按该窗口右上角的X;
5)、程序窗口就变成当前窗口了,再继续按F10或F11运行试试……………… ;
6)、OK了吧!^&^

同时打开源程序窗口和反汇编窗口,的箭头会同时显示在两个窗口中。不存在只在反汇编窗口中显示。或者关闭反汇编窗口,箭头就只在源程序窗口中显示了。
但是,如果程序中用到了库文件,没有对应的源程序,则只能在反汇编窗口中出现。

你理解的不对,反汇编是指将非汇编目标代码转变成汇编的过程
你所看到的反汇编代码,其实是由C编译器将C语言代码直接编译成汇编代码的,并非由机器码反汇编成汇编
这样做在调试阶段有非常大的意义,比如你写的代码,语法上一点错误都没有,但是逻辑上有了错误,往往你要找到这个逻辑错误是很难的,这时候在调试的时候单步执行反汇编代码就变的很有意义了,给你举个例子:将变量十进制码转成16进制,十进制码放在变量tmp中,如果代码这样写:
d=(tmp>>4)10+tmp&0x0F;
假如你输入tmp变量存储的是十进制的23(存储为0x23),然后使用上句准换为16进制,那么d应该等于0x17,但实际上代码的结果却是0x07,原因就是虽然上句代码语法上没有错误,但是逻辑上有错,运算符'+'的优先级是大于运算符'&'的,这就造成了运算结果出错,结合反汇编代码可以很容易查出这类错误
反汇编和C代码中都可以设置断点,但调试反汇编可以获得更高的精度,因为一句C代码可能有数十条汇编代码组成,在C代码单步执行一次,可能执行了十几条汇编代码,而在反汇编界面单步调试,每次只执行一句汇编代码

应用平台是keil的话
直接代开存储器
从首地址开始一句一句地写出你的汇编代码
因为本身指令助记符是有规定的
你得去参照书本
结合汇编指令占用字节数
以及指令助记符
*** 作数等
你就可以得出你之前的汇编程序
这个比较麻烦
不过都读懂后
可以加深理解
好好努力

不知道你所谓的“机器代码”是指汇编还是指二进制。
如果是指汇编,那么如果勾选了在List输出反汇编的话,在输出的LST文件中可以查看汇编代码;
如果是指二进制,那么比较简单,直接用文本编辑器查看输出的hex文件即可。

程序调试常用窗口
KEIL软件在调试程序时提供了多个窗口,主要包括输出窗口(Outputwindows)、查看和呼叫堆栈窗口(串口调试助手21Watch&Callstackwindows)、存储器窗口(memoryWindows)、反汇编窗口(Dissamblywindows)和串行窗口(serialwindows)等。进入调试模式后,可以通过菜单“VIEW(查看)”下的相应命令打开或关闭这些窗口

Keil uvision4支持调试时反汇编窗口和源代码窗口同时显示在主窗口中。在调试过程中,**箭头在源代码窗口中指向当前执行的语句,在反汇编窗口中指向当前执行的汇编指令,1条语句可以表示为多条反汇编代码。
所以,显示**箭头只需要在工具栏选择**箭头标识按钮即可。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13360344.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-21
下一篇 2023-07-21

发表评论

登录后才能评论

评论列表(0条)

保存