接着上一小节的内容,我们继续讨论一下地址传递,这个在谭浩强的书中介绍的比较详细。请大家参考一下。如果觉得有必要,仔细揣摩一下。其实非常简单。谭浩强的书我已经找不到了。但是代码可以复述一下。
void swap(unsigned char *pA,unsigned char *pB)
{
   volatile unsigned char c;
  c=*pA;
  *pA=*pB;
  *pB=c;
} 
int main(void)
{
   volatile unsigned char x,y;
x=100;
    y=200;
   swap(&x,&y); 
   return 0;
}
swap(unsigned char *pA,unsigned char *pB) 函数通过pA、pB接收了x,y的地址。根据交换&x、&y地址中的值实现了x、y的值的交换。我们看看这段代码的目标程序。
C:0x0003  BB0106  CJNE   R3,#0x01,C:000C //R3寄存器的值不等于0x01跳转,C:000C行
C:0x0006  8982   MOV   DPL(0x82),R1      //R1的值移到DPL寄存器中
C:0x0008  8A83   MOV   DPH(0x83),R2      //R2的值移到DPH寄存器中
C:0x000A  E0    MOVX   A,@DPTR          //把DPH地址中的值存储到A寄存器中
C:0x000B  22    RET          
C:0x000C  5002   JNC   C:0010         // CY寄存器为1则转移C0010    
C:0x000E  E7    MOV   A,@R1          //R1值地址的内容移入A
C:0x000F  22    RET   
C:0x0010  BBFE02  CJNE   R3,#0xFE,C:0015 //R3寄存器的值是否为0xFE,是转移至C:0015
C:0x0013  E3    MOVX   A,@R1           //R1值地址的内容移入A
C:0x0014  22    RET   
C:0x0015  8982   MOV   DPL(0x82),R1
C:0x0017  8A83   MOV   DPH(0x83),R2
C:0x0019  E4    CLR   A
C:0x001A  93    MOVC   A,@A+DPTR
C:0x001B  22    RET   
        C?CSTPTR:
C:0x001C  BB0106  CJNE   R3,#0x01,C:0025
C:0x001F  8982   MOV   DPL(0x82),R1
C:0x0021  8A83   MOV   DPH(0x83),R2
C:0x0023  F0    MOVX   @DPTR,A
C:0x0024  22    RET   
C:0x0025  5002   JNC   C:0029
C:0x0027  F7    MOV   @R1,A
C:0x0028  22    RET   
C:0x0029  BBFE01  CJNE   R3,#0xFE,C:002D
C:0x002C  F3    MOVX   @R1,A
C:0x002D  22    RET   
 
 
3: void swap(unsigned char *pA,unsigned char *pB)
C:0x002E  8B0A   MOV   0x0A,R3   //R3中的值移到0x0A地址中,(0x0A地址中的值是0x00)
C:0x0030  8A0B   MOV   0x0B,R2   //R2中的值移到0x0B地址中,(0x0B地址中的值是0x00)
C:0x0032  890C   MOV   0x0C,R1  //R1中的值移到0x0C地址中,(0x0C地址中的值是0x08)
  4: {
  5: 
  6:  volatile unsigned char c;
  7: 
  8:  c=*pA;
C:0x0034  120003  LCALL  C?CLDPTR(C:0003) //程序跳转至0003行
C:0x0037  F510   MOV   0x10,A                //A寄存器的值移到0x10地址
  9:  *pA=*pB;
C:0x0039  AB0D   MOV   R3,0x0D          //
C:0x003B  AA0E   MOV   R2,0x0E
C:0x003D  A90F   MOV   R1,0x0F
C:0x003F  120003  LCALL  C?CLDPTR(C:0003)
C:0x0042  AB0A   MOV   R3,0x0A
C:0x0044  AA0B   MOV   R2,0x0B
C:0x0046  A90C   MOV   R1,0x0C
C:0x0048  12001C  LCALL  C?CSTPTR(C:001C)
  10:  *pB=c;
  11:     
  12: } 
  13: 
C:0x004B  AB0D   MOV   R3,0x0D
C:0x004D  AA0E   MOV   R2,0x0E
C:0x004F  A90F   MOV   R1,0x0F
C:0x0051  E510   MOV   A,0x10
C:0x0053  02001C  LJMP   C?CSTPTR(C:001C)
  14: int main(void)
  15: {
  16:  volatile unsigned char x,y;
  17: 
  18:     x=100;
C:0x0056  750864  MOV   0x08,#0x64  //立即数100值移到0x08地址
  19:     y=200;
  20: 
  21: 
C:0x0059  7509C8  MOV   0x09,#T2CON(0xC8)  //立即数200值移到0x09地址
  22:  swap(&x,&y); 
  23: 
C:0x005C  7909   MOV   R1,#0x09     //立即数0x09值移到R1寄存器中
C:0x005E  750D00  MOV   0x0D,#0x00 //立即数0x00值移到地址0x0D中
C:0x0061  750E00  MOV   0x0E,#0x00 //立即数0x00值移到地址0x0E中
C:0x0064  750F09  MOV   0x0F,#0x09  //立即数0x09值移到0x0F中
C:0x0067  7B00   MOV   R3,#0x00    //立即数0x00值移到R3寄存器中
C:0x0069  7A00   MOV   R2,#0x00    //立即数0x00值移到R2寄存器中
C:0x006B  19    DEC   R1           //R1值减少1(中的值是0x08)
C:0x006C  12002E  LCALL  swap(C:002E) //调用swap函数,程序转向002E行
  24:  return 0;
   以上机器代码比较复杂,理解起来可能会困难,但是要完全理解也是没不要的。大家只要注意到main函数将在调用swap函数之前,将x,y地址存储到了RX寄存器中了。在以后章节中不会在介绍机器码。直接介绍C的使用方法!