Использование printf при вызове ASM из C - PullRequest
0 голосов
/ 04 июля 2018

Я хотел бы позвонить в ASM (MASM) из C (GCC). Легко! Теперь я хотел бы, чтобы моя функция 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 голосов
/ 05 июля 2018

решение:

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 

спасибо за вашу помощь

...