64-битный формат Mach-O не поддерживает 32-битные абсолютные адреса, не может поместить байт в буфер resb

Сначала я на OS X (набор x86-64) и использую nasm. Я следую учебнику по ассемблеру и пишу функцию для обращения строки. Моя проблема в том, что я не могу поместить байт в свой буфер resb. У меня Mach-O 64-bit format does not support 32-bit absolute addresses ошибка. Я провел некоторое исследование, пробовал много вещей (например, lea или сначала перейти в регистр), похоже, ничто не решает мою проблему.

Ниже приведен мой код, и моя проблема заключается в следующем: mov [output + rdi], eax (я пытаюсь написать обратную строку входного буфера db для вывода буфера resb 12) в метке reverseStr

section .data
    nl db 0xa
    input db "Hello world!"

section .bss
    output resb 12

section .text
    global start
    global _main

start:
    jmp _main
    ret

_main:
    push rbp
    mov rbp, rsp
    mov rsi, input
    xor rcx, rcx
    cld
    mov rdi, $ + 15
    call calculateStrLength
    xor rax, rax
    xor rdi, rdi
    jmp reverseStr

calculateStrLength:
    cmp byte [rsi], 0
    je exit
    lodsb
    push rax
    inc rcx
    jmp calculateStrLength

reverseStr:
    cmp rcx, 0
    ;je printResult
    pop rax
    mov [output + rdi], eax
    dec rcx
    inc rdi
    jmp reverseStr

person renan    schedule 25.06.2017    source источник
comment
Вы всегда можете получить 64-битный адрес output и поместить его в регистр (например, RDX), а затем выполнить доступ к памяти с помощью RDX. Вы можете сделать lea rdx, [rel output] (rel вынуждает его использовать адресацию относительно RIP) для загрузки, а затем выполнить MOV таким образом mov [rdx + rdi], eax . Поскольку output никогда не меняется, вы можете выполнить lea и загрузить RDX один раз вне цикла.   -  person Michael Petch    schedule 26.06.2017
comment
Да, вы правы, это сработало. Спасибо.   -  person renan    schedule 26.06.2017
comment
Вероятно, вам следует использовать default rel в начале вашего файла. К сожалению, он не включен по умолчанию в NASM/YASM.   -  person Peter Cordes    schedule 02.07.2017