nasm函数_system从未执行?

时间:2019-03-14 16:21:37

标签: macos assembly call x86-64 nasm

我正在Mac上工作,并编写了一个asm程序,该程序应该经过一些修改将自己的源代码打印到另一个文件中,然后自己编译并运行它。因此,我使用函数system()运行bash命令。 这是我的问题,行调用_system在一行上工作,但是几行之后,什么也没有发生,它的调用似乎被忽略了。 我进行了测试,以确保一切都很好,而且看起来还不错,我没有收到错误或其他任何信息……这是一个示例:

section .data

    i: equ 5
[...]
    s_string: equ $ - string
    name: db "Sully_%d.s", 0
    s_name: equ $ - name
    cc: db "nasm -fmacho64 Sully_%1$d.s -o Sully_%1$d.o", 0
    s_cc: equ $ - cc
    link: db "ld Sully_%1$d.o -o Sully_%1$d -macosx_version_min 10.8 -lSystem", 0
    s_link: equ $ - link
    ex: db "./Sully_%d", 0
    s_ex: equ $ - ex
    tmp: db "ls -l", 0

section .text
    global start
    global _main
    extern _sprintf
    extern _dprintf
    extern _printf
    extern _system
    extern _close
    extern _strlen

start:
    call _main
    ret

_main:
    push rbp
    mov rbp, rsp
    sub rsp, 16
    sub rsp, 0x650                  ; 1616 byte to store strings later
    mov rbx, i
    cmp rbx, 0
    je end_point
    mov rdi, qword [rsi]
    call _strlen
    mov r12, rax
load_name:
    lea rdi, [rbp + 16]
    lea rsi, [rel name]              ; string in data section, work fine since I can print it later at rbp + 16 location, I mean the result of 'name' string format with i as parameter
    cmp r12, 7
    jne ln_mov_i
    mov rdx, i
    cmp r12, 7
    je ln_mov_i_1
ln_mov_i:
    mov rdx, i - 1
ln_mov_i_1:
    xor rax, rax
    call _sprintf
    cmp rax, 0
    jl ret
load_cc:
    lea rdi, [rel tmp]
    call _system                      ; this does work

    lea rdi, [rbp + 32 + s_name]      ; string in data section, work fine since I can print it later
    lea rsi, [rel cc]
    cmp r12, 7
    jne lc_mov_i
    mov rdx, i
    cmp r12, 7
    je lc_mov_i_1
lc_mov_i:
    mov rdx, i - 1
lc_mov_i_1:
    xor rax, rax
    call _sprintf
    cmp rax, 0
    jl ret
    lea rdi, [rel tmp]
    call _system                    ; this doesn't work
[...]

我注意到比系统返回值32512多了一些测试,如果我完全理解的话,这是127。我试图使用sh -c'my command',但这并没有什么更好的方法...

在使用dtruss时,我发现posix_spawn的调用失败,我不知道为什么,这是我对示例2调用_system的发现:

 PID/THRD         RELATIVE  ELAPSD  CPU SYSCALL(args)                                                    = return
 3040/0x143a1:      2271     243    240 posix_spawn(0x7FFEEFBFF454, 0x7FFF5BDBD256, 0x7FFEEFBFF360)      = 0 0
 3040/0x143a1:      2492     157    153 posix_spawn(0x7FFEEFBFF454, 0x7FFF5BDBD256, 0x7FFEEFBFF360)      = -1 Err#14

我不知道为什么它不起作用!我在互联网上找不到有关此功能“系统”的任何规范。

0 个答案:

没有答案