从C

时间:2018-07-04 15:51:56

标签: assembly compilation

我想从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

感谢其他编码员

1 个答案:

答案 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 

感谢您的帮助