huststi 发表于 2012-2-12 14:47:18

C语言反汇编问题

一段纯延时的C程序,KEIL编译后,查看汇编窗口,发现P0口参与了运算,百思不解,贴出来求大家赐教:
    17: void delay(unsigned char x)      
    18: {
    19:         int i,j;
    20:         for(i=0;i<x;i++)
C:0x0E30    E4       CLR      A
C:0x0E31    FD       MOV      R5,A
C:0x0E32    FC       MOV      R4,A
C:0x0E33    EF       MOV      A,R7
C:0x0E34    FB       MOV      R3,A
C:0x0E35    C3       CLR      C
C:0x0E36    ED       MOV      A,R5
C:0x0E37    9B       SUBB   A,R3
C:0x0E38    7480   MOV      A,#P0(0x80)
C:0x0E3A    F8       MOV      R0,A
C:0x0E3B    6C       XRL      A,R4
C:0x0E3C    98       SUBB   A,R0
C:0x0E3D    5015   JNC      C:0E54
    21:         {
    22:               for(j=0;j<110;j++);      
C:0x0E3F    E4       CLR      A
C:0x0E40    FB       MOV      R3,A
C:0x0E41    FA       MOV      R2,A
C:0x0E42    0B       INC      R3
C:0x0E43    BB0001   CJNE   R3,#0x00,C:0E47
C:0x0E46    0A       INC      R2
C:0x0E47    EB       MOV      A,R3
C:0x0E48    646E   XRL      A,#0x6E
C:0x0E4A    4A       ORL      A,R2
C:0x0E4B    70F5   JNZ      C:0E42
    23:         }
C:0x0E4D    0D       INC      R5
C:0x0E4E    BD0001   CJNE   R5,#0x00,C:0E52
C:0x0E51    0C       INC      R4
C:0x0E52    80DF   SJMP   C:0E33
    24: }
    25:
C:0x0E54    22       RET   

其中C:0x0E38    7480   MOV      A,#P0(0x80) 这一行,读取P0口状态到ACC,这是何意?实在不理解。 求高手指点,不胜感激。

lcofjp 发表于 2012-2-12 14:56:38

带#号的是立即数吧,跟P0内容没啥关系,相当于MOV A, #0x80吧,不玩51,随便发表下评论。

huststi 发表于 2012-2-12 15:03:49

回复【1楼】lcofjp卡尔夫
-----------------------------------------------------------------------
多谢指点!是这么回事!这编译器干嘛不直接写#0x80呢?因为0x80跟P0口地址重复了,就顺便用#P0表示了?

gongnn 发表于 2012-2-12 15:46:45

回复【2楼】huststi 亮子
-----------------------------------------------------------------------

是反编译器干的。

pjx001 发表于 2012-2-12 20:19:45

记号

294689006 发表于 2012-2-15 17:33:39

......

konew 发表于 2012-2-15 22:57:20

P0口的特殊功能寄存器地址就是(0x80),for循环的语言好像都是用那个寄存器地址保存for循环的次数的。可能是一种c语言实现方式吧

INT0 发表于 2012-2-26 13:45:47

P0 在51里面貌似就是80H 80H以上必须要间接
页: [1]
查看完整版本: C语言反汇编问题