作者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