NASM 2行数据库(初始化数据)似乎无法正常工作

时间:2015-08-03 20:15:13

标签: nasm x86-64

我有以下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 ...',如果我只是注释掉包含标签'另一个'的行,它会打印消息。这里出了什么问题?当我有另一条初始化数据线时,为什么不打印正确的字符串呢?

1 个答案:

答案 0 :(得分:1)

使用yasm在GNU / Linux上为我工作。 (从函数名中删除_前缀后。)

$ yasm -felf64 puts.asm
$ gcc -o put puts.o
$ ./puts
Puts message...

第二个数据库线仍然存在:

another:    db      0

在过去几周内,在OS X上还有另一个问题,几乎就是这个问题(当字符串后面有更多数据时打印的消息)。该问题的OP发现OS X上的yasm为他工作。也许OS X的nasm中有一个错误?

我最终找到了我正在谈论的帖子:Position Independent Code pointing to wrong address。请参阅我的回答评论中的讨论。 OP发现他的代码与yasm一起使用,但是无法判断nasm中是否存在错误或者他是否只是错误地使用了它。