我有一个32位ppc的汇编代码,我对如何将其转换为64位感到困惑。有些人可以在ABI上显示64位ppc的链接。
这是一个示例函数,它的64位版本怎么样?
SLEAF(cpu_save_context)
stw r0, 0(ARG0)
stw sp, 4(ARG0) /* Stack frame pointer */
stw r2, 8(ARG0)
stw r3, 12(ARG0)
stw r4, 16(ARG0)
stw r5, 20(ARG0)
stw r6, 24(ARG0)
stw r7, 28(ARG0)
stw r8, 32(ARG0)
stw r9, 36(ARG0)
stw r10, 40(ARG0)
stw r11, 44(ARG0)
stw r12, 48(ARG0)
stw r13, 52(ARG0) /* Small data area pointer */
stw r14, 56(ARG0) /* C-registers */
stw r15, 60(ARG0)
stw r16, 64(ARG0)
stw r17, 68(ARG0)
stw r18, 72(ARG0)
stw r19, 76(ARG0)
stw r20, 80(ARG0)
stw r21, 84(ARG0)
stw r22, 88(ARG0)
stw r23, 92(ARG0)
stw r24, 96(ARG0)
stw r25, 100(ARG0)
stw r26, 104(ARG0)
stw r27, 108(ARG0)
stw r28, 112(ARG0)
stw r29, 116(ARG0)
stw r30, 120(ARG0)
stw r31, 124(ARG0)
mfcr r0 /* Fetch condition register */
stw r0, 128(ARG0)
mflr r0 /* Fetch link register */
stw r0, 132(ARG0)
mfctr r0 /* Fetch count register */
stw r0, 136(ARG0)
mfxer r0, /* Fetch fixed-point exception Register */
stw r0, 140(ARG0)
li ARG0, 1 /* Return TRUE to caller. */
blr
END(cpu_save_context
答案 0 :(得分:1)
代替通用寄存器(r0,sp,r2-r31)上的stw(存储字)和专用寄存器LR,CTR,XER,你应该使用std(存储双字)。并且您需要更改ARG0的硬编码偏移量以存储8个字节,因此偏移量将为“0,8,16,24,...”而不是“0,4,8,12 ......”。您可能还需要考虑是否在ARG0指针处分配了用于双字而不是单词所需的额外存储空间。
例如:
std r0, 0(ARG0)
std sp, 8(ARG0) /* Stack frame pointer (offset was previously 4) */
答案 1 :(得分:1)
关于新的ppc64 ABI,又名ABI v2,有很多材料。
最重要的是官方ELFv2 ABI规范。还有一些关于它的介绍。所有这些都可以在以下网址找到。