2012-07-05 47 views
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的)和ASM代碼的NASM給小精靈。我編譯它沒有任何問題,但是當我試圖用這個代碼(用於創建.bin文件):

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

我收到此錯誤: My error

是否有人知道如何從ASM代碼調用C函數,編譯它並將其鏈接到工作的.bin文件?請幫忙。

回答

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 
+0

+1 @user也見:http://stackoverflow.com/questions/1034852/adding-leading-underscores-to-assembly-symbols-with-gcc-on -win32 – 2012-07-05 12:22:58

1

嘗試 「全球乘法」,而不是 「外部繁衍」 在你的.asm文件。您不應該需要ELF的下劃線(我不認爲),但是您可以通過在Nasm的命令行中添加「--prefix _」來自動爲「extern」或「global」添加下劃線。

編輯:我回過頭來,「extern」是正確的。你似乎沒有一個「主」。嘗試向gcc的命令行添加「--nostartfiles」 (可能只有一個連字符)。

最佳,

弗蘭克