作者ccbruce (蛍雪時代にの僕)
看板ASM
標題[問題] 請問有人懂PowerPC ASM的嗎?
時間Sat Jul 14 02:20:02 2007
有個很奇怪的現象,不知道有沒有人能不能做個說明:
在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
1F:推 MasterChang:swap用這種方式做值得嗎?對大多數例子... 07/14 11:06