【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】

NASMアセンブリのセクションについてご教示ください。

いつもお世話になっております。
前回も大変勉強になるご教示頂き誠に、感謝申し上げます。

小生、只今WinXPSP3上でNASM0.99.06を使用し、アセンブリ言語を勉強しています。

今回質問させて頂きたいのはNASMによる、セクションです。
NASMでは.text, .bss, .dataセクションがありますが、
例えば下記のアセンブリソースの、
一番最初に記述する[org 0]なども広義の意味でのセクションに該当するのでしょうか?

ソースは以下の様になっております。

-----source.asm-----
[org 0]
[bits 16]
jmp0x07C0:start

start:
movax, cs
movds, ax

movax, 0xB800
moves, ax
movdi, 0
movax, word [msgBack]
movcx, 0x7FF

paint:
movword [es:di], ax
adddi, 2
deccx
jnzpaint

movedi, 0
movbyte [es:edi], 'A'
incedi
movbyte [es:edi], 0x06
incedi
movbyte [es:edi], 'B'
incedi
movbyte [es:edi], 0x06
incedi
movbyte [es:edi], 'C'
incedi
movbyte [es:edi], 0x06
incedi
movbyte [es:edi], '1'
incedi
movbyte [es:edi], 0x06
incedi
movbyte [es:edi], '2'
incedi
movbyte [es:edi], 0x06
incedi
movbyte [es:edi], '3'
incedi
movbyte [es:edi], 0x06

jmp$

msgBack db'.', 0xE7

times510-($-$$) db 0
dw0xAA55
--------------------------

以上です。
最後から2行目の箇所に$$の特殊シンボルが使われており、
私としてはセクション(.textセクション等)が記述されていないのに、
$$はどこのセクションを示しているのかが分かりません。

そこで、書籍などで調べてみたところ、セクションとはそのコードがどこに置かれるかを決めるもので、
上記に記述させて頂いたコードだと、[org 0]がある為、
このコードは0000 0000に配置される事になり、

$$は0000 0000を指し示すものだと思っています。
この解釈で間違っていないでしょうか?

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

A 回答 (1件)

>一番最初に記述する[org 0]なども広義の意味でのセクションに該当するのでしょうか?



といって良いのでは。厳密には違うかもしれませんが。

セクションとかは、どういう出力フォーマットでデータを生成するかにも依存する話です。

たとえば、バイナリ形式(-f binary)への出力だと、"Any code which comes before an explicit SECTION directive is directed by default into the .text section"(7.1.3 http://www.nasm.us/doc/nasmdoc7.html 参照)となってます。
逆に、elf形式で質問文のソースをアセンブルしようとしても、エラーになるかと。

なので、

>org 0]がある為、このコードは0000 0000に配置される事になり、
>$$は0000 0000を指し示すものだと思っています。

は、バイナリ形式への出力でしょうから、あってるかと。

試しに下記コードをアセンブルしたら、どういう結果が生成されるか確認したらよいかも:

[org 0xCAFEBABE]
[bits 32]

dq $$
    • good
    • 0
この回答へのお礼

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

ご教示頂いた内容も、ものすごく勉強になりました。
更にはサンプルソースまで、掲載していただけるとは、本当にありがとうございます。

心より感謝申し上げます。
ありがとうございました。

お礼日時:2010/05/02 22:44

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