【发布时间】:2012-10-26 14:40:19
【问题描述】:
我正在尝试以 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"
);
【问题讨论】:
-
为什么? C代码中
s.a[index]有什么问题? -
因为上面是一个较小的例子,实际上 asm 块很大,包含更多的指令和几个跳转。因为这不是我第一次需要这种效果。
-
好的,如果它是一个大块的程序集,我会考虑将它放在一个单独的 .asm 文件中,让 C 代码计算并传递所需的参数。您无法在汇编中更有效地计算地址,所以对我来说,这似乎是我们可以避免的复杂情况。
-
嗯,结构体在 C 和 asm 代码中都使用,所以我需要在两者之间有相同的偏移量。
标签: c gcc inline-assembly i386