2011-02-07 68 views
2

是否有可能直接访问程序集函数中的结构体字段?我怎样才能通过汇编访问一个全局变量?在程序集X64函数中访问结构体字段

在英特尔语法内联汇编我可以这样做:

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)做到这一点,如果它是不可能的怎么办我在内联函数中这样做?

回答

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

如果产生的ASM使用gcc -Wall -O1 -m64 -S foo.c -o foo.S我们得到了 “foo” 的功能如下:

.globl _foo 
_foo: 
LFB3: 
    pushq %rbp 
LCFI0: 
    movq %rsp, %rbp 
LCFI1: 
    movl (%rdi), %eax 
    addl 4(%rdi), %eax 
    leave 
    ret 

正如你所看到的,movl (%rdi), %eax获取元素的的结构,然后addl 4(%rdi), %eax添加元素b,函数结果返回%eax

+0

问题是,那种代码是,如果结构布局改变了,我必须去汇编代码来更新它,使用这种代码的想法是避免那种东西。无论如何;) – DVD 2011-02-07 13:27:22

相关问题