我想获取用户进程的寄存器,并正在考虑使用asm
这样操作:
int regVal;
asm("movl %%eax, %0" : "=r"(regVal) :);
对于调用asm
的用户进程,该调用会更改进程的寄存器吗?我担心指令指针从asm
调用更改为更改。
是否有一种更简单的方法可以一次存储/检索用户进程中所有寄存器的值?
编辑:我的编译器是Apple clang版本11.0.0(clang-1100.0.33.17)
由于您使用的是Apple clang,最合理的方法是创建一个单独的程序集文件,对其进行汇编并将其链接到您的项目。您可以为每个寄存器创建单独的方法,就像这样。
getregs.s
.intel_syntax noprefix
.text
.global _getrax
_getrax:
ret
.global _getrdx
_getrdx:
mov rax,rdx
ret
.global _getrcx
_getrcx:
mov rax,rcx
ret
.global _getrbx
_getrbx:
mov rax,rbx
ret
在您的C代码中,您只需声明原型并调用方法
main.c
#include <stdio.h>
uint64_t getrax(void);
uint64_t getrcx(void);
uint64_t getrdx(void);
uint64_t getrbx(void);
int main(int argc, const char * argv[]) {
printf("%p\n",getrdx());
return 0;
}
然后在终端中组装getregs.s文件
clang -c getregs.s -o getregs.o
然后,您将编译目标文件并将其链接到main.c文件
clang main.c getregs.o -o main
然后运行
./main
它将打印您的注册信息