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,这是何意?实在不理解。 求高手指点,不胜感激。 带#号的是立即数吧,跟P0内容没啥关系,相当于MOV A, #0x80吧,不玩51,随便发表下评论。 回复【1楼】lcofjp卡尔夫
-----------------------------------------------------------------------
多谢指点!是这么回事!这编译器干嘛不直接写#0x80呢?因为0x80跟P0口地址重复了,就顺便用#P0表示了? 回复【2楼】huststi 亮子
-----------------------------------------------------------------------
是反编译器干的。 记号 ...... P0口的特殊功能寄存器地址就是(0x80),for循环的语言好像都是用那个寄存器地址保存for循环的次数的。可能是一种c语言实现方式吧 P0 在51里面貌似就是80H 80H以上必须要间接
页:
[1]