37得票2回答
寄存器分配和溢出,有简单的方法吗?

我正在寻找一种将本地变量分配到寄存器的方法。我知道有几种严谨的方法可以做到这一点(即在维基百科上提到的),但我卡在了如何实现"spilling"上。此外,相关文献非常令人生畏。我希望有一些更简单的东西能够满足我的优先考虑: 正确性 - 无论有多少本地变量,都能生成正确的代码的算法。 简单性...

24得票4回答
GCC: 禁用某些寄存器

这是一个奇怪的请求,但我感觉这可能是有可能的。我想要做的是在我的 C 代码中插入一些编译指示或指令,以便 GCC 的寄存器分配器不会使用它们。 我知道我可以像这样做,也许可以为这个变量留出寄存器:register int var1 asm ("EBX") = 1984; register i...

22得票2回答
为什么编译器在这里坚持使用被调用者保存寄存器?

考虑以下 C 代码:void foo(void); long bar(long x) { foo(); return x; } 当我使用 -O3 或 -Os 在 GCC 9.3 上进行编译时,我会得到以下这个结果:bar: push r12 ...

18得票5回答
在变量定义之前使用Goto - 它的值会发生什么?

这里有一个我想知道的问题。给定以下代码,我们能否确定它的输出?void f() { int i = 0; z: if(i == 1) goto x; else goto u; int a; x: if(a == 10) goto y; u: a = 10; i = ...

15得票8回答
寄存器变量的地址

在 C 语言中,我们无法使用 & 来获取寄存器变量的地址,但在 C++ 中可以这样做。为什么在 C++ 中合法而在 C 中不行呢?可以有人详细解释一下这个概念吗?

11得票2回答
GCC内联汇编中早期破坏寄存器的错误行为对内存操作数寻址模式的影响的具体示例是什么?

以下是从GCC手册的扩展汇编文档中摘录的内容,介绍如何使用asm关键字在C语言中嵌入汇编指令: 如果一个输出参数(a)允许寄存器约束,而另一个输出参数(b)允许内存约束,则可能会出现相同的问题。 GCC生成的代码用于访问b中的内存地址可以包含寄存器,这些寄存器可能被a共享,并且GCC认为这些...

10得票2回答
如何强制gcc使用所有SSE(或AVX)寄存器?

我正在尝试为Windows x64目标编写一些计算密集型代码,使用SSE或新的AVX指令,在GCC 4.5.2和4.6.1中进行编译,使用MinGW64(TDM GCC构建和一些自定义构建)。我的编译器选项是-O3 -mavx。(-m64被暗示) 简而言之,我想对4个三维向量的打包浮点数执行...

9得票3回答
дҪҝз”ЁFPUе’ҢMMXеҜ„еӯҳеҷЁдҪңдёәвҖңйҖҡз”ЁеҜ„еӯҳеҷЁвҖқ

大多数汇编程序使用4个通用寄存器eax、ebx、ecx和edx,但我发现很多时候我需要使用超过4个寄存器才能轻松完成任务,而不必从堆栈中频繁地push和pop。由于我的程序没有使用FPU或MMX寄存器进行浮点运算或其“预期用途”,因此在程序中使用这些额外的寄存器是否被认为是可接受的呢? 例如...

8得票1回答
x86寄存器重命名的成本

以下代码可以在amd64上使用gcc或clang进行编译: // gcc -O2 file.c -c int f(int a, int b, int c, int d) { return a & b & c & d; } 生成以下汇编代码: 000000...