GCC扩展了asm,struct element offset encoding

时间:2012-11-06 15:45:48

标签: c gcc inline-assembly i386

我正在尝试用GCC样式扩展asm(x86-64目标)编写我的一小段代码,并且在编码结构偏移时遇到问题。

我有struct s个成员size_t a[],指向这样的结构的指针和一个索引都在asm块中生成。

现在我需要在asm

中解决该元素
asm (
    "mov %[displ](%[s], %[index], 8), %%rbx"
    : [s] "+r" (s)
    , [index] "+r" (i)
    : "memory", "cc", "rax", "rbx"
);

如何将displ编码到asm块中?将offsetof(struct s, a)作为立即前缀传递给$,并生成无效的程序集。

asm (
    "mov %[displ](%[s], %[index], 8), %%rbx"
    : [s] "+r" (s)
    , [index] "+r" (i)
    : [displ] "i" (offsetof(struct s, a))
    : "memory", "cc", "rax", "rbx"
);

2 个答案:

答案 0 :(得分:7)

使用%c...操作数修饰符实际上 是可能的:

#include <stddef.h>
#include <stdint.h>

struct s
{
  int a, b;
};

int foo (struct s *s, int i)
{
  int r;
  asm (
       "movl %c[displ](%[s],%[index],8), %[r]\n\t"
       : [r] "=r" (r)
       : [s] "r" (s) , [index] "r" ((uintptr_t)i),
         [displ] "e" (offsetof(struct s, b))
       :
       );

  return r;
}

谢谢,谢谢到期 - 发现here。还有a gcc mailing list posting指的是这个;关键字有“输出替代” stackoverflow发布What does %c mean in GCC inline assembly code?还特别对%c进行了解释。

答案 1 :(得分:2)

您唯一的选择是使用英特尔语法。当然,GCC可以生成类似mov off(base, index, scale)的insn,但是在整个MEM RTL表达式的级别上执行此操作,即没有像个别操作数那样具有偏移量,基数等。

因此,在Intel语法中,使用gcc -c -masm=intel x.c编译以下内容:

#include <stddef.h>

struct s
{
  int a, b;
};

int foo (struct s *s, int i)
{
  int r;
  asm (
       "mov %[r], dword ptr [%[s]+%[index]*8 + %[displ]] "
       : [r] "=r" (r)
       : [s] "r" (s) , [index] "r" (i),
         [displ] "e" (offsetof(struct s, b))
       :
       );

  return r;
}