1. ホーム
  2. gcc

[解決済み] .ascizと.stringアセンブラディレクティブの違いは何ですか?

2022-02-09 06:54:30

質問事項

は知っています。 .ascii ディレクティブのように、文字列の末尾にヌル文字を置くわけではありません。 .asciz ディレクティブはそのために使われます。しかし .string ディレクティブは、文字列の末尾にヌル文字を置きます。

もし、NULL文字が付加されるのであれば、その後に続く .asciz.string のディレクティブは?私にとっては .asciz.string は冗長な気がします。

解決方法は?

によると binutilsドキュメント :

.ascii "string" (ここでは念のため)

.asciiは、カンマで区切られた0個以上の文字列リテラルを想定しています。各文字列は、(自動的に末尾の0バイトを除いた)連続したアドレスに組み合わされます。

.asciz "string"

.ascizは.asciiと同じですが、各文字列の後に0バイトが付きます。.asciz』の『z』は『ゼロ』を意味します。

.string "str", .string8 "str", .string16 "str", .string32 "str", .string64 "str"

strの文字をオブジェクトファイルにコピーします。コピーする文字列は、カンマで区切って複数指定できます。特定のマシンに対して特別な指定がない限り、アセンブラは各文字列の終わりを0バイトでマークします。

...

string16、string32、string64 は、str の各 8 ビット文字をコピーしてそれぞれ 16、32、64 ビットに拡張する点が、文字列疑似オペコードと異なります。展開された文字は、ターゲットエンディアンのバイトオーダーで格納される。

いずれもエスケープシーケンスに対応し、複数の引数を受け付けます。との違いについては .string.asciz :

  • 特定のアーキテクチャにおいて .string はヌルバイトを追加しません。 .asciz 常にそうなります。自分のシステムをテストするには、次のようにします。
    • echo '.string ""' | gcc -c -o stdout.o -xassembler -; objdump -sj .text stdout.o .
    • 1 バイト目が 00 の場合、ヌル文字が挿入されたことになります。
  • .string は、文字を特定の幅(16、32、64)に拡張するサフィックスも持っていますが、デフォルトでは8です。

質問に対するコメントにあるように、ほとんどの場合、セマンティクス以外の違いはありませんが、技術的には2つの擬似オペは異なっています。

追記

結論から言うと、ドコモは する は、異なる挙動をする2つのアーキテクチャについて言及しています。

  • HPPA (HP Precision Architecture) - 0を追加しないが、特別な .stringz ディレクティブを使用します。
  • TI-C54X (Texas Instruments 社のいくつかの DSP チップ) - 各ワード (2 バイト) の上位 8 ビットをゼロフィルする。関連する .pstring ディレクティブは、文字をパックし、未使用のスペースをゼロ埋めします。

のソースコードを掘り下げると gas/config フォルダで確認することができ、さらにもう一つ見つけることができます。

  • IA64(インテル・アーキテクチャ)-。 .string.stringz はHPPAのような挙動をします。