(mainadd.c)
#include <stdio.h>
void intadd(int, int, int*);
void main()
{
int a,b,c;
printf("Enter a,b : ");
scanf("%d %d", &a, &b);
intadd(a, b, &c);
printf("Answer = %d\n", c);
}
(intadd.s)
.file "intadd.s"
.text
.align 4
.globl intadd
.type intadd,@function
intadd:
pushl %ebp
movl %esp, %ebp
bpoint1:
movl 16(%ebp), %ebx
movl 8(%ebp), %edx
addl 12(%ebp), %edx
movl %edx, (%ebx)
bpoint2:
#
movl %ebp, %esp
popl %ebp
ret
(comfile)
break main
display/i $pc
display/x $ebx
display/x $edx
display/x $esp
display/x $ebp
>gcc -m32 -o mainadd mainadd.c intadd.s
>gdb -x comfile mainadd
として、
a=1
b=2
を入力してデバッグを行うと、Cのprintf("Answer = %d\n", c);の中で、Segmentation faultがおきてしまいます。一応、以下に示すように%ebxが示すアドレス(cのアドレスが入っている)には、0x3(cの値)が正しく入っている様なのですが、何故か以下の箇所でSegmentation faultが起きてしまう理由が分かりかねています。似たようなご経験のある方で、アドバイス頂けると助かります。
(ここから途中からのデバッグ情報です)
0x56556030 in printf@plt ()
1: x/i $pc
=> 0x56556030 <printf@plt>: jmp *0xc(%ebx)
2: /x $ebx = 0xffffd834
3: /x $edx = 0x3
4: /x $esp = 0xffffd81c
5: /x $ebp = 0xffffd848
(gdb) si
0xffffd860 in ?? ()
1: x/i $pc
=> 0xffffd860: add %eax,(%eax)
2: /x $ebx = 0xffffd834
3: /x $edx = 0x3
4: /x $esp = 0xffffd81c
5: /x $ebp = 0xffffd848
(gdb) si
0xffffd862 in ?? ()
1: x/i $pc
=> 0xffffd862: add %al,(%eax)
2: /x $ebx = 0xffffd834
3: /x $edx = 0x3
4: /x $esp = 0xffffd81c
5: /x $ebp = 0xffffd848
(gdb) si
0xffffd864 in ?? ()
1: x/i $pc
=> 0xffffd864: hlt
2: /x $ebx = 0xffffd834
3: /x $edx = 0x3
4: /x $esp = 0xffffd81c
5: /x $ebp = 0xffffd848
(gdb) si
Program received signal SIGSEGV, Segmentation fault.
0xffffd864 in ?? ()
1: x/i $pc
=> 0xffffd864: hlt
2: /x $ebx = 0xffffd834
3: /x $edx = 0x3
4: /x $esp = 0xffffd81c
5: /x $ebp = 0xffffd848
(gdb) x/x $ebx
0xffffd834: 0x00000003
No.5
- 回答日時:
そうなってるんじゃないかなぁと想像はしてた.
スタックのどこにどのようなデータがあるのか, 図にしてみてみよう. そして「16(%ebp)」や「8(%ebp)」などがなにに対応しているのか, 元の質問文のプログラムと書き換えたあとのプログラムとでそれぞれ考えてみてください.
No.3
- 回答日時:
どのレジスタを壊してよくってどのレジスタを壊しちゃダメなのかは, 調べればわかるはず. 通常 edx は壊しても問題ないんだけど, 「どんなシステムでも問題ない」とはいわないので調べてくれ.
あと, 「ebx をぶち壊した」のがなぜ敗因なのかは理解できているんですよね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Cのオブジェクトファイルの逆アセンブル 5 2023/05/13 01:51
- C言語・C++・C# アセンブラ指令 3 2023/06/17 14:47
- その他(プログラミング・Web制作) x86_32のGASの擬似命令 3 2023/06/07 19:55
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- その他(プログラミング・Web制作) x86_32ビットアセンブラ 2 2023/06/28 17:50
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10個出力で改行したいのですが...
-
strcmp
-
CTRL+Dでループを抜けるには
-
4の倍数を論理演算で表す。。
-
【C言語教えてください】sin波...
-
scanfに文字が入力されたときに...
-
ガウスの消去法、後退代入について
-
C言語プログラミング
-
defineで定数が置き換えられな...
-
printf で二進表示を行いたい。
-
c言語でAからZまでを表示する...
-
分数を表示するプログラム(長...
-
switch分のケースを範囲数?に...
-
カレンダーのプログラムについて
-
C言語初心者です。次の問題で質...
-
C言語です
-
じゃんけんゲームの応用
-
BMI値から体型を判定するプログ...
-
(C言語)めちゃくちゃな値にな...
-
なぜgccはstdio.hをインクルー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語について
-
printf で二進表示を行いたい。
-
cshの文字列操作(0埋め)
-
10個出力で改行したいのですが...
-
コンパイルエラーについて
-
テキストカーソル位置の取得
-
strcmp
-
unsigned int型について
-
c言語でAからZまでを表示する...
-
printf( " %2d", p * q );
-
コマンドラインに出力した文字...
-
printfの出力内の文字をdefine...
-
ホームページをC言語で作りたい...
-
コマンドプロンプトがすぐ消える
-
小数点切捨て表示
-
【C言語教えてください】sin波...
-
switch分のケースを範囲数?に...
-
二つの整数値の大小比較
-
4の倍数を論理演算で表す。。
-
defineで定数が置き換えられな...
おすすめ情報
movl $ebp, %esp
で行っていると思うのですが。
ただ、この場合は、
mov $esp, %ebp
以下で$espの値は変更していません。
ecxかedxを使うと言うことですか?
(1)ebx -> ecx
にするとOKになるのですが、
(2)ebxをそのまま使って、
pushl %ebp
pushl %ebx
.
.
.
popl %ebx
popl %ebp
ret
としても動きそうに思うのですが、Segmentation fault
になってしまうようなのですが、どうしてなのでしょうか?
intadd:
pushl %ebp
push %ebx
movl %esp, %ebp
bpoint1:
movl 16(%ebp), %ebx
movl 8(%ebp), %edx
addl 12(%ebp), %edx
movl %edx, (%ebx)
bpoint2:
#
movl %ebp, %esp
pool %ebx
popl %ebp
ret
intadd:
pushl %ebp
push %ebx
movl %esp, %ebp
bpoint1:
movl 20(%ebp), %ebx
movl 12(%ebp), %edx
addl 16(%ebp), %edx
movl %edx, (%ebx)
bpoint2:
#
movl %ebp, %esp
pool %ebx
popl %ebp
ret