C语言反汇编问题

2020-02-04 09:34发布

一段纯延时的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,这是何意?实在不理解。 求高手指点,不胜感激。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
lcofjp
1楼-- · 2020-02-04 10:09
带#号的是立即数吧,跟P0内容没啥关系,相当于MOV A, #0x80吧,不玩51,随便发表下评论。
huststi
2楼-- · 2020-02-04 13:48
回复【1楼】lcofjp  卡尔夫
-----------------------------------------------------------------------
多谢指点!是这么回事!这编译器干嘛不直接写#0x80呢?因为0x80跟P0口地址重复了,就顺便用#P0表示了?
gongnn
3楼-- · 2020-02-04 16:59
回复【2楼】huststi 亮子
-----------------------------------------------------------------------

是反编译器干的。
pjx001
4楼-- · 2020-02-04 19:49
 精彩回答 2  元偷偷看……
294689006
5楼-- · 2020-02-04 22:34
......
konew
6楼-- · 2020-02-04 23:43
P0口的特殊功能寄存器地址就是(0x80),for循环的语言好像都是用那个寄存器地址保存for循环的次数的。可能是一种c语言实现方式吧

一周热门 更多>