【发布时间】:2014-01-22 21:42:17
【问题描述】:
我希望从 ASM 文件中调用 malloc()。
在 ASM 中:
extern malloc
没用。我想链接 CStdLib。
【问题讨论】:
-
什么?我说的是 NASM 文件。你说的是一个 C 文件。我很清楚 C 内部的电话。我喜欢你给我投票的方式,你完全错了。
标签: c assembly malloc nasm standard-library
我希望从 ASM 文件中调用 malloc()。
在 ASM 中:
extern malloc
没用。我想链接 CStdLib。
【问题讨论】:
标签: c assembly malloc nasm standard-library
“没用”到底是什么意思?您需要做的不仅仅是使用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
【讨论】:
nasm -f elf32 -o exec file.asm 和 ld -m elf_i386。这就是我说“没用”时的意思:gyazo.com/c11f7d980d623ee163eb188a8c763cc0
-lc 到 ld。可能还需要-I/lib/ld-linux.so.2 或您的系统放置的任何位置。