#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
jni下的内联汇编
于 2021-02-27 14:23:15 首次发布