16

アセンブリを学習しています。文字列を定義する 2 つの例を参照してください。

msg db 'Hello, world!',0xa

  • ここの 0xa はどういう意味ですか?

message DB '大好きです!', 0

  • なぜここに 0 があるのですか?
  • 末尾のヌル文字ですか?
  • 上記の例では 0xa なのに、ここでは 0 になっているのはなぜですか? (文字列の長さとは関係ないようです)

上記の例がアセンブリ文字列を定義する 2 つの方法である場合、プログラムはどのようにそれらを区別できますか?

助けてくれてありがとう:)

4

3 に答える 3

16

アセンブラが異なれば構文も異なりますが、dbディレクティブの場合はかなり一貫しています。

dbアセンブリ ディレクティブであり、ソース内でディレクティブが配置されている場所に指定された値を持つバイトを定義します。オプションで、ディレクティブにラベルを割り当てることができます。

一般的な構文は次のとおりです。

[label]  db  n1, n2, n3, ..., nk

ここで、n1..nk はバイト サイズの数値 (0..0xff から)または文字列定数です。

ASCII 文字列がバイトで構成されている限り、ディレクティブは、ディレクティブ内の他の数値とまったく同じように、これらのバイトをメモリに配置するだけです。

例:

db 1, 2, 3, 4

4バイトを割り当て、1、2、3、および4の数字で埋めます

string  db 'Assembly', 0, 1, 2, 3

次のようにコンパイルされます。

string:  41h, 73h, 73h, 65h, 6Dh, 62h, 6Ch, 79h, 00h, 01h, 02h, 03h

ASCII コード 0Ah (0xa) の文字は、Linux でコンソールの改行コマンドとして使用される文字 LF (改行) です。

ASCII コード 00h (0) を持つ文字は、C に似た言語で文字列の終了マークとして使用される NULL 文字です。(ほとんどの OS は C で記述されているため、おそらく OS API 呼び出しでも)

付録 1: DB に似たアセンブリ ディレクティブが他にもいくつかあります。これらはメモリ内のデータを定義しますが、サイズは異なります。最も一般的なのは、16、32、および 64 ビット データの DW (定義ワード)、DD (定義ダブル ワード)、および DQ (定義クワッド ワード) です。ただし、それらの構文は、文字列ではなく数値のみを受け入れます。

于 2013-10-22T19:54:27.497 に答える