У меня есть простая dprintf
программа, написанная на NASM, которая печатает длинный формат с более чем 6 аргументами.Я передаю аргументы, как требует соглашение о вызовах ( RDI , RSI , RDX , RCX , R8 , R9 ).Пока я использую только те, моя программа работает нормально.
Я не могу понять, почему я получаю segfault каждый раз, когда пытаюсь что-то добавить в стек в качестве дополнительных аргументов.Вот источник:
;a comment
%macro DATA 0
section .data
string: db "%6$ca comment%1$c%4$cmacro DATA 0%1$csection .data%1$c%2$cstring: db %3$c%5$s%3$c, 0%1$c%2$cpath: db %3$cGrace_kid.s%3$c, 0%1$c%4$cendmacro%1$c%4$cdefine SC_OPEN 0x2000005%1$c%4$cmacro MAIN 0%1$c%1$cDATA%1$c%1$csection .text%1$c%2$cglobal start%1$c%2$cglobal _main%1$c%2$cextern _dprintf%1$c%1$cstart:%1$c%2$ccall _main%1$c%2$cret%1$c%1$c_main:%1$c%2$cpush rbp%1$c%2$cmov rbp, rsp%1$c%2$cmov rax, SC_OPEN%1$c%2$clea rdi, [rel path]%1$c%2$cmov rsi, 0x0200%1$c%2$cxor rsi, 0x0002%1$c%2$cmov rdx, 0640o%1$c%2$cclc%1$c%2$csyscall%1$c%2$cjc ret%1$c%2$ccmp rax, 0%1$c%2$cjle ret%1$c%2$cmov rdi,rax%1$c%2$clea rsi, [rel string]%1$c%2$cmov rdx, 10%1$c%2$cmov rcx, 9%1$c%2$ccall _dprintf%1$c%2$cxor rax, rax%1$cret:%1$c%2$cleave%1$c%2$cret%1$c%4$cendmacro%1$c%1$cMAIN%1$c", 0
path: db "Grace_kid.s", 0
%endmacro
%define SC_OPEN 0x2000005
%macro MAIN 0
DATA
section .text
global start
global _main
extern _dprintf
start:
call _main
ret
_main:
push rbp
mov rbp, rsp
;sub rsp, 16
mov rax, SC_OPEN
lea rdi, [rel path]
mov rsi, 0x0200
xor rsi, 0x0002
mov rdx, 0640o
clc
syscall
jc ret
cmp rax, 0
jle ret
mov rdi, rax
lea rsi, [rel string]
mov rdx, 10
mov rcx, 9
mov r8, 34
mov r9, 37
mov rbx, 59
push rbx
xor rax, rax
call _dprintf
xor rax, rax
ret:
leave
ret
%endmacro
MAIN
Я собираю и связываю с этими командами:
nasm -fmacho64 file.s
ld file.o -macosx_version_min 10.14 -lSystem
Это прекрасно работает, но я хотел бы добавить дополнительные параметры.Я попытался поместить его в стек, используя:
mov rbx, 59
push rbx
Он вызывает ошибку, независимо от того, передам ли я несколько байтов RSP или нет.
Я нахожусь под MacOS Mojave и яиспользую последнюю версию NASM.