Я работаю на 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'.