汇编ppc64的代码

时间:2014-07-10 19:49:35

标签: c assembly 64-bit cpu-registers powerpc

我有一个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

2 个答案:

答案 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规范。还有一些关于它的介绍。所有这些都可以在以下网址找到。

https://wiki.debian.org/ppc64el#ABI_Documentation