[問題] 請問有人懂PowerPC ASM的嗎?

看板ASM作者 (蛍雪時代にの僕)時間17年前 (2007/07/14 02:20), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串1/4 (看更多)
有個很奇怪的現象,不知道有沒有人能不能做個說明: 在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
swap用這種方式做值得嗎?對大多數例子...
07/14 11:06, 1F
文章代碼(AID): #16by9Ke9 (ASM)
文章代碼(AID): #16by9Ke9 (ASM)