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

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

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

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

C

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

Q&A

解決済

4回答

1412閲覧

アセンブリにて、eaxに0を代入する意味

jaguarundi

総合スコア19

アセンブリ言語

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

C

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

0グッド

0クリップ

投稿2019/02/05 05:42

編集2019/02/05 05:49

前提・実現したいこと

アセンブリ言語を勉強しています。
後述のとおり、簡単なC言語のソースをコンパイルし、逆アセンブルしたものを読み解いているのですが、いくつか質問があります。

該当のソースコード

C

1int main(){ 2 int i; 3 i = 1; 4 5 return 0; 6}

これをコンパイルし、逆アセンブルしたものがこちらです。

simple: file format mach-o-x86-64 Disassembly of section .text: 0000000100000f9e <_main>: 100000f9e: 55 push rbp 100000f9f: 48 89 e5 mov rbp,rsp 100000fa2: c7 45 fc 01 00 00 00 mov DWORD PTR [rbp-0x4],0x1 100000fa9: b8 00 00 00 00 mov eax,0x0 100000fae: 5d pop rbp 100000faf: c3 ret

Q1. 逆アセンブルしたソースに出現する" mov eax,0x0"の意味

それまではrbpやrspしかレジスタが登場していないにも関わらず、突如eaxを0に代入する部分の意味があまりよく分かりませんでした。
Cのソースで0が登場しているのは"return 0"の部分ですが、eaxに関連があるのか分かりませんでした。

Q2. DWORD PTR[rbp-0x4]について(※勘違いでした)

~~(元の質問)初歩的な質問になりますが、push rbs, mov rbs, rspが終わった後に出現するDWORD PTRrbp-xは、スタックフレームを確保するためにxバイトだけメモリを確保する(スタックを下位アドレスにむけて伸ばす)と解釈してよろしいのでしょうか。
~~
(自己解決)
DWORD PTR[rbs-x]は、rbsのアドレスからxバイト、下位アドレスの方に向かったところにあるメモリのアドレスに値を入れる、ということでした。
私の質問内容を実現しているのは、
mov rbp, rsp
sub rsp, 0x10
のようにrspを操作してスタックフレームを確保する技術のようです。

独学なので、初歩的な質問ですが、よろしくお願いいたします。

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

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

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

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

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

guest

回答4

0

mov DWORD PTR [rbp-0x4],0x1

スタックをint分開けて、そこをローカル変数(i)のために使ってるってことですね

投稿2019/02/05 06:06

y_waiwai

総合スコア87719

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

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

0

アセンブリ言語は、CPUが直接実行できるプログラム(機械語)に変換される事を前提に設計されています。
CPUに含まれるレジスタは、CPUのハードウェアに依存していますから、CPUの種類が違うと対応するアッセンブリ言語も違ってきます。そのためMIPS用とか、X86用とかいうように対応するCPUの種類名が付いているのが普通です。

質問の逆アセンブリ結果の1行目に"simple: file format mach-o-x86-64"と書かれていますから、このアセンブラは64bit版のX86アーキテクチャのCPU(例えば、インテルのiシリーズ等)用であることが分ります。
X86アーキテクチャのレジスタ構成は、X86アセンブラ/x86アーキテクチャなど、説明しているページがいろいろあります。

「それまではrbpやrspしかレジスタが登場していないにも関わらず、突如eaxを0に代入する部分の意味があまりよく分かりませんでした。」
EAXレジスタはハードウェアとして、X86アーキテクチャのCPUの全てに備わっているものです。アセンブリのコードで定義することで作られる訳ではありません(プログラムを変えたからといって、ICの内部が書き換わったりしないですよね?)。
X86用アセンブリ言語でプログラムを書く際には、基礎知識としてX86アーキテクチャのレジスタ構成などが求められます。

投稿2019/02/05 06:25

coco_bauer

総合スコア6915

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

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

0

  1. 標準的な呼び出し規約ではeaxraxを用いて関数の戻り値を受け渡しします
  2. 伸ばすというよりは用意した(された)領域をiとしてi = 1を実行しています

さらに言うならば上位アドレスへ伸びてますね
よく考えたら上位下位ってどっちがどっちだか決まってない気がしてきましたorz

投稿2019/02/05 06:08

編集2019/02/05 07:03
asm

総合スコア15147

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

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

jaguarundi

2019/02/05 06:23

スタックは常にヒープセグメントやテキストセグメントがある方向に伸びる訳ではないのでしょうか? 私の認識では ・スタックセグメントはメモリの高位アドレスに位置し、下位アドレスの方へ伸びていく という認識なのですが・・・ (頭がこんがらがってきました(・ω・;))
asm

2019/02/05 07:05

すいません、よく考えるとどっちがどっちだか論拠が見つけられませんでした。
jaguarundi

2019/02/05 11:23

いえいえ、私の書き方が悪かったです(・ω・;) 回答ありがとうございました!
guest

0

ベストアンサー

  1. 逆アセンブルしたソースに出現する" mov eax,0x0"の意味

おそらく、return 0;の表現だと思われます。環境によって呼出規約が違ってきますが、x64の場合だと、返り値をrax(下半分がeax)に入れる例が多いです。

2. DWORD PTR[rbp-0x4]について
(中略)スタックフレームを確保するためにxバイトだけメモリを確保する(スタックを下位アドレスにむけて伸ばす)と解釈してよろしいのでしょうか。

いえ、これはi = 1;の意味合いです。DWORD PTR [rbp-0x4]で指定されたメモリの箇所に1を入れています。

投稿2019/02/05 05:53

maisumakun

総合スコア145121

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

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

jaguarundi

2019/02/05 06:03

迅速な回答、ありがとうございました! mov eax, 0x0 がreturn 0を表しているなんて、初見では分かりませんでした(・ω・;) 勉強になりました!
maisumakun

2019/02/05 06:06

mov eax, 0なだけまだマシで、よく「xor eax, eax」で0クリア、ということも行われます(即値がないのでこちらのほうが処理しやすい、とのことです)。
pepperleaf

2019/02/05 10:41

> xor eax, eax 8bit の頃の習慣じゃないですか? 正確には覚えてないけど、mov より、xor の方が速く、語長も短かった。
jaguarundi

2019/02/05 11:23

たまに見かけるxor eax, eaxもそういう目的で使われていたのですね、勉強になります(・ω・;)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問