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

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

新規登録して質問してみよう
ただいま回答率
87.20%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

アセンブリ言語

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

WSL(Windows Subsystem for Linux)

WSL (Windows Subsystem for Linux) は、Windows10のOS上でLinux向けのバイナリプログラムを実行可能にする機能です。また、WindowsOSのAPIを用いた仕組みを提供しており、Linux側からWindowsOSへのファイルアクセスもできます。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

解決済

アセンブリが Segmentation Fault になる

tails
tails

総合スコア22

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

アセンブリ言語

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

WSL(Windows Subsystem for Linux)

WSL (Windows Subsystem for Linux) は、Windows10のOS上でLinux向けのバイナリプログラムを実行可能にする機能です。また、WindowsOSのAPIを用いた仕組みを提供しており、Linux側からWindowsOSへのファイルアクセスもできます。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

2回答

0評価

2クリップ

2296閲覧

投稿2020/07/03 02:15

編集2020/07/03 03:36

やっていること

アセンブリを練習しています。
アーキテクチャ?は x86-64 で、環境は Windows10 64bit 上のWSL(Windows Subsystem for Linux)です。
(情報は十分でしょうか?)

発生している問題・エラーメッセージ

機械的に次のようなアセンブリを作成し、GCC にてアセンブラして実行すると、Segmentation Fault のエラーが発生します。
(長くて無駄なコードが多いので、後ろに手動で無駄なコードを若干削って、処理範囲ごとに適当に改行とコメントを入れたものも載せます。
C言語で該当するコードも載せます。)

assembly

.intel_syntax noprefix .global main main: push rbp mov rbp, rsp sub rsp, 0 push 2 push 1 pop rdi pop rsi call add push rax pop rax mov rsp, rbp pop rbp ret pop rax mov rsp, rbp pop rbp ret pop rax add: push rbp mov rbp, rsp sub rsp, 16 mov rax, rbp sub rax, 0 push rax pop rax mov [rax], rdi mov rax, rbp sub rax, 8 push rax pop rax mov [rax], rsi mov rax, rbp sub rax, 0 push rax pop rax mov rax, [rax] push rax mov rax, rbp sub rax, 8 push rax pop rax mov rax, [rax] push rax pop rdi pop rax add rax, rdi push rax pop rax mov rsp, rbp pop rbp ret pop rax mov rsp, rbp pop rbp ret pop rax

無駄を手動で削ったもの:

assembly

.intel_syntax noprefix .global main main: # プロローグ push rbp mov rbp, rsp # rdi 第一引数 # rsi 第二引数 # 関数呼出し mov rdi, 1 mov rsi, 2 call add # エピローグ mov rsp, rbp pop rbp ret add: # プロローグ push rbp mov rbp, rsp sub rsp, 16 # rdi の値を第一引数を表すスタックの位置へ代入 mov rax, rbp mov [rax], rdi # rsi の値を第二引数を表すスタックの位置へ代入 mov rax, rbp sub rax, 8 mov [rax], rsi # 二項 + 演算子の左オペランドの値([rbp])をスタックに積む mov rax, rbp mov rax, [rax] push rax # 二項 + 演算子の右オペランドの値([rbp-8])をスタックに積む mov rax, rbp sub rax, 8 mov rax, [rax] push rax # rdi = 右オペランド pop rdi # rax = 左オペランド pop rax # rax += rdi add rax, rdi # エピローグ mov rsp, rbp pop rbp ret

C言語版:

C

int add (int, int); int main (void) { return add(1, 2); } int add (int lhs, int rhs) { return lhs + rhs; }

質問

なぜでしょうか?
解決方法を教えて下さい。
またこのように問題が発生した時のために、アセンブリのデバッグ方法も知りたいです。

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

cateye

2020/07/03 09:45 編集

えっと、リンクしてますよね?・・・・mainの呼び出しがないようですが?・・・後始末も。
tails

2020/07/15 00:51

リンクはしています。 このアセンブリは実行ファイル全体ではなく、単体のファイルで、リンクすることで実行可能ファイルに main の呼び出しが追加されています。 とりあえず main は呼べています。 エラーは「Segmentation Fault」であり、ある程度コードを削ると、エラーが消えるため。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

アセンブリ言語

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

WSL(Windows Subsystem for Linux)

WSL (Windows Subsystem for Linux) は、Windows10のOS上でLinux向けのバイナリプログラムを実行可能にする機能です。また、WindowsOSのAPIを用いた仕組みを提供しており、Linux側からWindowsOSへのファイルアクセスもできます。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。