关于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文件(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会不会比汇编好