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

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

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

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

Q&A

解決済

2回答

17717閲覧

アセンブラ言語における「ラベル」とは何なんでしょうか?初心者でもわかりやすいように教えてください。

mr0237

総合スコア164

アセンブリ言語

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

0グッド

2クリップ

投稿2017/12/04 15:24

1週間で学ぶIT基礎の基礎 - 【5分で覚えるIT基礎の基礎】だれでも一度はアセンブラを学んでおこう! 第2回:ITproのページに

ラベルとは,アセンブラのプログラムのオペランドに名前(ラベル名)を付けたものです。 この名前は,行のメモリー・アドレスを表しています。プログラムの中で123番地のような具体的なメモリー・アドレスの値を指定するのは面倒なので,ラベルを使うわけです。 ラベルは,行の先頭に書きます。プログラムをマシン語に変換すると,ラベルの名前がその位置のメモリー・アドレスの値に置き換わります。

と書かれていますが、つまりこれはメモリ番地に名前を付けて目印をつけておくということでしょうか?

なんか間違っているような気がしますが、メモリ番地にニックネームをつけるようなものなのでしょうか?

初心者でもわかりやすいように教えてください よろしくお願いします。

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

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

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

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

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

guest

回答2

0

例えばプログラムが100番地から始まると分かっていたとして

100 movl $1,rax 104 movl $2,rbx 108 cmpl rax,rbx 112 jns $118 ; <===番地を直接指定・・・ 116 addl $1,rax 118 ...

こんなふうに各命令語の長さを計算して「さて何番地だっけ」と考えるのはいかに面倒なアセンブリ言語を使おうとするプログラマーでもさすがに悲鳴を上げると思います。そんなことをしなくて済むようにラベルを使います。

movl $1,rax movl $2,rbx cmpl rax,rbx jns L1 ; <===番地を表すラベルを指定 addl $1,rax L1: ...

各命令語が何バイトになり、それぞれ何番地から始まるか人間には退屈な計算でしかありませんが、計算機であれば文句をいわずにもくもくと計算してくれます。計算がめんどくさいから計算機を使うわけなので、こうした退屈な計算は計算機にやらせるのが妥当だと思います。

本件はアセンブリ言語に限ったことではありません。プログラム言語で用いる変数名や関数名は究極的にはメモリー上のどこかの場所を示すものです(相対番地か絶対番地かの違いはありますが)。それも上記と同様、プログラムコードの中でどんなサイズのものをいくつ使うかによってメモリー上の配置が決まりますがそれを一々人間が気にしなくてはならないのだとしたらプログラミングは今よりずっと苦行になるはずです。そういうことを避けるために「人間が読みやすい他と区別が付けられるようなラベル=識別子」を付与して実際にそれがどのように配置されるかは言語システムの方でよきに計らうようになっています。


蛇足ですが最初の例に載せたアドレスはでたらめです。一つ一つの命令が実際に何バイトになるかは大抵の場合気にする必要がないので自分も気にしません。知りたい場合はデータシートを見ると分かりますが、実際にコンパイルしてobjdumpなどで逆アセンブルしてみてもすぐにわかりますね。

投稿2017/12/04 15:48

編集2017/12/04 23:54
KSwordOfHaste

総合スコア18394

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

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

0

ベストアンサー

(ラベルとは)メモリ番地にニックネームをつけるようなものなのでしょうか?

そうです。そういう使い方が一番多いし、基本です。
なので、まずはそう覚えて構わないと私は思います。

表4●加算を行うプログラム(リンク先にあるプログラムの例です)

LD GR1,A ;GR1にA番地のデータを読み出す ADDA GR1,B ;GR1とB番地のデータを加算する ST GR1,ANS ;加算結果をANS番地に格納する RET ;主プログラムに戻る A DC 100 ;A番地に100というデータを格納しておく B DC 200 ;B番地に200というデータを格納しておく ANS DS 1 ;ANS番地にデータの格納場所を確保しておく

ここでは「A」「B」「ANS」という3つのラベルがあります。アセンブルすると、それぞれのラベルはメモリの番地(という何らかの数値)になります。

プログラマ(人間)がプログラムを書く時、そのメモリ番地が何番地になるのか、簡単に分かる(或いは、決められる)ラベルもありますが、ほとんどのラベルは何番地になるのか簡単には分かりません。人間がいちいち番地まで計算することは、およそ不可能だと思ってください。それを計算してくれるのがアセンブラ(とリンカ)です。

その昔、アセンブラが作られる以前は、機械語でプログラムを作るしかありませんでした。番地が決まらないと機械語も決まらない、そんな機械語命令がたくさんあります。即ち、人が全ての番地を計算したのです。プログラムは書いたら一度で動くとは限りませんから、簡単な修正でも番地の計算はやり直さなければなりません。それはそれは大変な作業だった、と想像できるではありませんか。

プログラムを作る時、「こういう変数(記憶場所)があればいいな」とか、「ここから、この場所にジャンプしよう」などと考えるものです。そこにラベルを書くのです。何番地なのか自分で考えなくても(計算しなくても)、アセンブラが計算してくれます。なので、プログラマは、プログラムの要所要所に、自分に都合の良い名前・ニックネームをつけてラベルを書くのです。繰り返しますが、いちいち番地を計算する必要はありません。そのようにしてプログラムを作っていくことができます。そのためにラベルを使うことにしたのです。

上記の例では、足し算をする2つの数(変数)の番地に「A」「B」とニックネームをつけ、答え(ANSwer)を格納する変数のメモリ番地に「ANS」とニックネームをつけました。

リンク先のページには「リスト1●条件分岐を行うプログラム」、「リスト2●繰り返しを行うプログラム」も例示されていますね。そこには「LBL1」「LBL2」というラベルが書かれています。どちらも、そのプログラム中の、ある特定のメモリの番地のことです。

投稿2017/12/13 05:00

rubato6809

総合スコア1380

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

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

rubato6809

2017/12/13 05:09

「アセンブラ言語」という呼び方は、使う人が割と多いようですが、間違いだと思います。少なくとも違和感のある使い方です。アセンブラ(assembler)とは「アセンブルするプログラム」を指すのであって、言語の名前ではありませんから。assembleは「組み立てる」という意味の動詞です。 アセンブリ言語(assembly language)と呼ぶのが正しいと思います。
Zuishin

2017/12/23 11:57

アセンブリランゲージをアセンブラと呼んでも間違いではありません。 IBM はずっとアセンブラと呼んでいます。
Zuishin

2017/12/23 12:01

アセンブラが作られる以前は機械語でプログラムを作るしかなかったというのも誤りです。 ニーモニックをハンドアセンブルしていました。
hichon

2017/12/23 13:17

いずれにしても苦行には違いない。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問