Chinaunix

标题: 系统调用号如何传入 [打印本页]

作者: stuman    时间: 2013-10-07 19:48
标题: 系统调用号如何传入
我们知道系统调用使用指令int 0x80,系统调用号通过eax寄存器传入,那么再使用int指令时,系统调用号是通过汇编指令手动的放入eax中吗?也就是说使用int前使用mov将调用号放入eax?
作者: 瀚海书香    时间: 2013-10-08 09:51
回复 1# stuman
我们知道系统调用使用指令int 0x80,系统调用号通过eax寄存器传入,那么再使用int指令时,系统调用号是通过汇编指令手动的放入eax中吗?也就是说使用int前使用mov将调用号放入eax?


Right!

Such as exit syscall on x86 system, assemble like this:

xor eax, eax
mov al, 0x01
int 0x80

   
作者: true_casey    时间: 2013-10-18 20:10
本帖最后由 true_casey 于 2013-10-18 20:58 编辑

EAX,EBX,ECX,EDX 都作为参数传递的寄存器,但是调用协定规定的是EAX,ECX,EDX作为调用者保存,所以你会在使用EBX传参的函数入口处发现有 PUSH  EBX的语句,EAX一般作为系统号,EBX,ECX,EDX 作为参数,使用了EBX,就得PUSH EBX,然后内核的返回值放到EAX,传回来,这里有两个方式:

1.汇编,用一个变量,在pop 之前,保存,大致就像这样,函数的语句:
      .................
      mov    eax,SYS_NR
      int       0x80
      mov    dword [var],eax
      ..............
   如果写成函数的形式:

xxx:
      ...................                 ; eax,ecx,edx 不需要保存,由调用者保存
      mov   eax,SYS_NR
      mov   ebx,[ebp + xxxx] ; 从堆栈取参数,这里使用了 ebx,所以前面必须要 push ebx
      ......   ecx
      ......   edx
      int     0x80                   ; 返回值在 eax 里,调用者在pop eax 之前将返回值写到赋值的变量内,比如  int a = xxx () ;再pop eax,ecx,edx
      ...................
      ret
      

2. 内嵌汇编,就是 C里面嵌入汇编,优势显而易见,直接可以用局部变量带回参数,如

/* the syscall argc == 3 */
#define sys_call_3(ret_type,func_name,atype,a,btype,b,ctype,c)   \
ret_type func_name(atype a,btype b,ctype c ) \
{\
    unsigned long __res;\
    __asm__ ("int  $0x80"\
            :"=a"(__res)\
            :"a"(__NR_##func_name),"b"(a),"d"(b),"c"(c));\
    return (__res);\
}

第2种很方便,所以大部分都是第2种方式。。。。

作者: rongpmcu    时间: 2013-10-20 21:28
肯定是汇编实现的啦 可以稍微看下libc就知道了  或者直接
objdump -d libc.a  随便找一个系统调用  




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2