【记录一个问题】用毫无用处的方法解决了libtask的asm.S在ndk下编译的问题

昨天提到,libtask中的asm.S使用的是ARM 32位的语法,因此在ARM 64下无法编译通过。
于是查了一下资料,改写了一下汇编代码,使得可以在64位下编译通过。源码如下

#if defined(__linux__) && defined(__arm__)
.globl getmcontext
getmcontext:
    str r1, [r0,#4]
    str r2, [r0,#8]
    str r3, [r0,#12]
    str r4, [r0,#16]
    str r5, [r0,#20]
    str r6, [r0,#24]
    str r7, [r0,#28]
    str r8, [r0,#32]
    str r9, [r0,#36]
    str r10, [r0,#40]
    str r11, [r0,#44]
    str r12, [r0,#48]
    str r13, [r0,#52]
    str r14, [r0,#56]
    /* store 1 as r0-to-restore */
    mov r1, #1
    str r1, [r0]
    /* return 0 */
    mov r0, #0
    mov pc, lr
.globl setmcontext
setmcontext:
    ldr r1, [r0,#4]
    ldr r2, [r0,#8]
    ldr r3, [r0,#12]
    ldr r4, [r0,#16]
    ldr r5, [r0,#20]
    ldr r6, [r0,#24]
    ldr r7, [r0,#28]
    ldr r8, [r0,#32]
    ldr r9, [r0,#36]
    ldr r10, [r0,#40]
    ldr r11, [r0,#44]
    ldr r12, [r0,#48]
    ldr r13, [r0,#52]
    ldr r14, [r0,#56]
    ldr r0, [r0]
    mov pc, lr


#elif defined(__linux__) && (defined(__arm64__) || defined(__aarch64__))
.globl getmcontext
getmcontext:
    str x1, [x0,#4]
    str x2, [x0,#8]
    str x3, [x0,#12]
    str x4, [x0,#16]
    str x5, [x0,#20]
    str x6, [x0,#24]
    str x7, [x0,#28]
    str x8, [x0,#32]
    str x9, [x0,#36]
    str x10, [x0,#40]
    str x11, [x0,#44]
    str x12, [x0,#48]
    str x13, [x0,#52]
    str x14, [x0,#56]
    /* store 1 as r0-to-restore */
    mov x1, #1
    str x1, [x0]
    /* return 0 */
    mov x0, #0
    /*mov   pc, lr */
    /*PC寄存器, Program Counter, 记录当前执行的代码的地址. 它是一个隐含的寄存器, 无法被直接访问, 只能被特定的指令隐含访问.*/
.globl setmcontext
setmcontext:
    ldr x1, [x0,#4]
    ldr x2, [x0,#8]
    ldr x3, [x0,#12]
    ldr x4, [x0,#16]
    ldr x5, [x0,#20]
    ldr x6, [x0,#24]
    ldr x7, [x0,#28]
    ldr x8, [x0,#32]
    ldr x9, [x0,#36]
    ldr x10, [x0,#40]
    ldr x11, [x0,#44]
    ldr x12, [x0,#48]
    ldr x13, [x0,#52]
    ldr x14, [x0,#56]
    ldr x0, [x0]
    /*mov   pc, lr*/
#else
#error unknown platform
#endif

结论是:

  • ARM 32位下的寄存器是 r0~r14, 而arm 64下是x0~x14
  • arm 64下,是不是应该修改为每次偏移8字节?不知道
  • mov pc, lr这一句注释了,因为ARM 64下PC寄存器不能直接访问
  • 最后,以上的语法编译通过后,链接可执行程序的时候显示找不到getcontext这个符号。还不知道该怎么解决这个问题!

转载于:https://www.cnblogs.com/ahfuzhang/p/11290509.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值