我有以下 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”的行,它就会打印该消息。这里出了什么问题?当我有其他初始化的数据行时,为什么它不打印正确的字符串?
使用 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 存在错误?
我最终找到了我正在谈论的帖子:位置无关代码指向错误地址 https://stackoverflow.com/q/31640418/224132。请参阅我的答案评论中的讨论。 OP 发现他的代码可以与 yasm 配合使用,但无法判断 nasm 是否存在错误,或者他只是使用错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)