如何在NASM汇编程序中调用C语言编译的purposelike函数?
问题描述
我有一个由C语言编写的函数int purposelike(int a, int b)生成的blackbox-26.obj文件。需要编写NASM汇编程序,通过push传递两个参数调用该函数,再处理存储返回值的eax寄存器。我尝试编写如下代码:
... extern purposelike ... section .text global start start: push dword 456 push dword 123 call purposelike ...
随后在命令行执行nasm -f win32 l6.asm,但执行golink /console /entry:start l6.obj msvcrt.dll时出现错误:
error!
The following symbol was not defined in the object file or files:-
purposelike
output file not made
解决方法
- 链接时必须包含函数定义所在的目标文件:你当前的GoLink命令只链接了自己的汇编目标文件和运行时库,
purposelike函数的定义在blackbox-26.obj里,必须把这个文件加入链接命令,正确命令为:golink /console /entry:start l6.obj blackbox-26.obj msvcrt.dll - 匹配C语言的函数名修饰规则:Win32平台下,C编译器会给函数名添加下划线前缀(比如
purposelike会被修饰为_purposelike)。如果上述命令仍报错,修改NASM代码中的声明和调用:
重新用; 替换原来的extern语句 extern _purposelike ... ; 替换原来的call语句 call _purposelikenasm -f win32 l6.asm编译后,再执行修正后的链接命令。 - 确认目标文件平台格式一致:确保
blackbox-26.obj是Win32格式(和NASM生成的l6.obj平台匹配)。如果blackbox-26.obj是64位文件,需要改用nasm -f win64编译汇编代码,并调整GoLink命令适配64位环境。
内容的提问来源于stack exchange,提问作者Ecstasy for you
相关产品推荐
相关产品推荐

