作者ccbruce (蛍雪时代にの仆)
看板ASM
标题Re: [问题] 请问有人懂PowerPC ASM的吗?
时间Sat Jul 14 15:37:33 2007
: 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 的用法吧
对於此用法的边际效用及实际机器码转译我非常的清楚,我并不需要这种说明。
事实上,这种方式只要考虑^=的结合性,它是由右至左。考虑到较佳的作法,自然就要转
译为类似以下的x86机器码(实际上也是),而非你讲的另起变数:
...
mov AX, varA
mov BX, varB
xor AX, BX
xor BX, AX
xor AX, BX
mov varA, AX
mov varB, BX
...
我今天的问题,是因为硬体特性造成的。我所需要的,是有人说明为何PowerPC会造成
这样的问题,而不是讨论这种方法与未定义行为的关系。(实际上PowerPC下对两个普通
变数作如此操作也完全正常,没有你所说的问题出现)今天这种问题只出现在PowerPC
下间接定址,这才是我想问的问题,请勿离题。
--
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 125.229.139.155
1F:推 LLight:................ 07/14 21:24
2F:嘘 sunneo:................ 07/19 16:32
3F:嘘 coldfly:............... 07/21 22:05