アセンブリ内のバイト指令[閉じました]
質問
私はRichard Cの「Introduction to80x86assembly language and computer architecture」と題された教科書を読んでいます。Detmerと59ページでは、それについて話しています バイト アセンブリ言語でのディレクティブと、文字と文字列のためにそれを使用しています。ここにテキストがあります:
"数値オペランドに加えて、 バイト ディレクティブは、単一文字の文字オペランドや、多くの文字を持つ文字列オペランドを許可します。アポストロフィ(')または引用符(")のいずれかを使用して、文字を指定したり、文字列を区切ったりできます。それらはペアでなければなりません;左にアポストロフィ、右に引用符を付けることはできません。アポストロフィで区切られた文字列には引用符を含めることができ、引用符で区切られた文字列にはアポストロフィを含めることができるため、これらの特殊文字を含む文字列を持つことができます。"
これは非常に理解できますが、私の好奇心の線は バイト 私はそれが唯一の単一のバイト、八ビットを保持することができると思ったので、ディレクティブ。私はテストをしました、そして私が言ったならば
string BYTE "HelloWorld"
もちろんコンパイルされますが、16進数をチェックすると、1バイトではなく複数バイトであることに気付くでしょう。Asciiテーブルを見ると、1文字がバイトであることがすでにわかっています。では、どうすれば文字列を持つことができますか?私はこれを数字で適用しようとしました。私達はのための範囲を知っています バイト 指令は-128から255です。私はこのコードを試しました:
number BYTE 9987
コンパイルして実行しようとすると、もちろん9987がバイトよりも大きかったため、エラーが発生しました。しかし、なぜ弦はこれに免疫があるのですか?なぜできますか バイト ディレクティブは文字列のコンテキストでは1バイト以上を保持しますが、数字では同じことをしませんか?
リストした最初のコードステートメントをコンパイルして実行したときに、2番目のコードステートメントと同じエラーが発生したと思います。なぜここで「ルール」が破られたのですか?
-ダン
解決
単一のアセンブラ構文はなく、プログラムによって異なる構文が使用される場合があることに注意してください。アセンブラのマニュアルを参照してください。
つまり、文字列定数は通常、それぞれの文字を別々に短縮表記したものであり、文字列定数は通常、文字列定数と文字列定数との間にある文字列定数です。 BYTE
ディレクティブを使用すると、複数の項目を一度に定義できます。
だから、例えば, BYTE 1, 2, 3, 4
有効であり、4バイトを定義し、あなたの string BYTE "HelloWorld"
と等価である。 string BYTE 'H', 'e', 'l', 'l', 'o', 'W', 'o', 'r', 'l', 'd'
10バイトを定義します。エラーが発生しない理由は、各文字が独自にバイトに収まるためです。
いくつかのアセンブラは、文字列リテラルを許可していません BYTE
または同等のディレクティブでは、文字列用の特殊なディレクティブがあります。 .string
または .ascii
.
他のヒント
ザ- BYTE
ディレクティブは、記憶域のブロックを予約し、その長さをバイト単位で記憶するようにアセンブラに指示します。長さは、初期化子のバイト数によって決まります。これは、10進数で0から255までの数、または一重引用符で囲まれた文字です。文字列はプログラミング言語では一般的であり、通常、メモリ内の連続したバイトの文字の配列と見なされます。プログラマの便宜のために、アセンブラでは、一重引用符または二重引用符で文字列を指定することによって、文字列に初期化されたバイトシーケンスを予約することができます。これらは同等です
string1 BYTE 'H', 'e', 'l', 'l', 'o'
または
string1 BYTE 'Hello'
たとえば、Oracle Solaris x86アセンブリ言語には、次のようなものがあります。
.byte
バイトを取るだけのディレクティブ.ascii
NULで終了しない文字列を取るディレクティブ.string
ディレクティブは文字列を取り、その文字列をwill
ヌルヌル終了します。