如何直接调用“printf”而不包括stdio.h?
我在这里找到了一个有趣的教程:
http://www.halcode.com/archives/2008/05/11/hello-world-c-and-gnu-as/
所以,这是我的尝试:
int main(){
char ss[] = "hello";
asm (
"pushl %ebp ;"
"movl %esp, %ebp ;"
"subl $4, %esp ;"
"movl $ss, (%esp) ;"
"call _printf ;"
"movl $0, %eax ;"
"leave ;"
"ret ;"
);
return 0;
}
我正在使用MinGW 4.4,这是我编译它的方式:
gcc -c hello.c -o hello.o
ld hello.o -o hello.exe C:/mingw/lib/crt2.o C:/mingw/lib/gcc/mingw32/4.4.0/crtbegin.o C:/mingw/lib/gcc/mingw32/4.4.0/crtend.o -LC:/mingw/lib/gcc/mingw32/4.4.0 -LC:/ mingw / lib -lmingw32 -lgcc -lmsvcrt -lkernel32
不幸的是,它失败了:
hello.o:hello.c :(。text + 0x26):未定义对`ss'的引用
如何解决这个问题?
答案 0 :(得分:9)
您可以将printf
的声明复制到您的计划中。在C中,包括其他文件只是将其文本复制粘贴到您的程序中。因此,您可以通过自己进行复制粘贴来完成这项工作。
extern int printf (const char* format, ...);
int main()
{
printf("Hello, world!\n");
return 0;
}
链接器肯定会在库中找到正确的定义,默认情况下,程序与之链接。
答案 1 :(得分:4)
int main(void)
{
char ss[] = "hello";
__asm(
"pushl %[ss]\n" // push args to stack
"call _puts\n"
"addl $4, %%esp\n" // remove args from stack
:: [ss] "r" (ss) // no output args, no clobbered registers
);
/* C equivalent:
extern int puts(const char *);
puts(ss);
*/
}
答案 2 :(得分:2)
int main() {
char ss[] = "hello";
char *p = ss;
asm (
"movl %0, (%%esp);"
"call _printf;" : "=r" (p)
);
return 0;
}
答案 3 :(得分:-3)
非常轻松 然后使用printf语句编写一个c程序 用.c扩展名保存程序 并运行该程序 它会工作.... 即使它可以包含像clrscr(),getch()这样的函数,它们也是conio.h的一部分