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
相关产品推荐
相关产品推荐

