int 0x80系统调用的参数传递规则
2014-03-20 21:26
197 查看
系统调用的参数传递规则:
传递给系统调用的参数则必须按照参数顺序依次存放到寄存器ebx,ecx,edx,esi,edi中,当系统调用完成之后,返回值存放在eax中;
A.当系统调用所需参数的个数不超过5个的时候,执行"int$0x80"指令时,需在eax中存放系统调用的功能号,传递给系统调用的参数则按照参数顺序依次存放到寄存器ebx,ecx,edx,esi,edi中,当系统调用完成之后,返回值存放在eax中;
比如,经常用到的write函数的定义如下:
ssize_twrite(int fd, const void* buf, size_t count);
该函数的功能最终通过SYS_write这一系统调用来实现的;根据上面的参数传递规则可知,参数fd存放在ebx中,参数buf存放在ecx中,参数count存放在edx中,而系统调用功能号SYS_write则存放在寄存器eax中;系统调用执行完成之后,返回值可以从eax中得到;
B.当系统调用的参数超过5个的时候,执行"int$0x80"指令,需在eax中存放系统调用的功能号,所不同的只是全部的参数应该依次存放在一块连续的内存区域里,同时在寄存器ebx中保存指向该内存区域的指针(即:该连续内存块的首地址),返回值仍然保存在寄存器eax中;由于只是需要一块连续的内存区域来保存系统调用所需要的参数,因此,完全可以像普通的函数调用一样使用栈来传递系统调用所需要的参数;但是要注意一点:Linux采用的是C语言的调用模式,这就意味着所有参数必须以相反的顺序进栈,即:最后一个参数最先进栈,而第一个参数最后进栈;如果采用栈来传递系统调用所需要的参数,在执行"int$0x80"指令时,还应将栈指针的当前值(栈顶地址)复制到寄存器ebx中;
例如,系统调用mmap()的参数个数就超过5个:
void*mmap(void* start, size_t length, int prot, int flags, int fd, off_t offset);
使用这个系统调用时,系统调用功能号保存到eax中,mmap()所需要的所有参数存放到一块连续的内存区域中,这块连续内存区域的首地址存放到ebx中,即可。
linux系统调用 :
1. 放系统调用号到eax中
2. 设置系统调用参数到ebx,ecx等
3. 调用相关中断(DOS:21h; linux:80h)
4. 返回结果通常保存在eax中
例子:
move ax,1 ;sys_exit系统调用号
mov ebx,0 ;exit参数0,相当于exit(0)
int 80h ;80中断,通常中软中断,调用它意思就是告诉内核,你处理它
传递给系统调用的参数则必须按照参数顺序依次存放到寄存器ebx,ecx,edx,esi,edi中,当系统调用完成之后,返回值存放在eax中;
A.当系统调用所需参数的个数不超过5个的时候,执行"int$0x80"指令时,需在eax中存放系统调用的功能号,传递给系统调用的参数则按照参数顺序依次存放到寄存器ebx,ecx,edx,esi,edi中,当系统调用完成之后,返回值存放在eax中;
比如,经常用到的write函数的定义如下:
ssize_twrite(int fd, const void* buf, size_t count);
该函数的功能最终通过SYS_write这一系统调用来实现的;根据上面的参数传递规则可知,参数fd存放在ebx中,参数buf存放在ecx中,参数count存放在edx中,而系统调用功能号SYS_write则存放在寄存器eax中;系统调用执行完成之后,返回值可以从eax中得到;
B.当系统调用的参数超过5个的时候,执行"int$0x80"指令,需在eax中存放系统调用的功能号,所不同的只是全部的参数应该依次存放在一块连续的内存区域里,同时在寄存器ebx中保存指向该内存区域的指针(即:该连续内存块的首地址),返回值仍然保存在寄存器eax中;由于只是需要一块连续的内存区域来保存系统调用所需要的参数,因此,完全可以像普通的函数调用一样使用栈来传递系统调用所需要的参数;但是要注意一点:Linux采用的是C语言的调用模式,这就意味着所有参数必须以相反的顺序进栈,即:最后一个参数最先进栈,而第一个参数最后进栈;如果采用栈来传递系统调用所需要的参数,在执行"int$0x80"指令时,还应将栈指针的当前值(栈顶地址)复制到寄存器ebx中;
例如,系统调用mmap()的参数个数就超过5个:
void*mmap(void* start, size_t length, int prot, int flags, int fd, off_t offset);
使用这个系统调用时,系统调用功能号保存到eax中,mmap()所需要的所有参数存放到一块连续的内存区域中,这块连续内存区域的首地址存放到ebx中,即可。
linux系统调用 :
1. 放系统调用号到eax中
2. 设置系统调用参数到ebx,ecx等
3. 调用相关中断(DOS:21h; linux:80h)
4. 返回结果通常保存在eax中
例子:
move ax,1 ;sys_exit系统调用号
mov ebx,0 ;exit参数0,相当于exit(0)
int 80h ;80中断,通常中软中断,调用它意思就是告诉内核,你处理它
相关文章推荐
- 0x80系统调用的参数传递规则
- ARM系统中函数调用时参数传递规则
- 【工作记录0022】C#(.NET)调用Java开发的WebService(wsdl),客户端传递非string类型参数(int,double,bool等),而服务端无法获取到参数值的解决方案
- 函数调用时参数传递规则
- python 函数调用参数传递规则
- 系统调用及参数传递过程
- 系统调用(int 0x80)详解
- 增加系统调用层次(比如使得系统调用可以传递参数)
- 《第一篇 linux 0.12 系统调用(int 0x80)详解》
- Linux系统调用 int 80h int 0x80
- ARM函数调用时参数传递规则
- 系统调用和函数参数传递
- x86 和 x64 汇编调用C 函数参数传递规则(GCC)
- x86 和 x64 汇编调用C 函数参数传递规则(GCC)
- ARM系统中函数调用过程中的参数传递-转
- 调用系统内部searchmanager组建时,Intent参数的传递与获取
- 函数调用时参数传递规则
- Linux设备驱动第二天(数组参数传递,模块相互调用、printk、内核GPIO函数、系统调用)
- arm汇编函数调用参数传递规则
- int 0x80 系统调用实现