🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Q&A

解決済

2回答

3836閲覧

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

kazuyakazuya

総合スコア193

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

0グッド

0クリップ

投稿2019/10/22 08:57

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

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

c

1#include <stdio.h> 2 3int main(void){ 4return 0; 5}

gcc -S sample.cでアセンブラファイルを出力

s

1.file "sample.c" 2 .def ___main; .scl 2; .type 32; .endef 3 .text 4 .globl _main 5 .def _main; .scl 2; .type 32; .endef 6_main: 7LFB10: 8 .cfi_startproc 9 pushl %ebp 10 .cfi_def_cfa_offset 8 11 .cfi_offset 5, -8 12 movl %esp, %ebp 13 .cfi_def_cfa_register 5 14 andl $-16, %esp 15 call ___main 16 movl $0, %eax 17 leave 18 .cfi_restore 5 19 .cfi_def_cfa 4, 4 20 ret 21 .cfi_endproc 22LFE10: 23 .ident "GCC: (MinGW.org GCC-6.3.0-1) 6.3.0"

as -o sample sample.sよりオブジェクトファイル生成

o

1コピペ不可能でした。

gcc -o sample sample.o
よりオブジェクトファイルの生成ができるようになりました。

私がやりたいのは

リンク内容

こちらのサイトで紹介されている
アセンブリ言語 Hello Worldを実行ファイルにして、実行させてみたいです。

s

1.file "hello.s" 2.data 3msg: .ascii "hello world\n" 4msgend: .equ len, msgend - msg 5 6.bss 7.text 8.globl main 9main: 10 movl $4, %eax # write system call(sys_write) 11 movl $1, %ebx # arg1:stdout 12 movl $msg, %ecx # arg2:str 13 movl $len, %edx # arg3:strlen 14 int $0x80 # system call 15 ret

形式は同じのはずです。

で、やってみると
(ファイル名 a)
as -o a.o a.sよりオブジェクトファイル生成(エラーなし)

オブジェクトファイルから実行ファイル生成

cmd

1C:\Users\u16154\Desktop\asemble>gcc -o a a.o 2c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libmingw32.a(main.o):(.text.startup+0xa0): undefined reference to `WinMain@16' 3collect2.exe: error: ld returned 1 exit status

Google翻訳使ったのですが・・・

english

1libmingw32.a(main.o):(。text.startup + 0xa0): `WinMain @ 16 'への未定義の参照

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

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

ご教授お願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2019/10/22 09:33 編集

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

2019/10/22 10:02

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

2019/10/22 10:20

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

2019/10/22 10:26

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

回答2

0

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/22 12:52

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuyakazuya

2019/10/22 20:23

回答ありがとうございます。 シェルコードはいったん置いておいて アセンブリ言語を少しは理解できるようにということで やってみました。
guest

0

ベストアンサー

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 09:34

dodox86

総合スコア9254

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuyakazuya

2019/10/22 10:01

回答ありがとうございます。 OSの問題でしたか・・・ 仮想環境を整えたいところですが メインのパソコンはスタックフレーム破壊したせいで 壊れてしまったんです。 それで予備のタブレットパソコンを使用しているのですが メモリが圧倒的に足りない・・・ なので、意地でもwindows GASという条件でアセンブリ言語を体験したいのですが CやRubyと違って全然(?)参考資料が見つかりません。 (形式・OSによって左右される) うーん、アセンブリ言語想定外のところで難易度高いですね・・・。
dodox86

2019/10/22 10:12 編集

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

2019/10/22 10:25

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問