C语言代码
stmt level Source
1 int *p1; /*一般指针(3字节)*/
2 int xdata*p1; /*xdata指针(2字节)*/
3 int idata*p1; /*idata指针(1字节)*/
4 int code*p1; /*code指针(2字节)*/
void pconver(void) {
p1=p2; /*xdata指针到一般指针 第7行*/
p1=p3; /*idata指针到一般指针 第8行*/
p1=p4; /*code指针到一般指针 第9行*/
p4=p1; /*一般指针到code指针 第11行*/
p3=p1; /*一般指针到idata指针 第12行*/
p2=p1; /*一般指针到xdata指针 第13行*/
}
汇编结果代码(翻译成汇编代码)如下:
Function pconvert(BEGIN)
;第7行
MOV P1,#01H
MOV P1+01H,P2
MOV P1+02H,P2+01H
;第8行
MOV P1,#00H
MOV P1+01H,#00H
MOV P1+02H,P3
;第9行
MOV R3,#0FFH
MOV R2,P4
MOV R1,p4+01H
MOV p1,R3
MOV p1+01H,R2
MOV p1+02H,R1
;第11行
MOV R6,AR2
MOV R7,AR1
MOV p4,R6
MOV P4+01H,R7
;第12行
MOV R7,AR1
MOV p3,R7
;第13行
MOV R6,AR2
MOV p2,R6
MOV p2+01H,R7
;FUNCTION pconver(END)
问题就在13行的R7并没有指针传入
那么这句话MOV p2+01H,R7怎么可以直接这样写,而不是签名前面加一句话:
MOV R7,AR1
MOV p2+01H,R7
请热心人帮忙解疑,谢谢!
注:以上内容来自《单片机C语言Windows环境编程宝典》一书的268-270页,有删节
------解决方案--------------------
也许是编译器优化了...
因为R7的内容没有改变...
------解决方案--------------------
;第12行
MOV R7,AR1
已经有了,后面也没改变
好好学习汇编!!!
------解决方案--------------------
让LZ看看我的这个KEIL的版本的编译后的情况,看来LZ是不信是优化的结果
好像这个更加猛,呵呵
源码:
void pointerCover()
{
int *pointerGeneration; /*一般指针(3字节)*/
int xdata *pointerXdata; /*xdata指针(2字节)*/
int idata *pointerIdata; /*idata指针(1字节)*/
int code *pointerCode; /*code指针(2字节)*/
pointerGeneration = pointerXdata;
pointerGeneration = pointerIdata;
pointerGeneration = pointerCode;
pointerXdata = pointerGeneration;
pointerIdata = pointerGeneration;
pointerCode = pointerGeneration;
}
int main()
{
pointerCover();
}
生成代码:
C:0x0000 020016 LJMP STARTUP1(C:0016)
2: {
3:
4: int *pointerGeneration; /*一般指针(3字节)*/
5: int xdata *pointerXdata; /*xdata指针(2字节)*/
6: int idata *pointerIdata; /*idata指针(1字节)*/
7: int code *pointerCode; /*code指针(2字节)*/
8:
9: pointerGeneration = pointerXdata;
10: pointerGeneration = pointerIdata;
11: pointerGeneration = pointerCode;
12:
C:0x0003 AA0B MOV R2,0x0B
C:0x0005 A90C MOV R1,0x0C
13: pointerXdata = pointerGeneration;
C:0x0007 AE02 MOV R6,0x02
C:0x0009 AF01 MOV R7,0x01
C:0x000B 8E08 MOV 0x08,R6
C:0x000D 8F09 MOV 0x09,R7
14: pointerIdata = pointerGeneration;
C:0x000F 8F0A MOV 0x0A,R7
15: pointerCode = pointerGeneration;
C:0x0011 8E0B MOV 0x0B,R6
C:0x0013 8F0C MOV 0x0C,R7
16: }
17:
C:0x0015 22 RET
99: MOV R0,#IDATALEN - 1
C:0x0016 787F MOV R0,#0x7F
100: CLR A
C:0x0018 E4 CLR A
101: IDATALOOP: MOV @R0,A
C:0x0019 F6 MOV @R0,A