关于C51的汇编问题

2019-07-15 10:42发布

以下说的都是与C51相关的:
我有个C文件(a.c),我用keil编译它,烧进单片机,他是能够正常执行的。然后我用反汇编工具得到c文件对应的汇编文件a.asm,这个汇编文件跟 我调试a.c程序时的汇编窗口内容一样(keil调试C程序时,会弹出一个汇编窗口的),我再用keil编译它,结果有错误:Temp.asm(1509): error A45: UNDEFINED SYMBOL (PASS-2)
我上网查过它的含义:意思是我跳转的地方不存在。我查了一下,确实不存在。
出错语句(蓝 {MOD}字体):

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程序,汇编窗口也有这一句汇编(蓝 {MOD}字体):
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程序图片:
5%GQR9MVH]3PU[$S_KK(OGK.png


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
人中狼
1楼-- · 2019-07-15 17:36
这个跟编译器的编译原理和方式有关,如果你用常规反汇编的方式,你会发现跳转的位置其实是另一条指令的其中一个字节,所以如果你是查看其中一部分程序功能的话,可以用反汇编,如果想查看整个程序的话,反汇编就没太大意义了

评分

参与人数 1积分 +5 收起 理由 ElecFans王岑 + 5

查看全部评分

906073882
2楼-- · 2019-07-15 19:51
人中狼 发表于 2017-5-23 09:48
这个跟编译器的编译原理和方式有关,如果你用常规反汇编的方式,你会发现跳转的位置其实是另一条指令的其中一个字节,所以如果你是查看其中一部分程序功能的话,可以用反汇编,如果想查看整个程序的话,反汇编就没太大意义了  ...

先说下我反汇编整个程序的原因。
我现在在做课设,规定要用汇编写代码。我想用C写代码,编译出可执行文件后,反汇编得到汇编代码。
我现在遇到的问题 , 就是跳转的位置是另一条指令的其中一个字节。如何解决这问题。
吴浩漳
3楼-- · 2019-07-15 23:46
 精彩回答 2  元偷偷看……

一周热门 更多>