通過彙編看兩個變量交換的刁鑽“技巧”

      假設有變量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]


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章