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

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

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

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

C

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

C++

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

Q&A

解決済

2回答

6039閲覧

アセンブリ言語のセクション

strike1217

総合スコア651

アセンブリ言語

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

C

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

C++

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

0グッド

0クリップ

投稿2017/07/07 09:17

実験コードを載せます。

C

1 1 #include<stdio.h> 2 2 3 3 int a = 100; 4 4 int c; 5 5 6 6 int main(){ 7 7 const int i = 0; 8 8 char *buf = "you will make me happy"; 9 9 10 10 printf("%d, %d, %d ,%s\n", a, c, i, buf); 11 11 return 0; 12 12 } 13 13

以下にアセンブリコードを載せます。

1 .file "global.c" 2 .globl a 3 .data 4 .align 4 5 .type a, @object 6 .size a, 4 7 a: 8 .long 100 9 .comm c,4,4 10 .section .rodata 11 .LC0: 12 .string "you will make me happy" 13 .LC1: 14 .string "%d, %d, %d ,%s\n" 15 .text 16 .globl main 17 .type main, @function 18 main: 19 .LFB0: 20 .cfi_startproc 21 pushq %rbp 22 .cfi_def_cfa_offset 16 23 .cfi_offset 6, -16 24 movq %rsp, %rbp 25 .cfi_def_cfa_register 6 26 subq $16, %rsp 27 movl $0, -4(%rbp) 28 leaq .LC0(%rip), %rax 29 movq %rax, -16(%rbp) 30 movl c(%rip), %edx 31 movl a(%rip), %eax 32 movq -16(%rbp), %rsi 33 movl -4(%rbp), %ecx 34 movq %rsi, %r8 35 movl %eax, %esi 36 leaq .LC1(%rip), %rdi 37 movl $0, %eax 38 call printf@PLT 39 movl $0, %eax 40 leave 41 .cfi_def_cfa 7, 8 42 ret 43 .cfi_endproc 44 .LFE0: 45 .size main, .-main 46 .ident "GCC: (Debian 6.3.0-18) 6.3.0 20170516" 47 .section .note.GNU-stack,"",@progbits

このドットから始まる行に焦点を当てます。

セクションについて
アセンブラ言語の翻訳
gasのディレクティブについて

ドットから始まる行は、疑似命令であり、ディレクティブであり、サブセクション(??)であるんですかね?
readelf --segment a.out で、セクションとセグメントを表示できます。
これとは全くの別物ですよね??

(例えば、dataセクション、textセクションは、デレクティブの疑似命令に同じ名前が使用されている。)

サブセクションは疑似命令とは明確に区別されるんですか??

.LC0:は、ラベルであり、疑似命令であると言えるんですかね?

機械語のコードは、textセクションに配置さるはずです。
しかし、
.section .rodata ・・・・?
.section ディレクティブを利用すると、その指定以降の部分(コードなり変数なり)を置くセクションを指定することが出来る。

sectionディレクティブは1回しか出てきていません。
え?機械語がrodataセクションに配置されるってこと??
意味がわかりません。

movl c(%rip), %edx
Cなんてラベルないけど・・・?

確かにC言語の方には、初期化をしていないグローバル変数として、Cはありますが、アセンブリ言語の方にはCというラベルすらない状態です。どういうことでしょうか?

セクションとか.textとか

実行コードを逆アセンブルするとこれらの、疑似命令はなくなります。
つまり、プログラムがセクションに分割されるのは、アセンブラ実行の後ということですよね?

疑似命令、ディレクティブの読み方を教えてください。

Linux 64bit Gasです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

The GNU Assembler
をご覧なさい。

directive(指令)とは、(言語処理系である)アセンブラに指示を与える命令です。ディレクティブ一覧があります。これらがgasのディレクティブです。
Assembler Directives

ディレクティブの中には、セクションに関するディレクティブもある・・・それだけの事です。

シンボルとは何か
Assembler Symbols

この辺りに「シンボル名は文字、又は ., _, $で始まる名前(Symbol Names)」だとか、「ラベルは、直後に:(コロン)が続くシンボルとして書かれる(Labels)」と、明確に記述されている。

ネットをつまみぐいして、

ドットから始まる行は、疑似命令であり、ディレクティブであり、サブセクション(??)であるんですかね?

などという、中途半端な理解を頭の中で作り上げ、それに囚われてしまうことが、いかに無駄な事であるか。原典にアクセスすることが大事な場合=原典を見たほうが具体的で、すっきりできる場合があるのですよ。

さあ、これでstrike君はgasに関する疑問を全て自分で調べられる!
Enjoy!

投稿2017/07/07 14:08

編集2017/07/07 14:11
rubato6809

総合スコア1380

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

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

strike1217

2017/07/07 14:18

「ディレクティブの中には、セクションに関するディレクティブもある」 なるほど!! では、リンク先にないセクションはリンカが追加するわけですね! 見てみます。
rubato6809

2017/07/07 14:24

(またも早とちりか呆。●ぬまで治らんか笑)
strike1217

2017/07/07 14:53

.section d = .section .data とできるようです。 .dataと単体で記述も可能なんですね また、.rodataのみの記述は無理なんですね・・・・ なぜ、.textのみ特別扱いなんですか? .section tは存在せず、単体の記述のみですね。 セクションは同じ記述法にまとめた方がいいですよね? みんなバラバラでわかりにくいですね・・・・ おまけに、int c は初期値のない広域変数のためbssセクションに入るはずです。 .section b が登場しない・・・ 頭が痛い・・><
strike1217

2017/07/07 14:58

「directive(指令)とは、(言語処理系である)アセンブラに指示を与える命令です。」 疑似命令に頼らずに、これを実現する方法ってあるのでしょうか?? 自力でアセンブラに指示を与える方法です。
rubato6809

2017/07/11 00:03

> なぜ、.textのみ特別扱いなんですか? > .section tは存在せず、単体の記述のみ .text と同格の命令として .data がありますよ。どちらも基本的で頻繁に使うから、かもね。 > セクションは同じ記述法にまとめた方がいいですよね? > みんなバラバラでわかりにくいですね・・・・ 自分がわからないからと言って、わがままを言わない事。 少なくともコンパイラ作者達は、長年この仕様を前提にアセンブリコードを生成して(生成させて)おり、問題は無いし、不満も無いだろう(ただ、技術の変化に伴って変化があることも事実だが)。「C言語で、こんな書き方をしたいんだが、アセンブラのせいで書けないんだ」・・・みたいな話は聞いたことが無い(笑)。 > 自力でアセンブラに指示を与える方法 2つある。 1. アセンブリコードに記述すること。CPU命令もディレクティブもそう。 2. アセンブラに対するコマンドライン・オプション 今の仕様に不満があるなら「〜なことを記述したい・指示を出したい。そうでないと〜な場合に困る」と理由を明確にして、アセンブラの作者に修正依頼を出すこと・・・或いは、自分で修正するか、です。Gasのソースコードが公開されていることは知ってるだろ、君だって手を入れられるんだよ。ああ、でも「どこをどう直せばできますか?何故こうなってる?こうやったけどうまくいかない」などと、こういうところで質問攻めにしたって、相手してくれる人はいないと思うw
guest

0

c

Cなんてラベルないけど・・・?

.comm c,4,4

で定義されてますやん。
リンク先にも書いてますやん。

セクション

え?機械語がrodataセクションに配置されるってこと??

.text

が見えないのかな?

.

.LC0:は、ラベルであり、疑似命令であると言えるんですかね?

ラベルです。
シンボル名(ラベル名)は先頭に.を使用することが出来ます。
よって、

ドットから始まる行は、疑似命令であり、ディレクティブであり、サブセクション(??)であるんですかね?

は間違いです。

投稿2017/07/07 09:29

編集2017/07/07 10:00
fuzzball

総合スコア16731

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

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

strike1217

2017/07/07 09:31

.comm c,4,4 この場合、cはラベル扱いなんですか?
strike1217

2017/07/07 09:33

ラベル扱いでは、なくシンボル扱いなんですね! movl c(%rip), %edx シンボルも記述できるんですね。 はじめて知りました。
strike1217

2017/07/07 11:16

あ、ドットをラベルに使用可能なのですね!! シンボルとラベルは同じものでしょうか??
fuzzball

2017/07/07 11:18

全然直ってない。
strike1217

2017/07/07 11:24

おそらく、厳密には別物ですかね・・・ シンボルはシンボルテーブルに載るけど、ラベルは載らないので・・・ リンカレベルでみると区別するけど、アセンブリレベルでは区別しないんですかね・・・ シンボルという用語がシンボル解決のシンボルと同じ意味なら区別される・・・といったところでしょうかね・・・・ 間違っていたら、ご指摘をお願いしたしますわ。
strike1217

2017/07/07 12:19

ドットから始まる行は、疑似命令であり、ディレクティブであるが・・・サブセクションではないってとこですかね?
strike1217

2017/07/07 12:36 編集

.text でtextセクションってことになるんですかね・・・ なぜ、.section .text と書かなんでしょうか? 逆に、.section .rodata は .rodata だけでも同じ効果になるんですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問