我正在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
我不知道为什么它不起作用!我在互联网上找不到有关此功能“系统”的任何规范。