2

stdio.hを含めずに「printf」を直接呼び出す方法は?

ここで興味深いチュートリアルを見つけました: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'への未定義の参照

これを修正する方法は?

4

4 に答える 4

9

の宣言をprintfプログラムにコピーできます。Cでは、他のファイルを含めることは、そのテキストをプログラムにコピーアンドペーストするだけです。したがって、自分でコピーアンドペーストを行うことで、この仕事を行うことができます。

extern int printf (const char* format, ...);

int main()
{
  printf("Hello, world!\n");
  return 0;
}

リンカーは、プログラムがデフォルトでリンクされているライブラリで適切な定義を確実に見つけます。

于 2009-09-27T09:57:25.060 に答える
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);
    */
}
于 2009-09-27T13:09:13.907 に答える
2
int main() {

    char ss[] = "hello";
    char *p = ss;

    asm (
        "movl %0, (%%esp);"
        "call _printf;" : "=r" (p)
    );

    return 0;
}
于 2009-09-27T10:34:03.270 に答える
-4

とても簡単です printf ステートメントを使用して 1 つの C プログラムを作成し、プログラムを .c 拡張子で保存してプログラムを実行します。

于 2010-10-28T10:43:17.280 に答える