我想在没有编写内联汇编的情况下读取堆栈指针寄存器值.我想这样做的原因是因为我想将堆栈指针寄存器值分配给数组元素,我发现使用内联汇编访问数组很麻烦.所以我想做那样的事情.
register "rsp" long rsp_alias; <--- How do I achieve something like that in gcc?
long current_rsp_value[NUM_OF_THREADS];
current_rsp_value[tid] = rsp_alias;
Run Code Online (Sandbox Code Playgroud)
gcc有什么可能吗?
我正在尝试获取汇编寄存器rdi, rsi, rdx, rcx, 的值r8,但是我得到了错误的值,所以我不知道我正在做的是获取这些值还是告诉编译器在这些值上写入寄存器,如果是这种情况,我怎么能实现我想要做的事情(将汇编寄存器的值放在 C 变量中)?
当此代码编译时(使用gcc -S test.c)
#include <stdio.h>
void beautiful_function(int a, int b, int c, int d, int e) {
register long rdi asm("rdi");
register long rsi asm("rsi");
register long rdx asm("rdx");
register long rcx asm("rcx");
register long r8 asm("r8");
const long save_rdi = rdi;
const long save_rsi = rsi;
const long save_rdx = rdx;
const long save_rcx = rcx;
const long save_r8 = r8;
printf("%ld\n%ld\n%ld\n%ld\n%ld\n", save_rdi, …Run Code Online (Sandbox Code Playgroud) 最近我在一次采访中被问到全局寄存器变量.我搞砸了说任何全局变量都将存储在数据段中.但后来我被问及GCC.在采访后我得出结论gcc支持全局寄存器变量.
#include<stdio.h>
register int var asm("ebx"); //storing global variable in register explicitly
int main(void)
{
.......
}
Run Code Online (Sandbox Code Playgroud)
这是链接 https://gcc.gnu.org/onlinedocs/gcc/Global-Reg-Vars.html#Global-Reg-Vars
但现在我对它的生命周期和范围感到困惑,它是否会作为普通的全局变量或寄存器变量工作?gcc上还有任何方法或命令,以便我们确保编译器不会简单地忽略register关键字并将存储在实际的寄存器中吗?
背景:
我需要在C代码中获取寄存器值,因此我在gcc用法中发现了这一点。我使用以下代码获得ebp值。
register int ebp asm("ebp");
printf("currently ebp is %08x\n", ebp);
// then some code use the value
Run Code Online (Sandbox Code Playgroud)
一切正常,直到我将程序的编译器更改为clang为止。在gcc中,它通常会打印类似于0x7f1284978的内容,绝对是类似value的指针。
但是当使用clang时,输出变得很奇怪,它打印出一个0x9之类的值。Ebp不能具有这样的值。
问:
如果它不支持此功能,为什么不抱怨警告或错误(使用以下代码进行编译)?
#include <stdio.h>
static size_t vfp = 0x233;
int main(void) {
register int ebp asm("ebp");
vfp = (size_t) ebp;
printf("vfp value is 0x%lx\n", vfp);
return 0;
}
Run Code Online (Sandbox Code Playgroud)