关于指针5-地址的传递

来源:本站
导读:目前正在解读《关于指针5-地址的传递》的相关信息,《关于指针5-地址的传递》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《关于指针5-地址的传递》的详细说明。
简介: 接着上一小节的内容,我们继续讨论一下地址传递,这个在谭浩强的书中介绍的比较详细

接着上一小节的内容,我们继续讨论一下地址传递,这个在谭浩强的书中介绍的比较详细。请大家参考一下。如果觉得有必要,仔细揣摩一下。其实非常简单。谭浩强的书我已经找不到了。但是代码可以复述一下。

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值地址的内容移入AC:0x000F 22 RET C:0x0010 BBFE02 CJNE R3,#0xFE,C:0015 //R3寄存器的值是否为0xFE,是转移至C:0015C:0x0013 E3 MOVX A,@R1 //R1值地址的内容移入AC:0x0014 22 RET C:0x0015 8982 MOV DPL(0x82),R1C:0x0017 8A83 MOV DPH(0x83),R2C:0x0019 E4 CLR AC:0x001A 93 MOVC A,@A+DPTRC:0x001B 22 RET C?CSTPTR:C:0x001C BB0106 CJNE R3,#0x01,C:0025C:0x001F 8982 MOV DPL(0x82),R1C:0x0021 8A83 MOV DPH(0x83),R2C:0x0023 F0 MOVX @DPTR,AC:0x0024 22 RET C:0x0025 5002 JNC C:0029C:0x0027 F7 MOV @R1,AC:0x0028 22 RET C:0x0029 BBFE01 CJNE R3,#0xFE,C:002DC:0x002C F3 MOVX @R1,AC: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,0x0EC:0x003D A90F MOV R1,0x0FC:0x003F 120003 LCALL C?CLDPTR(C:0003)C:0x0042 AB0A MOV R3,0x0AC:0x0044 AA0B MOV R2,0x0BC:0x0046 A90C MOV R1,0x0CC:0x0048 12001C LCALL C?CSTPTR(C:001C) 10: *pB=c; 11: 12: } 13: C:0x004B AB0D MOV R3,0x0DC:0x004D AA0E MOV R2,0x0EC:0x004F A90F MOV R1,0x0FC:0x0051 E510 MOV A,0x10C: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的使用方法!

提醒:《关于指针5-地址的传递》最后刷新时间 2024-03-14 01:04:13,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《关于指针5-地址的传递》该内容的真实性请自行鉴别。