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

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

ただいまの
回答率

88.92%

アセンブリ言語 基礎 変数宣言 の書き方について(msgend: .equ len, msgend - msg)

解決済

回答 4

投稿 編集

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

kazuyakazuya

score 153

他のサイトでも掛け持っているのですが
知恵袋

なんか変数宣言について調べたのですがなかなか有益な情報がつかめないので
教えてください。
ほんとは参考書など買いたかったのですが、お金がないので・・・
(仮想環境はパソコン壊れたからできない・・・)

前回の質問
でいただいた回答で・・・

     .text
msg:    .ascii  "hello world\n"
msgend: .equ    len, msgend - msg
        .globl  _main
_main:
        subl    $12, %esp
        movl    $len, 8(%esp)
        movl    $msg, 4(%esp)
        movl    $1, (%esp)
        call   _write
        addl    $12, %esp
        ret


というコードをいただきました。
(回答者本人に質問するべきなのかもしれませんが、質問タイトルと
話が変わってしまうのでやめました。)

私が理解できないのはここです。

    .text
msg:    .ascii  "hello world\n"
msgend: .equ    len, msgend - msg


.textから下の変数宣言の場所(参考サイト)からわかりません。

msg:    .ascii  "hello world\n"

ここは変数msgにアスキー文字列を代入する・・・ですよね?

msgend: .equ    len, msgend - msg

これはなんですか?

私の認識の範囲で言うならば変数masgendに
.equ    len, msgend - msgを代入する・・・(絶対違う)

masgendが特別な何かだと思ったのですが

ぐぐっても出てこないことから

そうではないみたいです。

ここはどういうものなのでしょうか?

"アセンブリ言語 変数 宣言"

みたいなワードで調べたのですが欲しい情報を手に入れられません。

どうやって調べたらいいでしょうか?
(C言語とかより、資料がないですね・・・
英語ならあるかもしれないけど・・・)

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • maisumakun

    2019/10/23 09:07

    「仮想環境はパソコン壊れたからできない・・・」ということですが、どのような環境で学習を進めているのでしょうか。

    キャンセル

  • kazuyakazuya

    2019/10/23 09:10

    OS は windows10

    シェルコードを説明している参考書を購入したのですが

    そこで書かれているアセンブリ言語というのが

    intel記法 GAS OS・・・Linux

    でした。

    私は・・・

    AT&T GAS OS・・・windows

    ある程度できる人なら変換させることができると思いますが

    私は "Hello World!"をアセンブリ言語でまだ書けないくらいの

    初心者なので・・・

    キャンセル

回答 4

checkベストアンサー

+1

msg:    .ascii  "hello world\n"

ここは変数msgにアスキー文字列を代入する・・・ですよね?

高級言語で一番近い表現を探せばそのとおりですが、その考え方ではアセンブリ言語は(というか次の行が)理解できません。
y_waiwaiさんの回答にもありますが
アドレスに「msg」と名付け、そのアドレスから「hello world\n」を配置です。

msgend: .equ    len, msgend - msg

見たことのない文法ですがたぶん文脈からして、
msgend:
文字列の終わった地点のアドレスに「msgend」と名付け、
.equ    len, msgend - msg
それはそれとして、「len」という定数を「msgend - msg」という内容で定義
ですかね。
msgend-msgで2つのアドレスの差、つまり文字列のデータ長が出ます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/10/23 10:43

    回答ありがとうございます。

    msgendラベルを付けたアドレスから

    msgラベルを付けたアドレスを引けば

    ASCII文字列の長さがバイト数がわかるということか・・・

    msgend: .equ len

    これは とりあえずアドレスを知りたいから

    msgendラベルを貼り付けて

    そのすぐ後のアドレスに lenラベルを貼り付けている・・・。

    あ、では .equはなんですか?

    ASCIIだったら、.asciiとするように

    今回は整数を求めたいから

    .equとやっているということでしょうか?

    キャンセル

  • 2019/10/23 13:34

    > そのすぐ後のアドレスに lenラベルを貼り付けている
    いいえ違いますね。
    equで定義されたlenはその行のアドレスとは無関係です。いわゆるラベルとは別物と考えたほうがよいです。
    equはequalです。rubato6809さんの回答参照。

    キャンセル

  • 2019/10/23 13:41

    ありがとうございます。

    キャンセル

+1

intel記法 GAS OS・・・Linuxでした。
私は・・・AT&T GAS OS・・・windows

OS環境を揃える必要があります。アセンブラといっても、システムコールはOSのものを使いますので、OSが違えば同じコードは動きません。

(使えるパソコンがあるなら、仮想環境も動かせるかと思うのですが)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/10/23 09:30

    回答ありがとうございます。

    あ、いえ

    この提示しているコードは

    私の環境で正常にコンパイルできます。

    キャンセル

  • 2019/10/23 09:31

    いちおう参考書的なものはあるっちゃあるが

    その参考書で書かれているアセンブリ言語が

    私の環境と合わないから、今の私には使い物に

    ならない。という話です。

    キャンセル

  • 2019/10/23 09:34

    で、今回提示しているコードというのは

    前回の質問の回答でいただいたコードです。

    キャンセル

+1

msg:    .ascii  "hello world\n" 

変数宣言と考えるとかえってわかりにくいかもしれません

msg;
現在のアドレスにmsgというラベル(名前)を割り当てる
.ascii  "hello world\n"
現在のアドレスから文字列を格納

結果、msgのアドレスには"hello world\n"が展開されてるってことになります

アセンブラというのはあなたが考えてるより泥臭いもんです

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/10/23 10:03

    アセンブラに、スタックエリア、という概念はないです
    もっともっと低レベルのもんで、特定のアドレスにどうデータや機械語をおいていくか指定するスクリプトでしかありません
    そのアドレスがたまたまスタックエリアかもしれない、ってことですな。

    ハッキングという行為にはアセンブラが必須、という意味がこれでわかるでしょう

    あとは、「アセンブラ 入門」でぐぐって読みまくってください

    キャンセル

  • 2019/10/23 10:10

    ありがとうございます。

    キャンセル

  • 2019/10/23 10:10

    > アセンブラに、スタックエリア、という概念はないです
    とらえ方にもよるので反論ではありませんが、概念が無いことも無いような気がします。x86に限って言えば、SS(スタックセグメント)があります。

    キャンセル

+1

.equ symbol, expression
This directive sets the value of symbol to expression. It is synonymous with `.set'; see section .set symbol, expression.

なので

 msg:    .ascii  "hello world\n"
 msgend: .equ    len, msgend - msg

は  len == msgend - msg  とlenの値を指定する、という意味です。

  • msg は "hello world\n" の先頭アドレス
  • msgend: は、その '\n' の次のアドレス

なので、len は "hello world\n" の文字数になります。
従って、この場合は len == 12 です。

ここは write(1, msg, len); というシステムコールをしようとしている、
つまり write(1, "hello world\n", 12); です。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/10/23 12:19

    回答ありがとうございます。

    定数のアドレスを知りたいときは

    これをフレーズみたいに使えばいいってことですよね。

    キャンセル

  • 2019/10/23 12:21

    いや、勘違いしてると思う。

    キャンセル

  • 2019/10/23 12:26

    ラベルmsgend は "Hello World"

    が置かれているアドレスのすぐ後に置かれるのだから

    msgend - msg で文字列の長さを求めることができる・・・

    あ、すみません。言っていること

    へんでした。

    ”文字列の長さ”をアドレスを利用して求める方法ですね。

    キャンセル

  • 2019/10/23 12:29

    そうです。

    キャンセル

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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