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

32位x86汇编调用C函数时出现未定义引用问题

我的CodeBlocks项目:C与x86汇编的跨语言调用实现

我这个CodeBlocks项目包含两个核心文件:main.c(C语言主文件)和functioninA.s(x86汇编实现文件),两者通过外部函数声明完成跨语言交互,具体内容如下:

1. main.c 文件核心内容

在C文件里,我用extern关键字做了两类关键声明:

  • 声明要调用的汇编函数_galoislfsrina,让C代码能直接调用汇编实现的底层逻辑
  • 声明供汇编代码调用的C函数sprintfkeys(),让汇编可以复用C语言的函数实现
// main.c 关键代码片段
extern void _galoislfsrina(unsigned int seedIN, int charCount, ...); // 示例参数声明,可根据实际需求调整
extern void sprintfkeys(...); // 供汇编调用的C函数

// 项目其他业务逻辑代码...

2. functioninA.s 文件汇编代码

汇编文件里定义了_galoislfsrina函数,同时声明了要调用的C函数sprintfkeys,核心实现代码如下:

.global _galoislfsrina
.extern sprintfkeys

_galoislfsrina:
    pushl %ebp          # 保存旧基址寄存器,建立栈帧
    movl %esp, %ebp     # 设置新基址寄存器指向当前栈顶
    movl 8(%ebp), %ebx  # 从栈中获取第一个参数seedIN,存入ebx寄存器
    movl %ebx, %esi     # 复制seedIN到esi寄存器,用于后续操作
    movl 12(%ebp), %ecx # 从栈中获取第二个参数charCount,存入ecx寄存器
    movl 16(%ebp), %... # 此处代码未完成,需补充目标寄存器及对应参数的注释
    # 后续汇编逻辑代码...

关键细节说明

  • .global _galoislfsrina:将汇编函数标记为全局可见,确保C代码在链接阶段能找到并调用它
  • .extern sprintfkeys:告诉汇编器该函数由外部C代码实现,需要在链接阶段完成地址解析
  • 这里采用x86的cdecl调用约定:参数通过栈传递,%ebp作为基址寄存器,栈偏移8(%ebp)对应第一个参数(因为pushl %ebp和call指令会占用栈空间)

内容的提问来源于stack exchange,提问作者Giorgi Aptsiauri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:23:18