第一段程序是个简化的版本, 编译器无法正常编译,
#if 1 /* compiler can not correctly excute this section */ __asm( " andi. r6, r5, 0x3F "); /* copy the fragement */ __asm( " mtctr r6 "); /* statement A */ /*loop2:*/ __asm( " lwzu r16, 0(r3) "); /* statement B*/ __asm( " stwu r16, 0(r4) "); ........... __asm( " bdnz copyLongs+92 "); /*---jump to loop2 */ #endif
编译的结果为
andi. r6, r5, 0x3F lwzu r16, 0(r3) /*loop2: copylongs+92 */ mtctr r6 stwu r16, 0(r4) ................ bdnz copyLongs+92
其中 copyLongs是函数入口地址, loop2是循环的入口处,即copyLongs+92
由于编译后语句A B 被颠倒,循环无法终止,造成错误。
不知道如何避免这种现象?
谢谢~~~~~