gccでインラインasm機能をテストしたいと思います。そのため、ubuntu 12.04 64ビットで次のコードを入力してコンパイルしましたが、実行時にシステムに「セグメンテーション違反」が画面に表示されます。問題の原因がわかりません。
#include <stdio.h>
char Format[]="Hello world %d\n";
int main()
{
asm
(
"movl $3,4(%esp);"
"movl $Format,(%esp);"
"call printf;"
);
return 0;
}
プログラム初心者を助けてくれてありがとう。このコードを書くためのIDEとしてCode::blocksを使用しています。%rdxなどの64ビットレジスタを使用しようとしましたが、ビルドメッセージのログに、コードのコンパイル時に「エラー:レジスタ名 `%rdx'が不正です」と表示されます。これは、Code ::blocksによって呼び出されるgccが32ビットバージョンであるため、それらのレジスタを認識できないことを意味すると思います。スタックスペースを予約するようにコードを変更します
#include <stdio.h>
char Format[]="Hello world %d\n";
int main()
{
asm
(
"subl $8,%esp;" //I don't know $4, $8, $12, $16, $20 which is correct
//but I had tried them all but results are still ''segmentation fault."
"movl $3,4(%esp);"
"movl $Format,(%esp);"
"call printf;"
"movl %ebp,%esp;"
);
return 0;
}
コンパイラオプションとして-m32を使用することもできますが、それでも「セグメンテーション違反」が表示されます。
助けてくれてありがとう。