nasm функция _system никогда не выполнялась? - PullRequest
0 голосов
/ 14 марта 2019

Я работаю на 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 'моя команда', но это не улучшило ситуацию ...

С помощью 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

Я не могу понять, почему это не работает! Я не могу найти в интернете каких-либо спецификаций об этой функции 'system'.

...