jni下的内联汇编

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <android/log.h>

#if defined(__arm__)
#define REG_MAX 8
typedef struct reg_context {
    uint32_t regs[REG_MAX];
} reg_context;

reg_context proc;

int testgetregs(int a, int b, int c, int d) {
    asm volatile("mov %0,r0" : "=r"(proc.regs[0])::"cc","r0","r1","r2","r3","r4","r5","r6","r7");
    asm volatile("mov %0,r1" : "=r"(proc.regs[1])::"cc","r0","r1","r2","r3","r4","r5","r6","r7");
    asm volatile("mov %0,r2" : "=r"(proc.regs[2])::"cc","r0","r1","r2","r3","r4","r5","r6","r7");
    asm volatile("mov %0,r3" : "=r"(proc.regs[3])::"cc","r0","r1","r2","r3","r4","r5","r6","r7");
    asm volatile("mov %0,r4" : "=r"(proc.regs[4])::"cc","r0","r1","r2","r3","r4","r5","r6","r7");
    asm volatile("mov %0,r5" : "=r"(proc.regs[5])::"cc","r0","r1","r2","r3","r4","r5","r6","r7");
    asm volatile("mov %0,r6" : "=r"(proc.regs[6])::"cc","r0","r1","r2","r3","r4","r5","r6","r7");
    asm volatile("mov %0,r7" : "=r"(proc.regs[7])::"cc","r0","r1","r2","r3","r4","r5","r6","r7");

    __android_log_print(4, "jni",
                        "r0 = %x, r1 = %x, r2 = %x, r3 = %x\nr4 = %x, r5 = %x, r6 = %x, r7 = %x\n",
                        proc.regs[0], proc.regs[1], proc.regs[2], proc.regs[3], proc.regs[4],
                        proc.regs[5], proc.regs[6], proc.regs[7]);

    return 0;
}
#if defined(__ARM_ARCH_7A__)
#if defined(__ARM_NEON__)
#if defined(__ARM_PCS_VFP)
#define ABI "armeabi-v7a/NEON (hard-float)"
#else
#define ABI "armeabi-v7a/NEON"
#endif
#else
#if defined(__ARM_PCS_VFP)
#define ABI "armeabi-v7a (hard-float)"
#else
#define ABI "armeabi-v7a"
#endif
#endif
#else
#define ABI "armeabi"
#endif
#elif defined(__i386__)
#define ABI "x86"
#elif defined(__x86_64__)
#define ABI "x86_64"
#elif defined(__mips64)  /* mips64el-* toolchain defines __mips__ too */
#define ABI "mips64"
#elif defined(__mips__)
#define ABI "mips"
#elif defined(__aarch64__)
#define ABI "arm64-v8a"
#define REG_MAX 8
/*x0-x30	64bit	通用寄存器,如果有需要可以当做32bit使用:WO-W30
FP(x29)	64bit	保存栈帧地址(栈底指针)
LR(x30)	64bit	通常称X30为程序链接寄存器,保存子程序结束后需要执行的下一条指令
        SP	64bit	保存栈指针,使用 SP/WSP来进行对SP寄存器的访问。
PC	64bit	程序计数器,俗称PC指针,总是指向即将要执行的下一条指令,在arm64中,软件是不能改写PC寄存器的。
CPSR	64bit	状态寄存器

x0-x7: 用于子程序调用时的参数传递,X0还用于返回值传递

x0 - x30 是31个通用整形寄存器。每个寄存器可以存取一个64位大小的数。 当使用 x0 - x30 访问时,它就是一个64位的数。当使用 w0 - w30 访问时,访问的是这些寄存器的低32位,如图:
*/
typedef struct reg_context {
    uint64_t regs[REG_MAX];
} reg_context;

reg_context proc;

int testgetregs(int a, int b, int c, int d, int e, int f, int g, int h) {

    // __asm__ (汇编语句模板: 输出部分: 输入部分: 破坏描述部分)
/*   constraint前加”=”符号的意义:gcc需要知道这个操作数是在执行嵌入汇编前从变量加载到寄存器,还是在执行后从寄存器存储到变量中。
    常用的constraints有以下几个(更多细节参见gcc手册):
    m    内存操作数
    r    寄存器操作数
    i    立即数操作数(整数)
    f    浮点寄存器操作数
    F   立即数操作数(浮点)
    嵌入式汇编的基本格式:
    规则前面加上”=”表示这是一个输出操作数,否则是输入操作数
    asm(“汇编指令”:”=输出操作数规则”(关联变量):”输入操作数规则”(关联变量):"其他规则");
    asm(code : output operand list : input operand list : clobber list);*/
    asm volatile("mov %0,x0" : "=r"(proc.regs[0])::"cc","x0","x1","x2","x3","x4","x5","x6","x7");
    asm volatile("mov %0,x1" : "=r"(proc.regs[1])::"cc","x0","x1","x2","x3","x4","x5","x6","x7");
    asm volatile("mov %0,x2" : "=r"(proc.regs[2])::"cc","x0","x1","x2","x3","x4","x5","x6","x7");
    asm volatile("mov %0,x3" : "=r"(proc.regs[3])::"cc","x0","x1","x2","x3","x4","x5","x6","x7");
    asm volatile("mov %0,x4" : "=r"(proc.regs[4])::"cc","x0","x1","x2","x3","x4","x5","x6","x7");
    asm volatile("mov %0,x5" : "=r"(proc.regs[5])::"cc","x0","x1","x2","x3","x4","x5","x6","x7");
    asm volatile("mov %0,x6" : "=r"(proc.regs[6])::"cc","x0","x1","x2","x3","x4","x5","x6","x7");
    asm volatile("mov %0,x7" : "=r"(proc.regs[7])::"cc","x0","x1","x2","x3","x4","x5","x6","x7");

/*    asm volatile
    (
    "mov %0, x0\n\t"
    "mov %1, x1\n\t"
    "mov %2, x2\n\t"
    "mov %3, x3\n\t"
    "mov %4, x4\n\t"
    "mov %5, x5\n\t"
    "mov %6, x6\n\t"
    "mov %7, x7\n\t"
    : "=r"(proc.regs[0]), "=r"(proc.regs[1]), "=r"(proc.regs[2]), "=r"(proc.regs[3]),
    "=r"(proc.regs[4]), "=r"(proc.regs[5]), "=r"(proc.regs[6]), "=r"(proc.regs[7])
    ::
    );*/

    __android_log_print(4, "jni",
                        "x0 = %x, x1 = %x, x2 = %x, x3 = %x\nx4 = %x, x5 = %x, x6 = %x, x7 = %x\n",
                        proc.regs[0], proc.regs[1], proc.regs[2], proc.regs[3], proc.regs[4],
                        proc.regs[5], proc.regs[6], proc.regs[7]);

    return 0;
}

#else
#define ABI "unknown"
#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值