🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
アセンブリ言語

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

Q&A

解決済

4回答

5181閲覧

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

kazuyakazuya

総合スコア193

アセンブリ言語

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

0グッド

1クリップ

投稿2019/10/23 00:06

編集2019/10/23 00:17

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

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

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

c

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

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

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

s

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

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

msg: .ascii "hello world\n"

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

msgend: .equ len, msgend - msg

これはなんですか?

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

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

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

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

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

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

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

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

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

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

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

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

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

maisumakun

2019/10/23 00:07

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

2019/10/23 00:10

OS は windows10 シェルコードを説明している参考書を購入したのですが そこで書かれているアセンブリ言語というのが intel記法 GAS OS・・・Linux でした。 私は・・・ AT&T GAS OS・・・windows ある程度できる人なら変換させることができると思いますが 私は "Hello World!"をアセンブリ言語でまだ書けないくらいの 初心者なので・・・
guest

回答4

0

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

なので

as

1 msg: .ascii "hello world\n" 2 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 03:15

編集2019/10/23 03:24
rubato6809

総合スコア1382

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

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

kazuyakazuya

2019/10/23 03:19

回答ありがとうございます。 定数のアドレスを知りたいときは これをフレーズみたいに使えばいいってことですよね。
rubato6809

2019/10/23 03:21

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

2019/10/23 03:26

ラベルmsgend は "Hello World" が置かれているアドレスのすぐ後に置かれるのだから msgend - msg で文字列の長さを求めることができる・・・ あ、すみません。言っていること へんでした。 ”文字列の長さ”をアドレスを利用して求める方法ですね。
guest

0

ベストアンサー

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 01:17

ikadzuchi

総合スコア3047

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

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

kazuyakazuya

2019/10/23 01:43

回答ありがとうございます。 msgendラベルを付けたアドレスから msgラベルを付けたアドレスを引けば ASCII文字列の長さがバイト数がわかるということか・・・ msgend: .equ len これは とりあえずアドレスを知りたいから msgendラベルを貼り付けて そのすぐ後のアドレスに lenラベルを貼り付けている・・・。 あ、では .equはなんですか? ASCIIだったら、.asciiとするように 今回は整数を求めたいから .equとやっているということでしょうか?
ikadzuchi

2019/10/23 04:34

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

2019/10/23 04:41

ありがとうございます。
guest

0

msg: .ascii "hello world\n"

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

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

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

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

投稿2019/10/23 00:36

y_waiwai

総合スコア88038

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

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

kazuyakazuya

2019/10/23 00:54

回答ありがとうございます。 そのように覚えるようにします。
kazuyakazuya

2019/10/23 00:56

ん、スタックに直接"Hello World"のような 文字列を置くことはないんですか?
y_waiwai

2019/10/23 01:03

アセンブラに、スタックエリア、という概念はないです もっともっと低レベルのもんで、特定のアドレスにどうデータや機械語をおいていくか指定するスクリプトでしかありません そのアドレスがたまたまスタックエリアかもしれない、ってことですな。 ハッキングという行為にはアセンブラが必須、という意味がこれでわかるでしょう あとは、「アセンブラ 入門」でぐぐって読みまくってください
kazuyakazuya

2019/10/23 01:10

ありがとうございます。
dodox86

2019/10/23 01:10

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

0

intel記法 GAS OS・・・Linuxでした。

私は・・・AT&T GAS OS・・・windows

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

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

投稿2019/10/23 00:24

maisumakun

総合スコア145973

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

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

kazuyakazuya

2019/10/23 00:30

回答ありがとうございます。 あ、いえ この提示しているコードは 私の環境で正常にコンパイルできます。
kazuyakazuya

2019/10/23 00:31

いちおう参考書的なものはあるっちゃあるが その参考書で書かれているアセンブリ言語が 私の環境と合わないから、今の私には使い物に ならない。という話です。
kazuyakazuya

2019/10/23 00:34

で、今回提示しているコードというのは 前回の質問の回答でいただいたコードです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問