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