gpt4 book ai didi

c - 如何在 asm 内联语句中请求通用寄存器?

转载 作者:行者123 更新时间:2023-11-30 17:52:33 29 4
gpt4 key购买 nike

有没有办法要求 gcc 分配一个寄存器仅供 asm 内联内部使用?这是一个示例(在伪 asm 中),其中 r5 直接在 asm 中使用,但它可以是任何通用寄存器,它仅供内部使用,因此既不是输入也不是输出:

asm("load_immediate_value %%r5,0;"
/* ... */
"add_immediate_value %%r5,%%r5,42"
/* ... */
:
:
: "r5");

在此示例中,我选择寄存器 r5 并告诉 gcc 我正在通过 clobber 列表使用它。但如果 r5 是 ABI 寄存器怎么办?!我需要一种方法来简单地请求寄存器,而不必自己命名。

最佳答案

通常的做法是:

static __inline__ void set_archctrl0(unsigned long val) {
register unsigned long archctrl0 __asm__("archctrl0") = val;

__asm__ __volatile__("" : "+r"(archctrl0) : : "cc", "memory");
}

asm 语句只是为了强制编译器而不优化整个事情。

或者,一个更实际的例子,读取堆栈指针寄存器可以这样完成:

static __inline__ void * getSP(void) {
register void * sp asm("sp");
asm ("" : "=r"(sp));
return sp;
}

将变量绑定(bind)到特定寄存器的方法记录在Explicit Register Variables中GCC 手册的部分。

当然,如果写入特定于架构的寄存器需要自定义指令(即无法使用 CPU 通常用于初始化寄存器值的任何类型的“移动”或“加载”来完成),那么您宁愿需要类似的指令:

static __inline__ void set_archctrl0(unsigned long val) {
__asm__ __volatile__("setarchctrl0 %0" : : "r"(val) : "cc", "memory");
}

显然,所有这些都仅适用于“正常”代码使用的寄存器(即在平台 ABI 之外/由平台 ABI 显式保留为全局变量/作为不用于被编译的代码所触及)。

您不能以这种方式指示编译器“不干涉通用寄存器”。据我所知,这在 gcc 中是不可能的。

关于c - 如何在 asm 内联语句中请求通用寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16099425/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com