1週間で学ぶIT基礎の基礎 - 【5分で覚えるIT基礎の基礎】だれでも一度はアセンブラを学んでおこう! 第2回:ITproのページに
ラベルとは,アセンブラのプログラムのオペランドに名前(ラベル名)を付けたものです。 この名前は,行のメモリー・アドレスを表しています。プログラムの中で123番地のような具体的なメモリー・アドレスの値を指定するのは面倒なので,ラベルを使うわけです。 ラベルは,行の先頭に書きます。プログラムをマシン語に変換すると,ラベルの名前がその位置のメモリー・アドレスの値に置き換わります。
と書かれていますが、つまりこれはメモリ番地に名前を付けて目印をつけておくということでしょうか?
なんか間違っているような気がしますが、メモリ番地にニックネームをつけるようなものなのでしょうか?
初心者でもわかりやすいように教えてください よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア18400
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
総合スコア1382
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/23 11:57
2017/12/23 12:01
2017/12/23 13:17
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。