やっていること
アセンブリを練習しています。
アーキテクチャ?は x86-64 で、環境は Windows10 64bit 上のWSL(Windows Subsystem for Linux)です。
(情報は十分でしょうか?)
発生している問題・エラーメッセージ
機械的に次のようなアセンブリを作成し、GCC にてアセンブラして実行すると、Segmentation Fault のエラーが発生します。
(長くて無駄なコードが多いので、後ろに手動で無駄なコードを若干削って、処理範囲ごとに適当に改行とコメントを入れたものも載せます。
C言語で該当するコードも載せます。)
assembly
1.intel_syntax noprefix 2.global main 3main: 4 push rbp 5 mov rbp, rsp 6 sub rsp, 0 7 push 2 8 push 1 9 pop rdi 10 pop rsi 11 call add 12 push rax 13 pop rax 14 mov rsp, rbp 15 pop rbp 16 ret 17 pop rax 18 mov rsp, rbp 19 pop rbp 20 ret 21 pop rax 22 23add: 24 push rbp 25 mov rbp, rsp 26 sub rsp, 16 27 mov rax, rbp 28 sub rax, 0 29 push rax 30 pop rax 31 mov [rax], rdi 32 mov rax, rbp 33 sub rax, 8 34 push rax 35 pop rax 36 mov [rax], rsi 37 mov rax, rbp 38 sub rax, 0 39 push rax 40 pop rax 41 mov rax, [rax] 42 push rax 43 mov rax, rbp 44 sub rax, 8 45 push rax 46 pop rax 47 mov rax, [rax] 48 push rax 49 pop rdi 50 pop rax 51 add rax, rdi 52 push rax 53 pop rax 54 mov rsp, rbp 55 pop rbp 56 ret 57 pop rax 58 mov rsp, rbp 59 pop rbp 60 ret 61 pop rax
無駄を手動で削ったもの:
assembly
1.intel_syntax noprefix 2.global main 3main: 4# プロローグ 5 push rbp 6 mov rbp, rsp 7 8# rdi 第一引数 9# rsi 第二引数 10# 関数呼出し 11 mov rdi, 1 12 mov rsi, 2 13 call add 14 15# エピローグ 16 mov rsp, rbp 17 pop rbp 18 ret 19 20add: 21# プロローグ 22 push rbp 23 mov rbp, rsp 24 sub rsp, 16 25 26# rdi の値を第一引数を表すスタックの位置へ代入 27 mov rax, rbp 28 mov [rax], rdi 29 30# rsi の値を第二引数を表すスタックの位置へ代入 31 mov rax, rbp 32 sub rax, 8 33 mov [rax], rsi 34 35# 二項 + 演算子の左オペランドの値([rbp])をスタックに積む 36 mov rax, rbp 37 mov rax, [rax] 38 push rax 39 40# 二項 + 演算子の右オペランドの値([rbp-8])をスタックに積む 41 mov rax, rbp 42 sub rax, 8 43 mov rax, [rax] 44 push rax 45 46# rdi = 右オペランド 47 pop rdi 48# rax = 左オペランド 49 pop rax 50# rax += rdi 51 add rax, rdi 52 53# エピローグ 54 mov rsp, rbp 55 pop rbp 56 ret
C言語版:
C
1int add (int, int); 2int main (void) { 3 return add(1, 2); 4} 5int add (int lhs, int rhs) { 6 return lhs + rhs; 7}
質問
なぜでしょうか?
解決方法を教えて下さい。
またこのように問題が発生した時のために、アセンブリのデバッグ方法も知りたいです。
回答2件
あなたの回答
tips
プレビュー