You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否从C语言中访问NASM定义的结构体?

解决方案

核心思路:让C结构体与NASM结构体内存布局完全对齐

NASM的struc会按成员顺序分配偏移量:.a resq 1表示成员a占8字节(偏移地址0),.b resq 1偏移8字节,.c resq 1偏移16字节。只要C语言的结构体成员类型、顺序完全匹配,两边就能无缝访问同一块内存区域。

具体实现

  1. 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;
}
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 01:27:15