linux下32位汇编调用规则

传递给系统调用的参数必须安装参数顺序一次放到寄存器中,当系统调用完成后,返回值放在eax中:

  1. 当系统调用参数<=5个时:

    eax中存放系统调用的功能号,传递给系统调用的参数顺序依次放到寄存器:ebx,ecx,edx,esi,edi中
  2. 当系统调用参数>5个时:

    eax中存放系统调用的功能号,全部参数应依次放在一块连续的内存区域中,同时在寄存器ebx中保存指向该内存区域的指针(内存块的首地址);linux采用的是C调用模式,这意味着如果要以stack来实现这个连续的内存块(当然可以用其他方式实现,比如heap)时,所有参数必须以相反的顺序进栈:即最后一个参数最先进栈,第一个参数最后进栈,最后将栈指针的值(栈顶地址)放到寄存器ebx中。

C库函数的参数传递规则:

  1. 参数从右向左一次入栈(push);
  2. 库函数返回值放在eax中;
  3. 系统调用exit参数值在exit调用结束程序退出时会被传递给系统shell,通过打印$?的值可以看到

汇编函数的返回值:

  1. 对于32位返回值放在寄存器eax中
  2. 对于64位返回值,高位放在edx,低位放在eax中

本篇未给出浮点数值的调用和返回规则,虽然略知一二,但没有系统化的认识,不敢乱写;如各位有相关的完整文档请不吝赐教帮助补全,谢谢。

上一篇:linux下64位汇编的系统调用(3)


下一篇:Linux下AT&T汇编语法格式与Intel汇编语法格式异同