相关疑难解决方法(0)

在不使用gcc的内联汇编的情况下访问寄存器

我想在没有编写内联汇编的情况下读取堆栈指针寄存器值.我想这样做的原因是因为我想将堆栈指针寄存器值分配给数组元素,我发现使用内联汇编访问数组很麻烦.所以我想做那样的事情.

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有什么可能吗?

c x86 gcc inline-assembly

9
推荐指数
2
解决办法
3493
查看次数

为什么我不能在 C 中获取 asm 寄存器的值?

我正在尝试获取汇编寄存器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)

c x86 gcc inline-assembly cpu-registers

8
推荐指数
2
解决办法
334
查看次数

gcc中的全局寄存器变量

最近我在一次采访中被问到全局寄存器变量.我搞砸了说任何全局变量都将存储在数据段中.但后来我被问及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

6
推荐指数
1
解决办法
1643
查看次数

与gcc相比,为什么clang在寄存器变量中表现怪异?

背景:

我需要在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不能具有这样的值。

问:

  • clang不支持此寄存器变量用法吗?
  • 如果它不支持此功能,为什么不抱怨警告或错误(使用以下代码进行编译)?

    #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)

c assembly clang

5
推荐指数
1
解决办法
204
查看次数

标签 统计

c ×4

gcc ×3

inline-assembly ×2

x86 ×2

assembly ×1

clang ×1

cpu-registers ×1