Да. Это называется «локальные метки» и является даже более мощным, чем вариант MASM / FASM:
https://sourceware.org/binutils/docs/as/Symbol-Names.html#Local-Labels-1
Метка состоит только из одного номера. Переход вперед или назад задается этим номером.
Пример (надписи 2 и 3 внутри m_newline
и jne 1b
довольно близко к концу):
.macro m_newline
jmp 3f # Skip over data
2: .ascii "\n\0" # Local label
3: # Local label
mov $2b,%ecx # Pointer to the string "\n"
mov $1,%edx # strlen = 1 byte to write
mov $1,%ebx # STDOUT
mov $4,%eax # WRITE
int $0x80 # Call kernel
.endm
.macro m_strlen # ESI = Pointer to zero terminated string
mov %esi, %edi # ES:EDI for scasb
mov $-1, %ecx # ECX = max
xor %al, %al # Search for zero
repnz scasb
mov %edi, %edx
sub %esi, %edx
dec %edx # EDX = strlen
mov %esi, %ecx # ECX = Pointer to the string
.endm
.macro m_puts
m_strlen # ESI -> EDX and ECX
mov $1,%ebx # STDOUT
mov $4,%eax # WRITE
int $0x80 # Call kernel
m_newline # Write new line
.endm
.text
_start:
xor %eax, %eax
1:
mov 4(%esp,%eax,4),%esi # mov esi, [esp + eax * 4 + 4]
push %eax
m_puts
pop %eax
inc %eax
cmp (%esp), %eax
jne 1b # backwards to the previous label "1"
mov (%esp),%ebx # Exitcode
mov $1,%eax # EXIT
int $0x80 # Call kernel