我想从C(GCC)呼叫ASM(MASM)。简单! 现在,我希望我的asm函数能够使用数据并调用诸如printf()之类的函数。
我遇到两个问题:数据部分和对printf()的调用
我在互联网上阅读了一些示例,这些示例与我的完全一样,但似乎并没有失败。欢迎任何帮助。
test.c:
#include <stdio.h>
int64_t asmfunc();
int main() {
asmfunc());
return 0;
}
test.asm
global asmfunc
section .data
msg: db "a very inspired message!",10,0
section .text
extern printf
asmfunc:
mov edi,msg
xor eax,eax
call printf
ret
编译:
nasm -felf64 maxofthree.asm
gcc callmaxofthree.c maxofthree.o
结果:
/usr/bin/ld: maxofthree.o: relocation R_X86_64_32 against `.data' can not
be used when making a shared object; recompile with -fPIC
如果我只是退出printf调用,删除.data节和“ mov edi,msg”,我会得到
/usr/bin/ld: maxofthree.o: relocation R_X86_64_PC32 against symbol
`printf@@GLIBC_2.2.5' can not be used when making a shared object;
recompile with -fPIC
感谢其他编码员
答案 0 :(得分:0)
解决方案:
test.asm
global asmfunc
section .data
msg: db "a very inspired message!",10,0
section .text
extern printf
asmfunc:
lea rdi,[rel msg]
xor rax,rax
call printf wrt ..plt
ret
感谢您的帮助