Анонимные ярлыки в сборке AT&T
Есть ли способ перейти к следующей / предыдущей метке в сборке AT&T, не обременяя пространство имен, как jmp @f
в синтаксисе Intel?
1 ответ
Решение
Да. Это называется "локальные метки" и даже более мощно, чем вариант MASM/FASM:
https://sourceware.org/binutils/docs/as/Symbol-Names.html
Метка состоит только из одного номера. Вперед или назад прыжок указывается с этим номером.
Пример (Метки 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