连续的 sys_write 系统调用未按预期工作,OS X 上的 NASM 错误?

2024-01-20

我正在尝试使用 NASM 学习 MacOS 汇编,但无法让一个简单的程序运行。我正在尝试“Hello,World”的变体,其中两个单词由宏独立调用。我的源代码如下所示:

%macro printString 2
    mov     rax, 0x2000004 ; write
    mov     rdi, 1 ; stdout
    mov     rsi, %1
    mov     rdx, %2
    syscall
%endmacro     

global start    

section .text    

start:
    printString str1,str1.len    

    printString str2,str2.len    

    mov     rax, 0x2000001 ; exit
    mov     rdi, 0
    syscall    


section .data    

str1:   db      "Hello,",10,
.len:  equ       $ - str1    

str2:   db      "world",10
.len:  equ       $ - str2    

预期结果应该是:

$./hw
Hello,
World
$

相反,我得到:

$./hw
Hello,
$

我缺少什么?我如何解决它?

EDIT:我正在使用以下命令进行编译和运行:

/usr/local/bin/nasm -f macho64 hw.asm
ld -macosx_version_min 10.7.0 -lSystem -o hw hw.o
./hw

NASM 2.11.08 和 2.13.02+ 有错误macho64输出。您所观察到的似乎是我最近在使用绝对引用时在 2.13.02+ 中看到的。最终链接的程序应用了不正确的修复,因此参考str2是不正确的。不正确的修复导致我们打印出不正确的内存str2.

NASM 有一个错误报告 https://bugzilla.nasm.us/show_bug.cgi?id=3392468#c6关于他们系统中的这个问题。我根据问题中的代码添加了此失败的具体示例。希望 NASM 开发人员能够重现故障并创建修复程序。

Update:截至 2018 年 6 月,我的观点是 NASM 中存在足够多的重复出现的错误和回归,因此我目前不推荐 NASM 进行 Macho-64 开发。


我对 Macho-64 开发的另一个建议是使用 RIP 相对寻址而不是绝对寻址。 RIP 相对寻址是 MacOS 更高版本上 64 位程序的默认设置。

在 NASM 中,您可以使用default rel文件中的指令将默认地址从绝对地址更改为 RIP 相对地址。为此,您必须从使用更改mov register, variable to lea register, [variable]当尝试将变量的地址移动到寄存器时。您修改后的代码可能如下所示:

default rel

%macro printString 2
    mov     rax, 0x2000004 ; write
    mov     rdi, 1 ; stdout
    lea     rsi, [%1]
    mov     rdx, %2
    syscall
%endmacro

global start

section .text

start:
    printString str1,str1.len

    printString str2,str2.len

    mov     rax, 0x2000001 ; exit
    mov     rdi, 0
    syscall


section .data

str1:   db      "Hello,",10
.len:  equ       $ - str1

str2:   db      "world",10
.len:  equ       $ - str2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

连续的 sys_write 系统调用未按预期工作,OS X 上的 NASM 错误? 的相关文章

随机推荐