В чем разница между директивами.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.