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

Posted

技术标签:

【中文标题】访问程序集 X64 函数中的结构字段【英文标题】:Acessing struct fields within an assembly X64 function 【发布时间】:2011-02-07 12:46:35 【问题描述】:

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

在 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 函数(非内联)中执行此操作,如果无法在内联函数中执行此操作?

【问题讨论】:

【参考方案1】:

对于任何许多类似的问题,最简单的解决方案是用 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得到了struct的元素a,然后addl 4(%rdi), %eax添加了元素b,函数结果在%eax中返回。

【讨论】:

问题在于,这种代码是如果结构布局发生变化,我必须去汇编代码来更新它,使用这种代码的想法是避免那种东西。无论如何谢谢;) @DVD: 啊 - 你的意思是你想在你的 asm 代码中使用实际的结构元素名称作为偏移量?

以上是关于访问程序集 X64 函数中的结构字段的主要内容,如果未能解决你的问题,请参考以下文章

跨平台程序集 ((x64 || x86) && (Microsoft x64 || SystemV))

x64 程序集优化

x64 应用程序可以使用 x86 程序集吗?反之亦然?

访问修饰符

C#关键字:访问修饰符

使用 Side-by-Side 程序集加载 x64 或 x32 版本的 DLL