Re: [問題] 請問有人懂PowerPC ASM的嗎?
: 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
推
07/14 21:24, , 1F
07/14 21:24, 1F
噓
07/19 16:32, , 2F
07/19 16:32, 2F
噓
07/21 22:05, , 3F
07/21 22:05, 3F
討論串 (同標題文章)
ASM 近期熱門文章
PTT數位生活區 即時熱門文章