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

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

ただいまの
回答率

91.35%

  • アセンブリ言語

    63questions

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

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

受付中

回答 2

投稿 2017/12/05 00:24

  • 評価
  • クリップ 1
  • VIEW 91

mr0237

score 135

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

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+4

例えばプログラムが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/05 00:48

編集 2017/12/05 08:54

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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 14:00

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/13 14:09

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

    キャンセル

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

ただいまの回答率

91.35%

関連した質問

  • 解決済

    C++ ポインタについて

    前提・実現したいこと 下記のコードはコンパイルに成功いたしましたが、一つ疑問になっていることがあります。 通常、ポインタの場合、アドレス値を出力するには、&を使う必要がある

  • 解決済

    インラインアセンブラにST,LD命令はないのでしょうか?

    最近アセンブラを触っているのですが入門サイト等を見てもLD,ST命令などがありません。 昔工業高校で触っていた時はマイコンだったので(pic16F)あったのですが、x86アーキテ

  • 解決済

    CPUのモードについて

    アセンブリでOSコードリングしてるんですが、最初に浮かんできた疑問です。 CPUの動作モードには リアルモードと保護モードがありますが、 リアルモードでも保護モードでも、

  • 解決済

    アセンブリ言語とブートストラップ

    実験でフロッピーディスクにアセンブリ言語でプログラムを作ってブートストラップデータ領域で実行してみたんですが・・・ [org 0] [bits 16] jmp 0x07c

  • 解決済

    「手続き型プログラミング」と「オブジェクト(指向)型プログラミング」の違いについて

    JAVAのオブジェクト指向を勉強・練習している者です。 説明が下手ですいませんが、「スッキリわかるJava入門 第2版 (スッキリシリーズ) 」の(P281)「手続き型プログ

  • 解決済

    アセンブリ言語で読めない箇所があります。

    ポインタを使用するプログラムです。 1 #include<stdio.h> 2 #include<ctype.h> 3 4 char *test(char *

  • 解決済

    アセンブリ言語の基本part3

    細々とした質問なので、複数質問することをお許しください。 アセンブリ言語で読めない箇所があります。 以前の質問で、以下のような例を示してもらいました(ありがとうございます。)

  • 解決済

    CPU命令実行サイクルについて

    現在基本情報技術者試験の勉強をしているのですが、分からない所があるので教えて頂きたいです。 プログラミングのご質問ではないので、質問しても良いものか迷ったのですが他の質問サイトなど

同じタグがついた質問を見る

  • アセンブリ言語

    63questions

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