Cześć. Jak wywołać funkcję printf we wstawce asemblera?
Wywołanie:
asm("call printf");
daje:
undefined reference to `printf'
Sprawdzałem, inne instrukcje niewywołujące funkcji działają. Należało dodać do opcji kompilatora -masm=intel.
Cześć. Jak wywołać funkcję printf we wstawce asemblera?
Wywołanie:
asm("call printf");
daje:
undefined reference to `printf'
Sprawdzałem, inne instrukcje niewywołujące funkcji działają. Należało dodać do opcji kompilatora -masm=intel.
W jaki sposób to kompilujesz? U mnie mam program
#include <stdio.h>
int main() {
asm("call printf");
}
Kompiluję przez gcc prog.c
, bez problemu. (wywala się w trakcie uruchomienia, ale to nic dziwnego, bo argumentów nie ustawiłem na poprawne).
dwie wstawki asm
wrzucam tak dla przykładu. Składnia jest AT&T (nie należy do przyjemnych), dla kompilatora MinGW (czy jak to tam się pisze)
int a, b, c;
int main(void)
{
cin >> a;
cin >> b;
asm
(
"movl _a, %eax \n"
"movl _b, %ebx \n"
"addl %eax, %ebx \n"
"movl %ebx, _c \n"
);
std::cout << c << std::endl;
return 0;
}
Drugi przykład
int main(void)
{
asm("movl $4, %eax \n"
"movl $1, %ebx \n"
"movl $napis, %ecx \n"
"movl $len, %edx \n"
"int $0x80 \n"
"movl $1, %eax \n"
"movl $0, %ebx \n"
"int $0x80 \n"
"napis: \n"
".string \"hello world\\n\" \n"
"len = .-napis \n");
std::cout << std::endl;
return 0;
}
ten kod już nie skompiluje się na x64 (przynajmniej u mnie)
int a, b, c;
int main(void)
{
cin >> a;
cin >> b;
asm("movl a, %eax \n"
"movl b, %edx \n"
"addl %eax, %edx \n"
"movl %edx, c");
std::cout << c << std::endl;
return 0;
}
a teraz niech wprawne oko znajdzie różnice :P
W jaki sposób to kompilujesz?
Code blocks pod windows:
C++ compiler: mingw32-g++.exe
Linker for dynamics libs: mingw32-g++.exe
Linker for static libs: ar.exe
mingw32-g++.exe -o D:\programowanie\C++\test.exe D:\programowanie\C++\test.o -m32
Sprawa się wyjaśniła. Do wywołań funkcji w windowsie trzeba poprzedzić nazwę funkcji znakiem podkreślenia, czyli w tym przypadku _printf :)