2014-01-22 31 views
1

我期待從ASM文件中調用malloc()。 在ASM中:C StdLib malloc From(N)ASM

extern malloc 

沒有工作。我想鏈接CStdLib。

+1

什麼?我正在談論從NASM文件。你正在談論從C文件。我很清楚C內部的電話。我喜歡你爲我提供的服務,而你完全錯誤。 – Goodies

回答

2

「不起作用」是什麼意思?您需要做的不僅僅是使用extern,您需要鏈接到C庫。最簡單的方法是使用gcc進行鏈接。正如你沒有提到你的代碼是32位還是64位,我將使用32位。該過程對於64位基本相同。

extern exit, printf, malloc, free 

global main 

BUFFER_SIZE  equ 27 

section .data 
fmtstr  db "%s", 10, 0 

section .text 
main: 

    push BUFFER_SIZE 
    call malloc 
    add  esp, 4 * 1 
    mov  esi, eax 

    xor  ecx, ecx 
    mov  edx, 97 

.FillBuffer: 
    mov  byte [esi + ecx], dl 
    inc  edx 
    inc  ecx 
    cmp  ecx, BUFFER_SIZE - 1 
    jne  .FillBuffer 

    mov  byte [esi + ecx], 0 

    push esi 
    push fmtstr 
    call printf 
    add  esp, 4 * 2 

    push esi 
    call free 
    add  esp, 4 * 1 

    push 0 
    call exit 
    add  esp, 4 * 1 

和生成文件:

APP=malloctest 

all: $(APP) clean 

$(APP): $(APP).o  
    gcc -o $(APP) $(APP).o 

$(APP).o: $(APP).asm 
    nasm -f elf $(APP).asm 

clean: 
    rm $(APP).o 

enter image description here

+0

非常感謝您的回覆!但是,我使用以下(x64機器x86代碼)編譯.asm文件:'nasm -f elf32 -o exec file.asm'和'ld -m elf_i386'。這就是我所說的「沒有工作」的意思:http://gyazo.com/c11f7d980d623ee163eb188a8c763cc0 – Goodies

+0

'-lc'到ld。可能還需要'-I/lib/ld-linux.so.2'或者你的系統放在任何地方。 –