作者roylee17 (把我id还我阿......)
看板ASM
标题Re: [问题] 请问有人懂PowerPC ASM的吗?
时间Sat Jul 14 04:10:03 2007
※ 引述《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)