当前位置: 代码迷 >> 单片机 >> 指针类型转换解决思路
  详细解决方案

指针类型转换解决思路

热度:70   发布时间:2016-04-28 16:11:24.0
指针类型转换
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
  相关解决方案