سؤال

وماذا يفعل هذه القمامة الطباعة بدلا من الخروج برنامجي بأمان؟ يمكنني استخدام نظام يدعو بهذه الطريقة على BSD، وأنا أتساءل ما الذي أحتاج إلى العمل على انجاحه في لينكس.

int
main(int argc, char **argv)
{
    __asm ("movq $1,%rax; movq $0,%rdi; syscall"); /* exit(0) ? */
    return 0;
}

وشكرا.

هل كانت مفيدة؟

المحلول

<اقتباس فقرة>   

لماذا هذه القمامة الطباعة بدلا من الخروج برنامجي بأمان؟

CESA-2009-001 و "Syscall 1 غير الخروج على I386 ولكن الكتابة على x86_64 ".

<اقتباس فقرة>   

ما أنا بحاجة لجعله يعمل في لينكس

واستخدم الترتيبية syscall من الحالي <لأ href = "http://git.kernel.org/؟p=linux/kernel/git/stable/linux-2.6-stable.git؛a=blob؛f= قوس / إلى x86 / وتشمل / ASM / unistd_64.h "يختلط =" noreferrer "> unistd_64.h

وآمل أن يساعد هذا!

نصائح أخرى

وSyscall 1 غير الخروج على I386 ولكن الكتابة على إكس86-64 على ما أعتقد.

وتحرير: هذا يبدو غير دقيق: وفقا لشبكة الإنترنت، والتي لا يبدو أن لديها الكثير من المعلومات حول التجمع لينكس إكس86-64 يبدو أن هذا الإعداد السجل المتوقع قبل تعليمات syscall.

 rax  system call number
 rbx  arg0
 rcx  return address from syscall
 rdx  arg2
 rsi  arg3
 rdi  arg4
 r8   arg5
 r9   arg1    (expected by gcc in %rcx)
 r10-r15  should be saved/restored by C code
 rbp  dito What is dito??
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top