NASM 2 lines of db (initialized data) seemingly no

2020-04-24 16:43发布

问题:

I have the following x86-64 code, which I can run on 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

I compile, link, and run as follows (where the source is a.asm):

nasm -f macho64 a.asm ; gcc a.o -o a.bin ;./a.bin

It does not print the message 'Puts message...', whereas it does print the message if I simply comment out the line containing the label 'another'. What is going wrong here? Why doesn't it print the correct string when I have the other initialized data line?

回答1:

Works for me on GNU/Linux, with yasm. (After removing the _ prefix from function names.)

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

That's with the 2nd db line still present:

another:    db      0

There was another question about almost exactly this problem (a message not printing when there was more data following the string) on OS X, within the past couple weeks. The OP of that question found that yasm on OS X worked for him. Maybe there's a bug in nasm for OS X?

I eventually found the post I was talking about: Position Independent Code pointing to wrong address. See the discussion in comments on my answer. The OP found his code worked with yasm, but wasn't able to tell if there was a bug in nasm or if he was just using it wrong.



标签: nasm x86-64