NASM 2 строки дб (инициализированные данные) вроде бы не работают
У меня есть следующий код x86-64, который я могу запустить на OSX Yosemite:
global _main
extern _exit
extern _puts
DEFAULT REL
section .data
putsmsg: db 'Puts message...',0
another: db 0
section .text
_main:
push rbp
mov rbp, rsp
; print a string using PUTS
lea rdi, [putsmsg]
call _puts
; call EXIT(0) c function
mov rdi, 0
call _exit
Я компилирую, связываю и запускаю следующим образом (где источник a.asm):
nasm -f macho64 a.asm ; gcc a.o -o a.bin ;./a.bin
Он не печатает сообщение "Puts message...", тогда как выводит сообщение, если я просто закомментирую строку, содержащую метку "Another". Что здесь не так? Почему он не печатает правильную строку, когда у меня есть другая инициализированная строка данных?
1 ответ
У меня работает на GNU/Linux, с yasm. (После удаления _
префикс из имен функций.)
$ yasm -felf64 puts.asm
$ gcc -o put puts.o
$ ./puts
Puts message...
Это со 2-й строкой БД, которая еще присутствует:
another: db 0
В последние пару недель был еще один вопрос, касающийся почти точно этой проблемы (сообщение не печаталось, когда после строки было больше данных) в OS X. ОП этого вопроса обнаружил, что у него работает Yasm на OS X. Может быть, есть ошибка в Nasm для OS X?
В конце концов я нашел сообщение, о котором я говорил: Независимый код позиции указывает на неправильный адрес. Смотрите обсуждение в комментариях к моему ответу. ОП обнаружил, что его код работает с yasm, но не смог определить, была ли ошибка в nasm или он просто использовал ее неправильно.