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

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

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

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

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

x86

x86はIntel 8086 CPU シリーズの命令セットアルキテクチャーです。

アーキテクチャ

アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

Q&A

解決済

1回答

2437閲覧

GNUアセンブリのコード解読

akisan55

総合スコア49

アセンブリ言語

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

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

x86

x86はIntel 8086 CPU シリーズの命令セットアルキテクチャーです。

アーキテクチャ

アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

0グッド

0クリップ

投稿2021/06/09 13:23

編集2021/06/09 13:26

https://teratail.com/questions/342734で質問したばかりなのですが、
また違う疑問が出たので教えてください。
gccで以下のコードを逆アセンブルしました。

#include <stdio.h> int main(void) { int a,b,c; a = 1; b = 2; c = a + b; printf("c = %d\n",c); return 0; }
.file "test4.c" .text .def ___main; .scl 2; .type 32; .endef .section .rdata,"dr" LC0: .ascii "c = %d\12\0" .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp call ___main movl $1, 28(%esp) movl $2, 24(%esp) movl 28(%esp), %edx movl 24(%esp), %eax addl %edx, %eax movl %eax, 20(%esp) movl 20(%esp), %eax movl %eax, 4(%esp) movl $LC0, (%esp) call _printf movl $0, %eax leave ret .ident "GCC: (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 8.1.0" .def _printf; .scl 2; .type 32; .endef

###分からない事
.def ___main; .scl 2; .type 32; .endef.def _main; .scl 2; .type 32; .endef.def _printf; .scl 2; .type 32; .endefにおける .defと.scl 、.type .endefは何を表しているのですか?
(値が2と32になっているのは何故ですか?)

__main_mainは何が違うのですか?

.section .rdata,"dr"は何を表しているのですか?

.ident "GCC: (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 8.1.0"を省略しても正常に動作はするのですが、省略することでシステムに悪影響を及ぼしますか?もし、.ident以下を省略したコードを配布すればライセンス的にはどうなのですか?

movl $1, 28(%esp)movl $2, 24(%esp)movl %eax, 20(%esp)で値を移動させているときに、アドレス28,24,20に格納していますが、なぜこれらのアドレスに格納されたのですか?確保されたスタックフレームは32なのにも関わらず、なぜ28番地のアドレスから使用しているのでしょうか?
###環境
MinGW
Windows10

なにか間違っていることがあれば、ご指摘ください。
どうかご教授お願いします。

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

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

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

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

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

akisan55

2021/06/10 12:32

GNUアセンブリのマニュアルがあるのですね。 知りませんでした。参考にさせていただきます。
guest

回答1

0

ベストアンサー

.defと.scl 、.type .endefは何を表しているのですか?

マニュアルを読み
それ以上の情報が必要であればbinutilsおよびgccのソースを読んでみてください

(値が2と32になっているのは何故ですか?)

gcc/config/i386/winnt.clibgo/go/debug/xcoff/xcoff.goを読む限り

  • .scl 2

ストレージクラス: C_EXT、シンボルを(objの)外部から参照できるようにする

  • .type 32

32bit CPU用のコードを生成する

__mainと_mainは何が違うのですか?

_main用のスタティック変数領域を___mainとしているように見えますね

.section .rdata,"dr"は何を表しているのですか?

.rdataセクション(dr属性: data, read-only)に以後(この場合は.textまで)のコードを置きます。

.ident "GCC: (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 8.1.0"を省略

基本的にデバッグ用です。
こちらによればコンパイル時に-fno-identによって消せるようです。
「省略したコードを配布」というのがよく分かりませんが一般的にgccでコンパイルしたところで生成物がGPLに縛られはしません。(状況次第で例外みたいな穴はあるので精査は必要ですが)


確保されたスタックフレームは32なのにも関わらず、なぜ28番地のアドレスから使用しているのでしょうか?

「確保されたスタックフレーム」は32バイトつまり**+0~+31の32個です。
よって最後尾のsizeof(int) = 4バイトは
28~31**になります。

投稿2021/06/10 10:04

asm

総合スコア15147

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

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

akisan55

2021/06/10 12:30 編集

なるほど、とても分かりやすい説明でした。有難うございます。 勉強になりました。助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問