如何确定(最好是在编译时)gcc是使用基于rbp的偏移还是基于rsp的偏移?

时间:2017-09-15 22:58:25

标签: c gcc assembly inline-assembly

我想写这样的东西:

#include <stdint.h>

inline uint64_t with_rsp(uint64_t x, uint64_t y) {
  uint64_t z, w;
  uint64_t rsp;
  asm ("mov %%rsp, %[rsp]\t\n"
       "mov $0x13, %%rsp\t\n"
       "mov %[x], %%rdx\t\n"
       "mulx %[y], %[z], %[w]\t\n"
       "mov %[rsp], %%rsp\t\n"
       : [z] "=&r" (z), [w] "=&r" (w)
       : [x] "r" (x), [y] "r" (y), [rsp] "m" (rsp)
       : "rdx"
       );
  return z + w;
}

inline uint64_t with_rbp(uint64_t x, uint64_t y) {
  uint64_t z, w;
  uint64_t rbp;
  asm ("mov %%rbp, %[rbp]\t\n"
       "mov $0x13, %%rbp\t\n"
       "mov %[x], %%rdx\t\n"
       "mulx %[y], %[z], %[w]\t\n"
       "mov %[rbp], %%rbp\t\n"
       : [z] "=&r" (z), [w] "=&r" (w)
       : [x] "r" (x), [y] "r" (y), [rbp] "m" (rbp)
       : "rdx"
       );
  return z + w;
}

int main() {
  uint64_t x = 15, y = 3, zw;
  if (inline_asm_uses_rbp()) {
    zw = with_rsp(x, y);
  } else {
    zw = with_rbp(x, y);
  }
  return zw;
}

理想情况下,if语句应该在编译时编译(但我不认为我可以使用预处理器宏来执行此操作,因为在编译代码之前会对其进行评估)。所以我很好,需要某种跳跃才能让它发挥作用,尽管我宁愿不需要它。

我需要这个的原因是我有一些内联汇编需要能够使用15个寄存器,加上堆栈上的一些内存位置,并且gcc在内联函数的某些位置选择基于rsp的偏移,它在其他地方选择基于rbp的偏移量。 (一个单独的汇编模块不适合这个,因为我想避免函数调用的开销。)

0 个答案:

没有答案
相关问题