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

如何在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 _purposelike
    
    重新用nasm -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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:27:47