В чем разница между директивами.ascii и.string?

Я знаю что .ascii директива не ставит нулевой символ в конце строки. .asciz Директива используется для этой цели. Тем не менее, я не знаю, является ли .string директива помещает нулевой символ в конец строки. Если это так, то какая разница между .asciz и .string директивы? Для меня, имея оба .ascii а также .string кажется излишним.

0 ответов

Согласно документам binutils:

.ascii "string" (Здесь для полноты)

.ascii ожидает ноль или более строковых литералов, разделенных запятыми. Он собирает каждую строку (без автоматического завершающего нулевого байта) в последовательные адреса.

.asciz "string"

.asciz аналогичен.ascii, но за каждой строкой следует нулевой байт. Буква "z" в.asciz означает "ноль".

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

Скопируйте символы из str в объектный файл. Вы можете указать более одной строки для копирования, разделенных запятыми. Если для конкретной машины не указано иное, ассемблер отмечает конец каждой строки байтом 0.

...

Варианты string16, string32 и string64 отличаются от псевдо-кода операции string тем, что каждый 8-битный символ из str копируется и расширяется до 16, 32 или 64 бит соответственно. Расширенные символы сохраняются в порядке байтов целевого порядка байтов.

Все они поддерживают escape-последовательности и принимают несколько аргументов. Что касается разницы между.string а также .asciz:

  • В некоторых архитектурах .string не будет добавлять нулевой байт, когда .ascizвсегда будет. Чтобы протестировать свою систему, вы можете сделать это:
    • echo '.string ""' | gcc -c -o stdout.o -xassembler -; objdump -sj .text stdout.o.
    • Если первый байт равен 00, значит, был вставлен нулевой символ.
  • .string также есть суффиксы для расширения символов до определенной ширины (16, 32 или 64), но по умолчанию это 8.

Как указано в комментариях к вопросу, в большинстве случаев нет никакой разницы, кроме семантики, но технически эти две псевдооперации разные.

Дополнение:

Как выясняется, что документы действительно упоминают две архитектуры, которые ведут себя по- разному:

  • HPPA (HP Precision Architecture) - не добавляет 0, но имеет специальный .stringz директива для этого.
  • TI-C54X (Некоторые микросхемы DSP от Texas Instruments) - заполняет нулями верхние 8 бит каждого слова (2 байта). Имеет связанный.pstring директива, которая упаковывает символы и заполняет неиспользуемое пространство нулями.

Копаясь в исходном коде в gas/config папку, мы можем подтвердить это и найти еще одну:

  • IA64 (архитектура Intel) - .string а также .stringz вести себя как HPPA.
Другие вопросы по тегам