Для решения всех подобных проблем проще всего написать пример на 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
.