免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1672 | 回复: 3
打印 上一主题 下一主题

[中断] 系统调用号如何传入 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-10-07 19:48 |只看该作者 |倒序浏览
我们知道系统调用使用指令int 0x80,系统调用号通过eax寄存器传入,那么再使用int指令时,系统调用号是通过汇编指令手动的放入eax中吗?也就是说使用int前使用mov将调用号放入eax?

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
2 [报告]
发表于 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

   

论坛徽章:
0
3 [报告]
发表于 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种方式。。。。

论坛徽章:
0
4 [报告]
发表于 2013-10-20 21:28 |只看该作者
肯定是汇编实现的啦 可以稍微看下libc就知道了  或者直接
objdump -d libc.a  随便找一个系统调用  
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP