.data 部分中的两个元素

Two elements in section .data

我一直在尝试从 asm 中的 libc 执行 puts 函数,我一直在努力解决这个问题:如果传递给 puts 的参数是 null 那么它应该将“(null)\n”写入标准输出,否则它应该写字符串 + \n.

起初我试图在我的 .data 部分中声明两个元素,如下所示:

 int    puts(char *s);

 section .data
    nl db 10
    null_msg db "(null)", 10

 section .text
    global _ft_puts

 _ft_puts:
 mov        rax, rdi
 cmp        rdi, 0
 jz     nul
 xor        r9, r9
 jmp        len

len:
   cmp      byte[rdi + r9], 0
   jz       write
   inc      r9
   jmp      len

write:
   mov      rax, 0x2000004
   mov      rsi, rdi
   mov      rdi, 1
   mov      rdx, r9
   syscall
   mov      rax, 0x2000004
   lea      rsi, [rel nl]
   mov      rdi, 1
   mov      rdx, 1
   syscall
   jmp      return

nul:
   mov      rax, 0x2000004
   mov      rdi, 1
   lea      rsi, [rel null_msg]
   mov      rdx, 7
   syscall
   jmp      return

return:
   mov      rax, 1
   ret

它没有打印任何错误,但只打印了 null_msg。无论如何,我通过使用 null_msg 中的 \n 找到了解决方法,但我仍然很好奇。我正在使用 2015 年 3 月 10 日编译的 NASM 版本 2.11.08

2.11.08 中有一个已知错误 (here and here) 与数据部分中的相对寻址和多个条目有关,至少在 OSX Yosemite 上(我收集到你正在使用 OSX 因为你的 syscall 号码使用 OSX class-系统调用 'standard').

我会尝试使用较早版本的 nasm 测试相同的代码,如果可行,那可能就是您的问题所在。

查看生成的汇编代码以了解它实际上 生成的内容可能也很值得,因为那(不幸的是,而不是您的源代码)是 CPU 将被执行。我看到的一个症状是它在加载数据项或地址时使用了不正确的固定偏移量。