2012-04-18 8 views
2
int main() 
{ 
    __asm__("movl $0x1,%%eax; 
      movl $0x0,%%ebx; 
      int $0x80; 
      ":::"eax","ebx"); 
} 

Linuxでexit()の動作をシミュレートしようとしています。しかし、現代のLinuxではexit()の後にいくつかのexitハンドラが呼び出されるので、それを行うことは非常に難しいことがわかります。 私はexit()の古いバージョンを書いています。たぶん10年前にあなたはいくつかのコードでそれを見つけることができます。 gccでコンパイルします。GCCインラインアセンブリに関する奇妙なエラーメッセージ

gcc -o exit exit.c 

これは私にこれらのメッセージを与えます。

exit.c: In function ‘main’: 
exit.c:3:13: warning: missing terminating " character [enabled by default] 
exit.c:3:5: error: missing terminating " character 
exit.c:4:13: error: expected string literal before ‘movl’ 
exit.c:6:27: warning: missing terminating " character [enabled by default] 
exit.c:6:13: error: missing terminating " character 

私は慎重に自分のコードを調べましたが、自分のコードが間違っているとは思わないです。それは何ですか?

答えて

5
あなたが引用符で囲まれた文字列内の改行が埋め込まれていることはできません

// bad 
"two 
lines" 

書き換え

// good 
"two\n" 
"lines" 

としてプリプロセッサは、はい、あなたは正しいです

"two\nlines" 
+0

ありがとうございました。多分私の読書資料の中には間違いがあるかもしれません。 –

1

インラインアセンブリのことを思い出して、セミコロンなどの後に\n\tで各行を終了する必要があります。

説明:
インラインアセンブリの各行を;で終了するだけでは不十分です。インラインアセンブリはgccによって文字列としてアセンブラに直接供給されます。それぞれの行を\nで終了しないと、アセンブラはmovl $0x1,%%eax;movl $0x0,%%ebx;のような文字列を取得します。この文字列は解析できません。 gccはコマンドが\tの前にないアセンブリファイルを処理できるので、おそらく\n\tを使用する必要はありません。

+0

に、シームレスに文字列に参加します。しかし、 \ n \ n \ tはすべてOKです。 –

関連する問題