Доступ к структурам полей в сборочной функции X64 - PullRequest
2 голосов
/ 07 февраля 2011

Можно ли получить прямой доступ к полям структуры внутри функции сборки? И как я могу получить доступ через сборку к глобальной переменной?

Во встроенной сборке по синтаксису 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 Ответ

3 голосов
/ 07 февраля 2011

Для решения всех подобных проблем проще всего написать пример на 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 получает элемент a структуры, а затем addl 4(%rdi), %eax добавляет элемент b, и результат функции возвращается в %eax.

...