[問題] 請問有人懂PowerPC ASM的嗎?
有個很奇怪的現象,不知道有沒有人能不能做個說明:
在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 */
}
我也有把它輸出成ASM,不過我看不懂PowerPC的ASM,所以請懂的人解釋一下吧!
.file "test.c"
.section .rodata
.align 2
.type C.0.2306, @object
.size C.0.2306, 8
C.0.2306:
.long 100
.long 200
.align 2
.LC0:
.string "arr[0]=%d, arr[1]=%d\n"
.align 2
.LC1:
.string "a=%d, b=%d\n"
.section ".text"
.align 2
.globl main
.type main, @function
main:
stwu 1,-64(1)
mflr 0
stw 31,60(1)
stw 0,68(1)
mr 31,1
stw 3,40(31)
stw 4,44(31)
lis 9,C.0.2306@ha
la 9,C.0.2306@l(9)
lwz 10,4(9)
lwz 9,0(9)
stw 9,16(31)
stw 10,20(31)
li 0,100
stw 0,24(31)
li 0,200
stw 0,28(31)
addi 0,31,24
stw 0,12(31)
addi 0,31,28
stw 0,8(31)
lwz 11,16(31)
lwz 10,20(31)
lwz 9,16(31)
lwz 0,20(31)
xor 0,9,0
stw 0,16(31)
lwz 0,16(31)
xor 0,10,0
stw 0,20(31)
lwz 0,20(31)
xor 0,11,0
stw 0,16(31)
lwz 0,16(31)
lwz 11,20(31)
lis 9,.LC0@ha
la 3,.LC0@l(9)
mr 4,0
mr 5,11
crxor 6,6,6
bl printf
lwz 9,24(31)
lwz 0,28(31)
xor 0,9,0
stw 0,24(31)
lwz 9,24(31)
lwz 0,28(31)
xor 0,9,0
stw 0,28(31)
lwz 9,28(31)
lwz 0,24(31)
xor 0,9,0
stw 0,24(31)
lwz 0,24(31)
lwz 11,28(31)
lis 9,.LC1@ha
la 3,.LC1@l(9)
mr 4,0
mr 5,11
crxor 6,6,6
bl printf
lwz 9,12(31)
lwz 8,0(9)
lwz 9,8(31)
lwz 10,0(9)
lwz 9,12(31)
lwz 11,0(9)
lwz 9,8(31)
lwz 0,0(9)
xor 0,11,0
lwz 9,12(31)
stw 0,0(9)
lwz 9,12(31)
lwz 0,0(9)
xor 0,10,0
lwz 9,8(31)
stw 0,0(9)
lwz 9,8(31)
lwz 0,0(9)
xor 0,8,0
lwz 9,12(31)
stw 0,0(9)
lwz 0,24(31)
lwz 11,28(31)
lis 9,.LC1@ha
la 3,.LC1@l(9)
mr 4,0
mr 5,11
crxor 6,6,6
bl printf
lwz 11,0(1)
lwz 0,4(11)
mtlr 0
lwz 31,-4(11)
mr 1,11
blr
.size main,.-main
.ident "GCC: (GNU) 4.1.3 20070629 (prerelease) (Debian 4.1.2-13)"
.section .note.GNU-stack,"",@progbits
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 125.229.137.217
推
07/14 11:06, , 1F
07/14 11:06, 1F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 4 篇):
ASM 近期熱門文章
PTT數位生活區 即時熱門文章