Assembly 访问程序集X64函数中的结构字段

Assembly 访问程序集X64函数中的结构字段,assembly,syntax,64-bit,att,Assembly,Syntax,64 Bit,Att,是否可以直接访问汇编函数中的结构字段?我如何通过一个全局变量进行访问 在英特尔语法上的内联汇编中,我可以执行以下操作: 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,

是否可以直接访问汇编函数中的结构字段?我如何通过一个全局变量进行访问

在英特尔语法上的内联汇编中,我可以执行以下操作:

 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;
}

如您所见,
movl(%rdi),%eax
获取结构的元素a,然后
addl4(%rdi),%eax
添加元素b,函数结果在
%eax

中返回。问题是,如果结构布局发生更改,我必须使用汇编代码对其进行更新,使用这种代码的想法是为了避免这种情况。无论如何,谢谢你;)@啊-你是说你想在asm代码中使用实际的结构元素名作为偏移量?
.globl _foo
_foo:
LFB3:
    pushq   %rbp
LCFI0:
    movq    %rsp, %rbp
LCFI1:
    movl    (%rdi), %eax
    addl    4(%rdi), %eax
    leave
    ret