2011-02-07 66 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

相關問題