访问程序集 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 函数中的结构字段的主要内容,如果未能解决你的问题,请参考以下文章