質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.00%

アセンブリ言語 実行ファイル生成やりかた

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 207

kazuyakazuya

score 121

知恵袋でも質問しているのですが
(話のレベルが低・・・)
回答がつかないので解決方法を教えてほしいです。

MinGWを導入し、コンパイルできる環境を構築しました。

#include <stdio.h>

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.amain.o:(text.startup + 0xa0): `WinMain @ 16 'への未定義の参照


OSの問題ですか?(システムコールとかの)

今回はどこに勘違いがあるのでしょうか?

ご教授お願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • cateye

    2019/10/22 18:31 編集

    Windowsの場合は”WinMain”からmain()が呼ばれます。従ってそれが見つからない(リンクできない)と言っているのだと思います。

    キャンセル

  • kazuyakazuya

    2019/10/22 19:02

    ありがとうございます。OSの問題なのですね・・・

    キャンセル

  • asm

    2019/10/22 19:20

    msys2だとビルド通っちゃったから多分Mingw版固有もしくはバージョン的な問題のようです。
    環境作るの面倒なので憶測ですが、mainを_mainに書き換えると通るかも

    キャンセル

  • kazuyakazuya

    2019/10/22 19:26

    あ、mainを_mainにしたらできました。
    ありがとうございます!

    キャンセル

回答 2

checkベストアンサー

+1

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が実行時のエントリーポイントになるので、それがリンクされていないとのエラーです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/22 19:01

    回答ありがとうございます。

    OSの問題でしたか・・・
    仮想環境を整えたいところですが
    メインのパソコンはスタックフレーム破壊したせいで
    壊れてしまったんです。

    それで予備のタブレットパソコンを使用しているのですが
    メモリが圧倒的に足りない・・・

    なので、意地でもwindows GASという条件でアセンブリ言語を体験したいのですが

    CやRubyと違って全然(?)参考資料が見つかりません。
    (形式・OSによって左右される)

    うーん、アセンブリ言語想定外のところで難易度高いですね・・・。

    キャンセル

  • 2019/10/22 19:11 編集

    シェルコードを抜きにすれば、Windows環境でアセンブリ言語でのプログラミングを体験するのはそれほど難しいことではありません。int 80hの部分をMessageBoxなどのWindows APIや、printfなどのC言語ランタイムライブラリの呼び出しに変えるようなかたちになります。
    「GAS Windows アセンブリ言語プログラミング」などと検索すれば様々な記事がヒットしますが、デバッグ環境も含めて少し腰をすえて環境構築をする必要はあると思います。

    キャンセル

  • 2019/10/22 19:25

    ありがとうございます。

    キャンセル

+1

MinGW なら、main ではなく _main でしょう。

        .text
msg:    .ascii  "hello world\n"
msgend: .equ    len, msgend - msg
        .globl  _main
_main:
        subl    $12, %esp
        movl    $len, 8(%esp)
        movl    $msg, 4(%esp)
        movl    $1, (%esp)
        call   _write
        addl    $12, %esp
        ret


ライブラリの write を呼び出すのでシェルコードとしては使えないでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/23 05:23

    回答ありがとうございます。

    シェルコードはいったん置いておいて

    アセンブリ言語を少しは理解できるようにということで

    やってみました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる