NASMアセンブラの特殊シンボル$による、文字列の長さ取得について
いつもお世話になっております。
小生、只今WindowsXPSP3上でNASM0.99.6を使用し、x86のアセンブリを勉強しています。
今回、皆様にご質問させて頂きたいのが、特殊シンボル'$'についてです。
以下のような、'$'の使い方は理解できるのですが、
times 510 - ($ - $$) db 0
文字列の長さを取得する場合の'$'の使い方がわかりません。
-----文字列の長さを取得-----
buff: db 'Hello'
buflen equ $ - buf
ぶしつけな発言の仕方で誠に恐縮なのですが、
'$'シンボルはそれが記述された行の先頭アドレスを示すものですよね?
だとすると、もし仮に以下のようにアドレスが振り分けられていた場合、
(0,1がアドレスです。)
0 buf: db 'Hello'
1 buflen equ $ - buf
これを計算すると、1-5となり、-4になってしまうのではないでしょうか?
お忙しい中、申し訳ございませんが、先輩方ご教示よろしくお願い致します
No.3ベストアンサー
- 回答日時:
buf: db 'Hello'
buflen:
というのは、次のように書くものの簡略表記です(; の後ろはコメント)。
buf:
db 'H' ; buf + 0
db 'e' ; buf + 1
db 'l' ; buf + 2
db 'l' ; buf + 3
db 'o' ; buf + 4
buflen:
これなら buflen 番地が、buf + 5 の位置になるというのが納得いくのではありませんか?
sakusaker7さん、ご回答頂き誠に感謝申し上げます。
sakusaker7さんのご教示とても勉強になりました。
そして、自分の疑問がやっと解けました!
お忙しい中、私の質問にお答え頂き、心より感謝申し上げます!
ありがとうございました。
No.2
- 回答日時:
そもそも
0 buf: db 'Hello'
1 buflen equ $ - buf
の 2行目でなぜアドレスが 1 になるのか, 説明してもらえませんか?
この回答への補足
Tacosanさん、ご回答頂き、誠に感謝申し上げます。
ご指摘のあった箇所について、説明させて頂きます。
>0 buf: db 'Hello'
>1 buflen equ $ - buf
>の 2行目でなぜアドレスが 1 になるのか, 説明してもらえませんか?
2行目で1になる理由は、すいません自己推測です。。。
私の考えでは、ソースの最初から順にアドレッシングがされると思っています。
ですから、私の考えた仮のアドレッシングでは、素直に2行目は1になると思いました。
$というシンボルはbufの後のアドレス、即ちアドレス5を差し、bufは0のアドレスを差すものなのでしょうか?
とすると、buf: db、buflen equ という宣言はバイト数に含まれないのでしょうか?
お忙しい中、申し訳ございませんが、再度ご教授宜しくお願い致します。
切にお願い申し上げます。
No.1
- 回答日時:
なぜ $ が 1 で buf が 5 なのか, 説明してもらえますか?
そのアドレスだと $ は 5, buf は 0 にならないといけない.
この回答への補足
Tacosanさん、ご回答頂き誠にありがとうございます。
ご指摘あった箇所についてお答えさせて頂きます。
>なぜ $ が 1 で buf が 5 なのか, 説明してもらえますか?
$が1であるというのは、下記の文で$シンボルが記述されているアドレスが1だからです。
0 buf: db 'Hello'
1 buflen equ $ - buf
そして、bufが5なのは'Hello'が五文字だからです。
これは私の勘違いなのでしょうか?
もしかして、$ - bufにすると、$は'Hello'の直後のアドレス5を持っており、
bufはbufが記述された、行のアドレスを持っているから、Tacosanの仰る通り、
0になるのでしょうか?
お忙しい中、申し訳ございませんが、ご教示宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAをつかってクエリの情報を抽...
-
実行時エラー3131 FROM 句の構...
-
zend(phpフレームワーク)でトラ...
-
SQL文が実行できません
-
時刻型にNULLでセットしたい
-
DAOでデータベースを二つ開くに...
-
PDOで取得される値がすべて文字...
-
テキストボックスに入れた内容...
-
PHP+MYSQL IF文の初歩
-
Resource id #3 をフィールドの...
-
PHPのプルダウンメニューにDBの...
-
MySQLでデータベースにデータin...
-
ヒアドキュメントでSQLを書く事...
-
select文
-
PHPで[]の使い方について
-
dbに登録したデータをphpのプル...
-
C#でDBの特定列をUpdate
-
MySQL接続のPHPの記述に関しまして
-
sqlから多次元配列に要素を格納...
-
OracleからAccessへのインポート
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実行時エラー3131 FROM 句の構...
-
VBAをつかってクエリの情報を抽...
-
SQL文が実行できません
-
エラー3011
-
テキストボックスに入れた内容...
-
Accessのテーブルへ複数の主キ...
-
PEAR でprepareメソッドがエラーに
-
LocalのNotesメールDBをVBAで参...
-
PHP(PDO)でDBの情報を完全一...
-
時刻型にNULLでセットしたい
-
SQL文の実行に失敗しました???
-
ASPでRecordCountが使用でき...
-
SELECT文を発行して、ACCESSよ...
-
in 'where clause'のエラーの理由
-
データフォームウィザードで追...
-
得られた処理結果を、その前の...
-
データ入力条件
-
PHP5でpostgresqlのデータベー...
-
ExcelVBAでAccessのデータを検...
-
PHP内でUPDATE構文を使用してい...
おすすめ情報