是否可以在汇编函数中直接访问结构体字段?如何通过程序集访问全局变量?
在 intel 语法的内联汇编中,我可以这样做:
struct str
{
int a;
int b;
}
int someGlobalVar;
__declspec(naked) void __fastcall func(str * r)
{
__asm
{
mov dword ptr [ecx].a, 2
mov dword ptr [ecx].b,someGlobalVar
}
}
如何使用 ATT 语法 (gcc) 在汇编 x64 函数(非内联)中执行此操作,如果不可能在内联函数中执行此操作?
最佳答案
对于许多类似的问题,最简单的解决方案是用 C 编写一个示例来执行您想要的操作,然后使用 gcc -m64 -S ... 生成汇编程序源代码,然后使用该源代码作为您自己的汇编代码的模板。
考虑以下示例:
#include <stdio.h>
typedef struct
{
int a;
int b;
} S;
int foo(const S *s)
{
int c = s->a + s->b;
return c;
}
int main(void)
{
S s = { 2, 2 };
printf("foo(%d, %d) = %d\n", s.a, s.b, foo(&s));
return 0;
}
如果我们使用gcc -Wall -O1 -m64 -S foo.c -o foo.S
生成asm,我们会得到“foo”函数的以下内容:
.globl _foo
_foo:
LFB3:
pushq %rbp
LCFI0:
movq %rsp, %rbp
LCFI1:
movl (%rdi), %eax
addl 4(%rdi), %eax
leave
ret
如您所见,movl (%rdi), %eax
获取结构体的元素 a,然后 addl 4(%rdi), %eax
添加元素b,函数结果返回到%eax
中。
关于assembly - 访问程序集 X64 函数中的结构字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4921440/