我正在尝试用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"
);
答案 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;
}