1

我正在尝试在汇编程序中调用 C 函数。这是我的代码:C:

int multiply(int what)
{
    return what * 2;
}

ASM:

extern multiply

start:
    mov eax, 10
    push eax
    call multiply

    jmp $

;empty 
times 510-($-$$) db 0
dw 0xAA55

我正在通过 gcc (MinGW) 将 C 代码编译为 elf,并通过 NASM 将 ASM 代码编译为 elf。我正在编译它没有任何问题,但是当我尝试使用此代码(用于创建 .bin 文件)时:

gcc -o test.bin work.o test.o

我收到此错误: 我的错误

有人知道如何从 ASM 代码调用 C 函数,编译它并将其链接到工作的 .bin 文件吗?请帮忙。

4

2 回答 2

3

尝试添加 '_' 来相乘:

extern _multiply

在这个简单的例子中为我工作:

global  _main

extern  _printf

section .data

text    db      "291 is the best!", 10, 0
strformat db    "%s", 0

section .code

_main
    push    dword text
    push    dword strformat
    call    _printf
    add     esp, 8
    ret
于 2012-07-05T12:13:41.233 回答
1

在您的 .asm 文件中尝试“全局乘法”而不是“外部乘法”。您不应该需要 ELF 的下划线(我不认为),但是您可以通过在 Nasm 的命令行中添加“--prefix _”来让 Nasm 自动为任何“extern”或“global”添加下划线。

编辑:我收回这一点,“外部”是正确的。您似乎没有“主要”。尝试在 gcc 的命令行中添加“--nostartfiles”(可能只有一个连字符)。

最好的,

坦率

于 2012-07-05T16:34:28.110 回答