Как избежать конфликта имен в случае макросов для сборки

Я хочу объявить следующий макрос в моем файле common.h:

.macro HEX_NIBBLE reg
    //LOCAL letter, end
    cmp $10, \reg
    jae letter
    add $'0, \reg
    jmp end
letter:
    /* 0x37 == 'A' - 10 */
    add $0x37, \reg
end:
.endm

Всякий раз, когда я вызываю вышеуказанное ядро ​​более чем в одном месте в моем коде main.S, я получаю следующие ошибки:

$ as --32 -o main.o main.S -g
main.S: Assembler messages:
main.S:17: Error: symbol `letter' is already defined
main.S:17: Error: symbol `end' is already defined
main.S:17: Error: symbol `letter' is already defined
main.S:17: Error: symbol `end' is already defined
main.S:17: Error: symbol `letter' is already defined
main.S:17: Error: symbol `end' is already defined

Я хочу использовать только ассемблер GNU (GAS), без GCC. Как избежать этих ошибок? Есть ли какая-либо директива по сборке для этой ситуации?

main.S можно взять что угодно для этих примеров, скажем ниже код:

.include "common.h"
BEGIN
    HEX_NIBBLE %ax
    HEX_NIBBLE %ax
    HEX_NIBBLE %ax
    HEX_NIBBLE %ax
    hlt

person Insane Coder    schedule 16.02.2020    source источник
comment
Используйте местные ярлыки или уникальные метки макросов   -  person Jester    schedule 16.02.2020
comment
re: hex: вас может заинтересовать Как преобразовать двоичное целое число в шестнадцатеричную строку?   -  person Peter Cordes    schedule 16.02.2020