微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于C51的汇编问题

关于C51的汇编问题

时间:10-02 整理:3721RD 点击:
以下说的都是与C51相关的:
我有个C文件(a.c),我用keil编译它,烧进单片机,他是能够正常执行的。然后我用反汇编工具得到c文件对应的汇编文件a.asm,这个汇编文件跟 我调试a.c程序时的汇编窗口内容一样(keil调试C程序时,会弹出一个汇编窗口的),我再用keil编译它,结果有错误:Temp.asm(1509): error A45: UNDEFINED SYMBOL (PASS-2)
我上网查过它的含义:意思是我跳转的地方不存在。我查了一下,确实不存在。
出错语句(蓝色字体):
Q0C02:             MOV   @R0,A                        ;0C02   F6
                   DJNZ  R0,Q0C02                     ;0C03   D8 FD
                   MOV   SP,#23H                      ;0C05   75 81 23
                   LJMP  Q0C46                        ;0C08   02 0C 46
;==========================================================================
Q0C0B:             LJMP  Q0EF7                        ;0C0B   02 0E F7
;==========================================================================
Q0C0E:             CLR   A                            ;0C0E   E4

....
                        LJMP  Q0C0A                        ;0F0D   02 0C 0A
但是调试C程序,汇编窗口也有这一句汇编(蓝色字体):
C:0x0F04    AF19     MOV      R7,0x19
C:0x0F06    AE18     MOV      R6,Temputer(0x18)
C:0x0F08    120C8B   LCALL    deal(C:0C8B)
   161:         }
C:0x0F0B    80EA     SJMP     main(C:0EF7)
C:0x0F0D    020C0A   LJMP     C:0C0A

为什么C语言能通过编译
下面为调试C程序图片:



这个没法解决,你只能从这个字节开始人工进行反汇编,而且还不能确定反汇编的结果是对的,有时根据编译的算法编译后,再反汇编,甚至会出现奇怪的运行过程,还不如直接写汇编程序,而且反汇编的程序仍遵循C的规则,所以会有冗余的代码,你会在饶了一圈之后才发现三、五行的反汇编程序实际可以用1、2行就写完了。

C 变成反汇编,应该有一些编译器自己定义的东西,如果你直接复制成汇编,再编译肯定有一些不一样的地方,因为编译器对C的编译和汇编的编译肯定有一些不一样的地方 !

这个跟编译器的编译原理和方式有关,如果你用常规反汇编的方式,你会发现跳转的位置其实是另一条指令的其中一个字节,所以如果你是查看其中一部分程序功能的话,可以用反汇编,如果想查看整个程序的话,反汇编就没太大意义了

先说下我反汇编整个程序的原因。
我现在在做课设,规定要用汇编写代码。我想用C写代码,编译出可执行文件后,反汇编得到汇编代码。
我现在遇到的问题 , 就是跳转的位置是另一条指令的其中一个字节。如何解决这问题。

其实用C会不会比汇编好

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top