假設有變量a,b交換它們的值,有一種很牛X的做法a^=b^=a^=b;下面看看它真的很牛X麼?
x86的彙編
x=a;a=b;b=x;//直接賦值
28: 8b 45 e8 mov -0x18(%ebp),%eax
2b: 89 45 f0 mov %eax,-0x10(%ebp)
2e: 8b 45 ec mov -0x14(%ebp),%eax
31: 89 45 e8 mov %eax,-0x18(%ebp)
34: 8b 45 f0 mov -0x10(%ebp),%eax
37: 89 45 ec mov %eax,-0x14(%ebp)
x = *pa;*pa = *pb; *pb = x;//通過指針 直接賦值,用指針是模擬函數調用修改數據
3a: 8b 45 f4 mov -0xc(%ebp),%eax
3d: 8b 00 mov (%eax),%eax
3f: 89 45 f0 mov %eax,-0x10(%ebp)
42: 8b 45 f8 mov -0x8(%ebp),%eax
45: 8b 10 mov (%eax),%edx
47: 8b 45 f4 mov -0xc(%ebp),%eax
4a: 89 10 mov %edx,(%eax)
4c: 8b 45 f8 mov -0x8(%ebp),%eax
4f: 8b 55 f0 mov -0x10(%ebp),%edx
52: 89 10 mov %edx,(%eax)
a^=b^=a^=b;//所謂的省一個變量的,牛X做法
54: 8b 55 e8 mov -0x18(%ebp),%edx
57: 8b 45 ec mov -0x14(%ebp),%eax
5a: 31 d0 xor %edx,%eax
5c: 89 45 e8 mov %eax,-0x18(%ebp)
5f: 8b 55 e8 mov -0x18(%ebp),%edx
62: 8b 45 ec mov -0x14(%ebp),%eax
65: 31 d0 xor %edx,%eax
67: 89 45 ec mov %eax,-0x14(%ebp)
6a: 8b 55 ec mov -0x14(%ebp),%edx
6d: 8b 45 e8 mov -0x18(%ebp),%eax
70: 31 d0 xor %edx,%eax
72: 89 45 e8 mov %eax,-0x18(%ebp)
(*pa)^=(*pb)^=(*pa)^=(*pb);//通過指針 所謂的省一個變量的,牛X做法,用指針是模擬函數調用修改數據
75: 8b 45 f4 mov -0xc(%ebp),%eax
78: 8b 10 mov (%eax),%edx
7a: 8b 45 f8 mov -0x8(%ebp),%eax
7d: 8b 08 mov (%eax),%ecx
7f: 8b 45 f4 mov -0xc(%ebp),%eax
82: 8b 18 mov (%eax),%ebx
84: 8b 45 f8 mov -0x8(%ebp),%eax
87: 8b 00 mov (%eax),%eax
89: 31 c3 xor %eax,%ebx
8b: 8b 45 f4 mov -0xc(%ebp),%eax
8e: 89 18 mov %ebx,(%eax)
90: 8b 45 f4 mov -0xc(%ebp),%eax
93: 8b 00 mov (%eax),%eax
95: 31 c1 xor %eax,%ecx
97: 8b 45 f8 mov -0x8(%ebp),%eax
9a: 89 08 mov %ecx,(%eax)
9c: 8b 45 f8 mov -0x8(%ebp),%eax
9f: 8b 00 mov (%eax),%eax
a1: 31 c2 xor %eax,%edx
a3: 8b 45 f4 mov -0xc(%ebp),%eax
a6: 89 10 mov %edx,(%eax)
arm的彙編
x=a;a=b;b=x;//直接賦值
3c: e51b3014 ldr r3, [fp, #-20]
40: e50b3010 str r3, [fp, #-16]
44: e51b3018 ldr r3, [fp, #-24]
48: e50b3014 str r3, [fp, #-20]
4c: e51b3010 ldr r3, [fp, #-16]
50: e50b3018 str r3, [fp, #-24]
x = *pa;*pa = *pb; *pb = x;//通過指針 直接賦值,用指針是模擬函數調用修改數據
54: e51b300c ldr r3, [fp, #-12]
58: e5933000 ldr r3, [r3]
5c: e50b3010 str r3, [fp, #-16]
60: e51b3008 ldr r3, [fp, #-8]
64: e5932000 ldr r2, [r3]
68: e51b300c ldr r3, [fp, #-12]
6c: e5832000 str r2, [r3]
70: e51b3008 ldr r3, [fp, #-8]
74: e51b2010 ldr r2, [fp, #-16]
78: e5832000 str r2, [r3]
a^=b^=a^=b;//所謂的省一個變量的,牛X做法
7c: e51b2014 ldr r2, [fp, #-20]
80: e51b3018 ldr r3, [fp, #-24]
84: e0223003 eor r3, r2, r3
88: e50b3014 str r3, [fp, #-20]
8c: e51b2014 ldr r2, [fp, #-20]
90: e51b3018 ldr r3, [fp, #-24]
94: e0223003 eor r3, r2, r3
98: e50b3018 str r3, [fp, #-24]
9c: e51b2018 ldr r2, [fp, #-24]
a0: e51b3014 ldr r3, [fp, #-20]
a4: e0223003 eor r3, r2, r3
a8: e50b3014 str r3, [fp, #-20]
(*pa)^=(*pb)^=(*pa)^=(*pb);//通過指針 所謂的省一個變量的,牛X做法,用指針是模擬函數調用修改數據
ac: e51b300c ldr r3, [fp, #-12]
b0: e5932000 ldr r2, [r3]
b4: e51b3008 ldr r3, [fp, #-8]
b8: e5931000 ldr r1, [r3]
bc: e51b300c ldr r3, [fp, #-12]
c0: e5930000 ldr r0, [r3]
c4: e51b3008 ldr r3, [fp, #-8]
c8: e5933000 ldr r3, [r3]
cc: e0200003 eor r0, r0, r3
d0: e51b300c ldr r3, [fp, #-12]
d4: e5830000 str r0, [r3]
d8: e51b300c ldr r3, [fp, #-12]
dc: e5933000 ldr r3, [r3]
e0: e0211003 eor r1, r1, r3
e4: e51b3008 ldr r3, [fp, #-8]
e8: e5831000 str r1, [r3]
ec: e51b3008 ldr r3, [fp, #-8]
f0: e5933000 ldr r3, [r3]
f4: e0222003 eor r2, r2, r3
f8: e51b300c ldr r3, [fp, #-12]
fc: e5832000 str r2, [r3]