|
本帖最后由 slzm40 于 2014-5-11 16:53 编辑
先前在人家C语言上看到代码.很是不理解,下面是人家的原源码的部份.是关于结构体,它定义一结构构如下
这里说明下.uint是无符号16位.uchar无符号8位
我的目的是要在每一次循环把结构体里的变量减1(当变量不为0时)
- typedef struct {
- uint tmledval;
- uint tmkeysrval;
- uint tmled1sval;
- uint tmscreemval;
- uint tmalarmval;
- uint tmtempval;
- } Soft_Timer;
复制代码
又定义结构体变量
下面为代码1式(这个是原源码写的)
- void tmcontrol()
- {
- uchar *p;
- for(p=(uchar *)&TM;p<(uchar *)((uchar *)&TM+sizeof(TM));p++)
- { if (*p>0) (*p)--; }
- }
复制代码
下面为代码2式(这个是我为了测试改的)
- void tmcontrol()
- {
- uint *p;
- for(p=(unsigned int*)&TM;p<(unsigned int *)((unsigned int*)&TM+sizeof(TM));p++)
- { if (*p>0) (*p)--; }
- }
- }
复制代码
在1式中,对于指针uchar *p表式不理解,在for循环里,这P++每次只对地址加1运算.但是我看结构体里是uint型的.总觉得不对. 于是我改了2式. 这个原源码人家用了很久了..也不会有什么错.有高人出来解答下疑惑.
于是我在汇编里面看汇编原码.可以看下.
原源码1式汇编
- 35: for(p=((uchar *)&TM;p<((uchar *)(((uchar *)&TM+sizeof(TM));p++)
- //这里是p=((uchar *)&TM
- C:0x0FFE 753B00 MOV 0x3B,#0x00
- C:0x1001 753C00 MOV 0x3C,#0x00
- C:0x1004 753D4B MOV 0x3D,#TM(0x4B)
- //这里是p<((uchar *)(((uchar *)&TM+sizeof(TM))
- C:0x1007 C3 CLR C
- C:0x1008 900057 MOV DPTR,#IRcount(0x0057)
- C:0x100B E53D MOV A,0x3D
- C:0x100D 9582 SUBB A,DPL(0x82)
- C:0x100F E53C MOV A,0x3C
- C:0x1011 9583 SUBB A,DPH(0x83)
- C:0x1013 5020 JNC C:1035
- 36: { if (*p>0) (*p)--; }
- //这里是{ if (*p>0) (*p)--; }
- C:0x1015 AB3B MOV R3,0x3B
- C:0x1017 AA3C MOV R2,0x3C
- C:0x1019 A93D MOV R1,0x3D
- C:0x101B 120B92 LCALL C?CLDPTR(C:0B92)
- C:0x101E D3 SETB C
- C:0x101F 9400 SUBB A,#0x00
- C:0x1021 4005 JC C:1028
- C:0x1023 74FF MOV A,#0xFF
- C:0x1025 120BD8 LCALL C?CILDPTR(C:0BD8)
- //这里才是P++
- C:0x1028 7401 MOV A,#0x01
- C:0x102A 253D ADD A,0x3D
- C:0x102C F53D MOV 0x3D,A
- C:0x102E E4 CLR A
- C:0x102F 353C ADDC A,0x3C
- C:0x1031 F53C MOV 0x3C,A
- C:0x1033 80D2 SJMP C:1007
- 37: }
-
- C:0x1035 22 RET
复制代码
改后2式汇编
- 35: for(p=(uint*)&TM;p<(uint *)((uint*)&TM+sizeof(TM));p++)
- //这里是p=(unsigned char*)&TM
- C:0x1055 753B00 MOV 0x3B,#0x00
- C:0x1058 753C00 MOV 0x3C,#0x00
- C:0x105B 753D4B MOV 0x3D,#TM(0x4B)
- //这里是p<((uint *)(((uint *)&TM+sizeof(TM))
- C:0x105E C3 CLR C
- C:0x105F 900063 MOV DPTR,#0x0063
- C:0x1062 E53D MOV A,0x3D
- C:0x1064 9582 SUBB A,DPL(0x82)
- C:0x1066 E53C MOV A,0x3C
- C:0x1068 9583 SUBB A,DPH(0x83)
- C:0x106A 5026 JNC C:1092
- 36: { if (*p>0) (*p)--; }
- //这里是{ if (*p>0) (*p)--; }
- C:0x106C AB3B MOV R3,0x3B
- C:0x106E AA3C MOV R2,0x3C
- C:0x1070 A93D MOV R1,0x3D
- C:0x1072 120940 LCALL C?ILDPTR(C:0940)
- C:0x1075 D3 SETB C
- C:0x1076 9400 SUBB A,#0x00
- C:0x1078 E5F0 MOV A,B(0xF0)
- C:0x107A 9400 SUBB A,#0x00
- C:0x107C 4007 JC C:1085
- C:0x107E 74FF MOV A,#0xFF
- C:0x1080 F5F0 MOV B(0xF0),A
- C:0x1082 12096B LCALL C?IILDPTR(C:096B)
- //这里才是P++
- C:0x1085 7402 MOV A,#0x02
- C:0x1087 253D ADD A,0x3D
- C:0x1089 F53D MOV 0x3D,A
- C:0x108B E4 CLR A
- C:0x108C 353C ADDC A,0x3C
- C:0x108E F53C MOV 0x3C,A
- C:0x1090 80CC SJMP C:105E
- 37: }
- C:0x1092 22 RET
复制代码
/**********************************以下算是结贴部份***有错误指出,我再修正,第一次在结构体操作指针,当然我的指针方面运用很一般**********/
对于1式,其实没有错.因为结构体里面的数据,初始化时都右移8位过.也就是说.所有数据高8位都为零.也就是不会作减1操作.相当于只操作低8位. 达到每个数据都减1. 这个源码是以前一个工程师写的,用在软时基.
关于式2,我改的.经过论坛的高位指错,也领悟了一些.现将式子改为如下.
- void tmcontrol()
- {
- uint *p;
- for(p=(uint *)&TM;p<(uint *)((uchar *)&TM+sizeof(TM));p++)
- { if (*p>0) (*p)--; }
- }
复制代码
式2的汇编部份我也弄出来
- 35: for(p=(unsigned int*)&TM;p<(unsigned int *)((unsigned char*)&TM+sizeof(TM));p++)
- //这里是p=(unsigned int*)&TM
- C:0x1055 753B00 MOV 0x3B,#0x00
- C:0x1058 753C00 MOV 0x3C,#0x00
- C:0x105B 753D4B MOV 0x3D,#TM(0x4B)
- //这里是p<(unsigned int *)((unsigned char*)&TM+sizeof(TM))
- C:0x105E C3 CLR C
- C:0x105F 900057 MOV DPTR,#IRcount(0x0057)
- C:0x1062 E53D MOV A,0x3D
- C:0x1064 9582 SUBB A,DPL(0x82)
- C:0x1066 E53C MOV A,0x3C
- C:0x1068 9583 SUBB A,DPH(0x83)
- C:0x106A 5026 JNC C:1092
- 36: { if (*p>0) (*p)--; }
- C:0x106C AB3B MOV R3,0x3B
- C:0x106E AA3C MOV R2,0x3C
- C:0x1070 A93D MOV R1,0x3D
- C:0x1072 120940 LCALL C?ILDPTR(C:0940)
- C:0x1075 D3 SETB C
- C:0x1076 9400 SUBB A,#0x00
- C:0x1078 E5F0 MOV A,B(0xF0)
- C:0x107A 9400 SUBB A,#0x00
- C:0x107C 4007 JC C:1085
- C:0x107E 74FF MOV A,#0xFF
- C:0x1080 F5F0 MOV B(0xF0),A
- C:0x1082 12096B LCALL C?IILDPTR(C:096B)
- //这里才是P++
- C:0x1085 7402 MOV A,#0x02
- C:0x1087 253D ADD A,0x3D
- C:0x1089 F53D MOV 0x3D,A
- C:0x108B E4 CLR A
- C:0x108C 353C ADDC A,0x3C
- C:0x108E F53C MOV 0x3C,A
- C:0x1090 80CC SJMP C:105E
- 37: }
- C:0x1092 22 RET
复制代码
有什么错误欢迎指正. 不知道我写的对不对.
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|