能否从C语言中访问NASM定义的结构体?
解决方案
核心思路:让C结构体与NASM结构体内存布局完全对齐
NASM的struc会按成员顺序分配偏移量:.a resq 1表示成员a占8字节(偏移地址0),.b resq 1偏移8字节,.c resq 1偏移16字节。只要C语言的结构体成员类型、顺序完全匹配,两边就能无缝访问同一块内存区域。
具体实现
- C语言中的结构体声明
直接定义与NASM布局完全一致的C结构体:
typedef struct { long long a; // 对应NASM的MyStruct.a,偏移0 long long b; // 对应NASM的MyStruct.b,偏移8 long long c; // 对应NASM的MyStruct.c,偏移16 } MyStruct;
之后就能像你期望的那样编写C代码:
void cfunc(MyStruct* s){ s->a = 1; s->b = 2; s->c = 3; }
- NASM中保持原有写法
依然可以正常使用mov rax, [rbx + MyStruct.a]这类指令,因为C结构体的成员偏移与NASM struc的偏移完全一致,内存布局没有任何差异。
无需转换头文件的替代方案
如果不想编写C结构体,也可以在C里直接用宏定义偏移量:
#define MyStruct_a 0 #define MyStruct_b 8 #define MyStruct_c 16 void cfunc(void* s){ *(long long*)((char*)s + MyStruct_a) = 1; *(long long*)((char*)s + MyStruct_b) = 2; *(long long*)((char*)s + MyStruct_c) = 3; }
但这种写法可读性差、容易出错,远不如结构体的方式直观可靠。
内容的提问来源于stack exchange,提问作者Gordon Zar
相关产品推荐
相关产品推荐

