访问程序集X64函数中的struct字段

时间:2011-02-07 12:46:36

标签: assembly syntax 64-bit att

是否可以直接访问汇编函数中的struct字段?我如何通过汇编访问全局变量?

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

如果不能在内联函数中执行此操作,如何在装配x64函数(非内联)中使用ATT语法(gcc)执行此操作?

1 个答案:

答案 0 :(得分:3)

对于任何类似的问题,最简单的解决方案是在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中返回函数结果。