Анонимные ярлыки в сборке 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
Другие вопросы по тегам