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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel VBA キーワードから列を取得して、さらに空欄行を非表示にする 3 2022/10/21 22:49
- JavaScript javascriptで文字分割は、 split() などメソッド不要??? 4 2023/02/06 22:50
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- Visual Basic(VBA) VBAで、特定の文字より後を削除して残った数値を文字列に変換と特定の文字より前も削除したい 3 2022/04/15 19:21
- Excel(エクセル) エクセルにおいてセル内の文字を出来るだけ大きく表示する方法を教えてください。 4 2022/07/30 08:08
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 指定した文字から指定した文字のスペースまでを削除するVBAの構文について 6 2022/07/24 22:20
- Outlook(アウトルック) メールアドレスをうーんと長く 2 2023/01/13 16:59
- その他(プログラミング・Web制作) テキストエディタで複数行にわたる文字列の行頭に番号を振る方法 4 2023/03/11 12:57
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
実行時エラー3131 FROM 句の構...
-
テキストボックスに入れた内容...
-
VBAをつかってクエリの情報を抽...
-
SQL文が実行できません
-
LocalのNotesメールDBをVBAで参...
-
csvをDBへ読み込んだら、NULLが...
-
phpでmysqlを使ってデータベー...
-
Pro*Cの構文エラー
-
PHPで[]の使い方について
-
アポストロフィを含む文字列の追加
-
子プロセス終了で閉じてしまうm...
-
検索結果($_POST)が2ページ目...
-
insert1つの処理でもトランザ...
-
PHP+mysqlでSQL文に文字数制限...
-
mysql_queryで日本語文字列が文...
-
【初歩】配列の格納データ数だ...
-
phpのエラーについてです
-
エンコードされたものを、$_GET...
-
ToDoリストの「完了済」を非表...
-
Accessへ日付をINSERT
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実行時エラー3131 FROM 句の構...
-
VBAをつかってクエリの情報を抽...
-
テキストボックスに入れた内容...
-
エラー3011
-
SQL文が実行できません
-
SELECT文を発行して、ACCESSよ...
-
in 'where clause'のエラーの理由
-
phpのPEARのMDB2を使って出たエ...
-
Call to undefined method MDB2...
-
LocalのNotesメールDBをVBAで参...
-
PHP内でUPDATE構文を使用してい...
-
単純ですが、意外と穴?なデー...
-
DAOでデータベースを二つ開くに...
-
PEAR でprepareメソッドがエラーに
-
pearがエラーになる
-
見られたくないファイル
-
SQL文の実行に失敗しました???
-
データフォームウィザードで追...
-
年月の情報だけを基に階層構造...
-
データ入力条件
おすすめ情報