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

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

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

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

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

602閲覧

スタック(LIFO)の使用する際の動作

asmmuzuiyooo

総合スコア6

アセンブリ言語

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

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/01/30 15:56

編集2020/01/31 13:44

###内容

asm

1push ebp 2mov ebp, esp 3sub esp, 50h
  • 解説内容(リバースエンジニアリングバイブル コード再創造の美学)

![解説の内容

###問題点
sub esp, 50hからの説明が理解出来ず質問した次第です
本書は初心者向けの技術者と前書きにあり読んでいたのですが、自分には理解出来なかったので、解説して貰いたいです。また何の知識が足りていないから理解出来ていないのかも分からず抽象的な質問で申し訳ないです。

  • 現状の自分のイメージ

現状の自分のイメージ

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

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

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

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

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

otn

2020/01/30 15:59

どの部分がわからないのでしょうか?
asmmuzuiyooo

2020/01/30 16:09

sub esp, 50hからの説明が理解出来ない感じです。 espから50hを引くのはわかるのですが、なぜ引いた分がスタックを使用することになるのでしょうか?  そして、それ以降の つまり、50hの容量のローカル変数を使用することになる。 この時点で〜一番上にあり、最初のアドレスになった。 ↑ 最初のアドレスとはスタックの一番上ということでしょうか? そしてサイズを〜しているので、最終的ににローカル変数はマイナスを使って計算できる。... ↑ 何がわからないのかわからないです…
otn

2020/01/30 16:24

スタックとは何かがわからないということですか?
asmmuzuiyooo

2020/01/31 05:43

すみません 質問するサイトを探し、ここを見つけて殴りで質問してしまいました。
episteme

2020/01/31 12:57

ところで LFIO じゃないよ。 LIFO (Last-in First-out) だよ。
asmmuzuiyooo

2020/01/31 13:43

ミスってました 直しときます
guest

回答2

0

ベストアンサー

倣って図を書いてみました.
動作例

「EBPを基準にしてオフセットを足したり引いたりする作業で、スタックの処理が出来るようになる」という表現がマズいのかもしれません.
このコードでの"EBPを基準にしてオフセットを足したり引いたりする作業"は(スタック内に作った)ローカル変数へのアクセスであって, いわゆる"スタック"の処理ではありません.

投稿2020/01/30 19:02

編集2020/01/30 19:16
jimbe

総合スコア12646

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

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

asmmuzuiyooo

2020/01/31 05:44

有難うございます わかりやすかったです
guest

0

かなり飛躍した私の想像ではあるのですが、抽象的なデータ構造としてのスタックとそれを実現する仕組みが繋がっていないとこの本の説明では躓きそうな気がします。

メモリの特定の場所を ESP が指していて、それを「スタックのテッペンということにする」という約束によってスタックとしての挙動を実現しているわけです。 ですから、 ESP を減算するということはスタックの頭が高くなるということを意味します。 それだけでは意味のあるデータは積まれてはいませんが、空っぽの場所が出来るのでそこをローカル変数の格納場所として使うということです。

そしてスタックは様々な処理で積んだり下ろしたりするので今の関数のローカル変数として使う分の基準にするために EBP をしおりのように挟んでおくという感じです。

質問者自身も何がわからないのかわからないということを自覚しているようなので、とりあえず私なりに初心者が躓きそうなところを想像して書きましたが、聞きたかったことはこんな感じでしょうか?

投稿2020/01/30 16:29

編集2020/01/30 16:31
SaitoAtsushi

総合スコア5444

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

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

asmmuzuiyooo

2020/01/30 17:16

なるほど 素晴らしい 自分が求めてたわからない何かが理解出来た気がします つまりebp-4というのはスタックのebpから上に4バイト積み上げた場所という理解であってますか? 自分の今の認識を画像で書いてみたので確認してもらいたいです
SaitoAtsushi

2020/01/30 17:40

図の ③ の ESP が括弧書きになっているのはどういう意図でしょうか。 50h の大きさの領域の上端を指しているのが ESP です。 それを除けばこの図で状況を表せていると思います。 初心者向けならこういう図は本に載っているべきですね。
jimbe

2020/01/30 18:06 編集

横から失礼します. 1番に書かれている EBP は ESP の間違いかと思います. その状態から EBP を保存しますので2番の EBP/ESP も逆でしょうか. 1番の ESP から -4(EBPが4バイトレジスタの場合)され, その位置に EBP の値が保存されます. そして, EBP に ESP を設定し, 3番で ESP から 50h を引くことで斜線の領域を作りますので, ESP は斜線の領域の上辺を指し, EBP は領域の下辺を指すことになります. ですので EBP-4 や EBP-8 が各4バイト変数を指すことになるのではないでしょうか.
asmmuzuiyooo

2020/01/31 05:45

とてもわかりやすいです。 有難うございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問