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 или он просто использовал ее неправильно.

Другие вопросы по тегам