GNU as утверждает, что поддерживает дополнительные локальные символы с помощью $. Почему этот код компилируется с символом утверждения об ошибке, который уже используется? - PullRequest
1 голос
/ 18 апреля 2020

GNU as поддерживает «дополнительные локальные символы», оканчивающиеся на $. Эти символы не определены с каждым нелокальным символом. Тем не менее, следующий код выдает ошибку о том, что символ .L1 $ переопределяется. Я проверил как L1 $, так и .L1 $, потому что в некоторых документах указано, что символы, начинающиеся с L, являются локальными.

Вот ссылка на один документ в GNU: http://tigcc.ticalc.org/doc/gnuasm.html#SEC46

Я не могу найти его в обычном руководстве, и, возможно, это часть проблемы. Я думал, что видел это. Это моя ошибка? Это больше не поддерживается?

    .global f
f:

.L1$:
        mov r0, #1
        bne     .L1$
        bx      lr
        .global g
g:
.L1$:
        mov r0, #1
    bne     .L1$
    bx      lr

1 Ответ

2 голосов
/ 22 апреля 2020

GNU Assembler не поддерживает функцию «дополнительных локальных символов», которая, как вы заявляете, существует. Возможно, вас смутила задокументированная функция Dollar Local Labels , но эта функция работает не так, как вы описали.

Локальные метки в долларах являются разновидностью Локальных имен символов , в которых метки, состоящие только из цифр, могут быть определены несколько раз. Функция локальной метки доллара также позволяет многократно определять метку, состоящую только из цифр, за которыми следует один знак доллара ($). Ссылка на эти символы делается путем добавления суффикса f или b к метке, чтобы ассемблер знал, искать метку вперед или назад. Разница между ними заключается в том, что долларовые локальные метки становятся неопределенными после определения любой последующей нелокальной метки.

Также обратите внимание, что метки, начинающиеся с .L, не являются локальными так же, как символы, описанные в предыдущий абзац есть. Метки, начинающиеся с .L, могут быть определены только один раз, и на них можно ссылаться из любого места исходного файла ассемблера. В этом смысле они ничем не отличаются от любого нормального символа. Что отличает их от обычных символов, так это то, что они не включены в таблицу символов сгенерированного объектного файла.

Наконец, обратите внимание, что функция Dollar Local Label, помимо того, что вы не делаете то, что вам нужно, также не реализована в ARM-целях. Это также не реализовано для целей x86. В этом нет необходимости, так как функция локальных имен символов работает так же хорошо.

В ассемблере GNU не поддерживается функция, которая обрабатывает символы, начинающиеся с символа, отличного от git, и заканчивающиеся знаком доллара по-разному на любой платформе.

...