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

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

新規登録して質問してみよう
ただいま回答率
85.48%
アセンブリ言語

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

GDB

GDBはGNUソフトウェアシステムのための標準的なデバッガーです。

Q&A

解決済

1回答

885閲覧

アセンブリ言語(The GNU Assembly)でタイマー(マイコン全く関係なし)

binary

総合スコア33

アセンブリ言語

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

GDB

GDBはGNUソフトウェアシステムのための標準的なデバッガーです。

0グッド

0クリップ

投稿2018/04/09 09:24

編集2018/04/09 09:33

アセンブリ言語とtime関数を使用してタイマーを作ろうとしているのですが、gdbで確認すると、自分の思ったとおりの動作で問題無く最後まで動作するのですが、いざ./program で動作させてみるとSegmentation fault (コアダンプ)が発生します。これはどのように捉えれば良いのでしょうか?また、動作させるにはどうすればいいでしょうか?
これがそのプログラムです。

.bss .comm sbuffer,8 .comm mbuffer,8 .data output1: .string "こちらはタイマーです。\n" output2: .string "分:" output3: .string "秒:" output4: .string "時間終了\n" output5: .string "時間を入力して下さい\n" coded: .ascii "%d\0" .text .globl _main _main: pushl %ebp movl %esp, %ebp subl $32, %esp xorl %eax, %eax getinput0: pushl $output1 call _printf getinput1: pushl $output5 call _printf getinput2: /*時間の所得*/ pushl $output2 call _printf pushl $mbuffer pushl $coded call _scanf pushl $output3 call _printf pushl $sbuffer pushl $coded call _scanf xorl %eax, %eax main1: /*秒への変換*/ movl $mbuffer, %esi movb (%esi), %al movb $60, %cl mul %cl movl $sbuffer, %esi movl (%esi), %ecx addl %ecx, %eax main2: movl %eax, %ebx pushl $0 call _time addl %eax, %ebx main3: /*タイマー部分*/ pushl $0 call _time cmpl %ebx, %eax ja main4 jmp main3 main4: pushl $output4 call _printf leave ret

自分の実行環境は
Cygwin 7.10.1-1
GDB  7.10.1
です

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

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

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

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

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

guest

回答1

0

ベストアンサー

printf とか scanf とか使ってるけど、Cのライブラリ使ってる、にしては呼び出し規約がおかしいような。
ライブラリはなにを使ってる?
んで、こんなコードならスタック食いつぶすだけなので、コケて当然かと。

投稿2018/04/09 09:42

y_waiwai

総合スコア87749

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

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

binary

2018/04/09 10:15

回答ありがとうございます。 スタック食いつぶすと言われて、問題点がわかりました。 pushl %0をmove $0x00, (%esp)に変更すると期待通りの動作をしました。 c言語をアセンブラ言語にしたときに、なぜpush命令を使わずmove命令で引数を渡していたのかわかりました。本当に勉強になりました。 ありがとうございます。
binary

2018/04/09 10:16

move命令→mov命令
y_waiwai

2018/04/09 10:38

GDBでみてるなら各呼び出し前後でスタックポインタの値みてみる。増え続ける、減り続けるならヤバイ。 そんで、「呼び出し規約 GCC」かなんかでぐぐるべし
binary

2018/04/09 12:06

アドバイスありがとうございます。呼び出し規約しらべてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問