Объявление строки с фиксированной длиной в ассемблере GNU - PullRequest
3 голосов
/ 08 февраля 2011

Я пытаюсь определить некоторые данные в структуре фиксированного размера в ассемблере. Я хотел бы объявить строковые данные с фиксированным числом байтов, инициализированные строкой. В C это будет:

char my_string[32] = "hello";

Что составляет 32 байта, и дополнено сколькими нулями, необходимыми в конце.

Каким будет эквивалент в ассемблере? Я знаю, что могу вручную посчитать длину моей строки и объявить необходимое количество нулевых байтов для дополнения до 32, например:

my_string:
  .asciz "hello"
  .zero 26

Но как я могу это сделать, если строка определяется динамически, например, из внешнего определения или include?

Ответы [ 3 ]

5 голосов
/ 09 февраля 2011

Я думаю, я бы использовал макрос с локальными метками для этого.Например:

    .macro padded_string string, max
1:
    .ascii "\string"
2:
    .iflt \max - (2b - 1b)
    .error "String too long"
    .endif

    .ifgt \max - (2b - 1b)
    .zero \max - (2b - 1b)
    .endif

    .endm

... используется следующим образом:

my_string:
    padded_string "Hello world!", 16

(Это имеет C-образное поведение, не добавляя завершающий 0, если строка в точности равна max символамlong. Чтобы строка завершилась, просто измените .ascii на .asciz.)

3 голосов
/ 08 февраля 2011

То, что вы описываете, все еще является статической строкой, хотя и с неизвестным размером. Вы можете получить размер строки, вычитая адрес строки из текущего указателя данных ($). Вычтите размер строки из максимального размера, и вы знаете, сколько нулей добавить:

my_string:
    .ascii "mystery string"
    .zero (maxsize-($-my_string)) ;maxsize-actualsize

, которое можно упростить до:

my_string:
    .ascii "mystery string"
    .zero (maxsize+my_string-$)
0 голосов
/ 09 февраля 2011

Я бы предпочел ответ Йенса использования, например. .zero (32+my_string-$), однако я получил сообщение об ошибке Error: .space specifies non-absolute value.

Кажется, это жизнеспособная альтернатива:

my_string:
  .asciz "mystery string"
  .org my_string + 32
other_stuff:
  ...

Я не знаю, гарантирует ли это, что целые 32 байта установлены в определенные значения (т. Е. Конечные байты заполнены нулями), но использование .asciz гарантирует, что строка заканчивается нулем.

...