質問: 知恵袋でも質問しているのですが (話のレベルが低・・・) 回答がつかないので解決方法を教えてほしいです。 MinGWを導入し、コンパイルできる環境を構築しました。 ``` #include int main(void){ return 0; } ``` gcc -S sample.cでアセンブラファイルを出力 ``` .file "sample.c" .def ___main; .scl 2; .type 32; .endef .text .globl _main .def _main; .scl 2; .type 32; .endef _main: LFB10: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 andl $-16, %esp call ___main movl $0, %eax leave .cfi_restore 5 .cfi_def_cfa 4, 4 ret .cfi_endproc LFE10: .ident "GCC: (MinGW.org GCC-6.3.0-1) 6.3.0" ``` as -o sample sample.sよりオブジェクトファイル生成 ``` コピペ不可能でした。 ``` gcc -o sample sample.o よりオブジェクトファイルの生成ができるようになりました。 私がやりたいのは リンク内容 こちらのサイトで紹介されている アセンブリ言語 Hello Worldを実行ファイルにして、実行させてみたいです。 ``` .file "hello.s" .data msg: .ascii "hello world\n" msgend: .equ len, msgend - msg .bss .text .globl main main: movl $4, %eax # write system call(sys_write) movl $1, %ebx # arg1:stdout movl $msg, %ecx # arg2:str movl $len, %edx # arg3:strlen int $0x80 # system call ret ``` 形式は同じのはずです。 で、やってみると (ファイル名 a) as -o a.o a.sよりオブジェクトファイル生成(エラーなし) オブジェクトファイルから実行ファイル生成 ``` C:\Users\u16154\Desktop\asemble>gcc -o a a.o c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libmingw32.a(main.o):(.text.startup+0xa0): undefined reference to `WinMain@16' collect2.exe: error: ld returned 1 exit status ``` Google翻訳使ったのですが・・・ ``` libmingw32.a(main.o):(。text.startup + 0xa0): `WinMain @ 16 'への未定義の参照 ``` OSの問題ですか?(システムコールとかの) 今回はどこに勘違いがあるのでしょうか? ご教授お願いします。
回答: > > OSの問題ですか?(システムコールとかの) > > 今回はどこに勘違いがあるのでしょうか? > > > ご推察のとおり、OSの問題です。 `int 80h` は Linux 32ビット版でのシステムコール(ソフトウェア割り込み)です。Windows OSには適用できません。 teratailの過去の質問回答が参考になるかもしれません。 (。。。と、検索したら回答の一部は私のものでした。手前味噌ですみません) teratail#93287 - nasm システムコールの疑問 そのアセンブリ言語コードでやるなら、32ビット版linux上で試す必要がありますね。 それでもシェルコードとして動作させるなら、障壁は高いでしょうけれども。 Windows上ですと、MinGWで仮にリンクが成功しても、`int`命令の実行時に一般保護違反で落ちるはずです。 > > libmingw32.a(main.o):(。text.startup + 0xa0): `WinMain @ 16 'への未定義の参照 > > > Windows上で動く一般的なプログラムは、シンボル`WinMain`が実行時のエントリーポイントになるので、それがリンクされていないとのエラーです。