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