Re: [問題] 請問有人懂PowerPC ASM的嗎?
※ 引述《ccbruce (蛍雪時代にの僕)》之銘言:
: 有個很奇怪的現象,不知道有沒有人能不能做個說明:
: 在x86上面,我很習慣用a^=b^=a^=b做變數的交換,但是在PowerPC上使用,卻得到奇怪的
: 結果:如果只是交換兩個變數,那一切正常;但若是交換兩個間接定址的變數內容,卻會
: 得到奇怪的答案,有人可以解釋一下嗎?
: 原始的C如下:
: #include <stdio.h>
: #include <stdlib.h>
: #define swap(a, b) (a^=b^=a^=b)
: int main(int argc, char *argv[])
: {
: int arr[2]={100, 200};
: int a=100, b=200;
: int *pa=&a, *pb=&b;
: swap(arr[0], arr[1]);
: printf("arr[0]=%d, arr[1]=%d\n", arr[0], arr[1]);
: /* arr[0]=0, arr[1]=100 */
: swap(a, b);
: printf("a=%d, b=%d\n", a, b);
: /* a=200, b=100 */
: swap(*pa, *pb);
: printf("a=%d, b=%d\n", a, b);
: /* a=0, b=200 */
: }
a' = a XOR b
b' = a' XOR b = b XOR a XOR b = a
// 所以你的 b 是沒問題的
a'' = a' XOR b' = a XOR b XOR a = b
// 這是你預期的情況
a'' = a XOR b' = a XOR a = 0
// 這是實際發生的情況
最後的 a^= b 當中, a = a ^ b;
右式中的 a 還是原本的 100, 而 b 則是交換完成的 100
所以答案是 0
問題在於 a^=b^=a^=b 這個式子中,a 做了兩次的給/變值動作
就像 i++ + ++i 這種寫法一樣,請避免
拆成兩行
b^=a^=b; // a, b 各一次給值動作
a^=b;
或是乖乖拆成三行吧
另外,這種用法還要注意 a, b 不能是同樣的值,否則兩者會變 0
小小建議: 還是用一般有 tmp variable 的用法吧
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 203.73.27.249
※ 編輯: roylee17 來自: 203.73.27.249 (07/14 04:11)
討論串 (同標題文章)
ASM 近期熱門文章
PTT數位生活區 即時熱門文章