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

标签 assembly syntax 64-bit att

是否可以在汇编函数中直接访问结构体字段?如何通过程序集访问全局变量?

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

最佳答案

对于许多类似的问题,最简单的解决方案是用 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中。

关于assembly - 访问程序集 X64 函数中的结构字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4921440/

相关文章:

c - _builtin_prefetch()中第二个参数的作用是什么?

android - AOSP的 'lunch'组合是什么意思,需要选择什么?

ms-access - Access 、ADO 和 64 位

c - x86 程序集中的结构分配

linux - 破解linux可执行文件

assembly - 以16位数字作为输入并将其显示在屏幕上

syntax - 'order' 附近的语法不正确。运行总计。 SQL Server 2012

mysql - 使用或不使用 CONSTRAINT

c++ - 仅使用一个#include-expression 一次包含多个头文件?

oracle - 适用于Delphi XE的64位Oracle客户端