Анонимные ярлыки в сборке AT & T - PullRequest
0 голосов
/ 03 ноября 2018

Есть ли способ перехода к следующей / предыдущей метке в сборке AT & T без ограничения пространства имен, например jmp @f в синтаксисе Intel ?

1 Ответ

0 голосов
/ 03 ноября 2018

Да. Это называется «локальные метки» и является даже более мощным, чем вариант 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
...