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

Cコードをgcc(MinGW)でelfにコンパイルし、ASMコードをNASMでコンパイルしています。問題なくコンパイルしていますが、このコードを使用しようとすると(.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ファイルで「externmultiply」の代わりに「globalmultiply」を試してください。ELFにはアンダースコアは必要ありませんが(私は思いません)、Nasmのコマンドラインに「--prefix_」を追加することで、Nasmに「extern」または「global」に自動的にアンダースコアを追加させることができます。

編集:私はそれを取り戻します、「extern」は正しいです。あなたは「メイン」を持っていないようです。gccのコマンドラインに「--nostartfiles」(ハイフンは1つだけ)を追加してみてください。

一番、

フランク

于 2012-07-05T16:34:28.110 に答える