電子書籍の厳選無料作品が豊富!

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になってしまうのではないでしょうか?
お忙しい中、申し訳ございませんが、先輩方ご教示よろしくお願い致します

A 回答 (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 の位置になるというのが納得いくのではありませんか?
    • good
    • 0
この回答へのお礼

sakusaker7さん、ご回答頂き誠に感謝申し上げます。

sakusaker7さんのご教示とても勉強になりました。

そして、自分の疑問がやっと解けました!

お忙しい中、私の質問にお答え頂き、心より感謝申し上げます!
ありがとうございました。

お礼日時:2010/04/28 06:48

そもそも


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 という宣言はバイト数に含まれないのでしょうか?

お忙しい中、申し訳ございませんが、再度ご教授宜しくお願い致します。
切にお願い申し上げます。

補足日時:2010/04/27 08:30
    • good
    • 0

なぜ $ が 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になるのでしょうか?

お忙しい中、申し訳ございませんが、ご教示宜しくお願い致します。

補足日時:2010/04/26 18:58
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!