zoukankan      html  css  js  c++  java
  • __attribute__((regparm(3))) from GNU C

    在 x86 上,regparm 属性会传递一个数值给编译器,这个数值会告诉编译器要用多少个寄存器来传递函数参数(EAX, EDX 或 ECX,最多 3 个寄存器),通常情况下函数是用堆栈来传递参数的。如果参数比较多,那么其余的参数仍然通过堆栈来传递。

    比如我们指定 __attribute__((regparm(0))) ,则表示不用寄存器来传递参数,所有参数都通过堆栈来传递;如果我们指定 __attribute__((regparm(3))),那么就是说会用 3 个寄存器来传递参数(EAX, EDX, ECX),其余的参数通过堆栈来传递。

    下面先看不用寄存器来传递参数的情况:

     1 #include <stdio.h>
     2  
     3 __attribute__((regparm(3))) int parm_to_register (int reg1, int reg2, int reg3, int stack)
     4 {
     5         return (reg1 + reg2 + reg3 + stack);
     6 }
     7  
     8 int main()
     9 {
    10         int reg1 = 1;
    11         int reg2 = 2;
    12         int reg3 = 3;
    13         int stack = 4;
    14  
    15          parm_to_register(reg1, reg2, reg3, stack);
    16  
    17         return (0);
    18 }

    regparm 的語法是:regparm(number),regparm 屬性只在 Intel 386 平臺上有作用,用來指定最多可以有多少個("number" )參數(arguments)能以暫存器來傳遞,regparm(0) 表示參數都不能透過暫存器來傳遞,因此所有參數都會透過堆疊來傳遞。

    關於regparm(3)的討論,是要求comliler從X86的暫存器(EAX,EDX,ECX)依序取值,最大就是三個。一般取值都是由所屬的stack取出。

  • 相关阅读:
    此生对我影响最大的三位老师
    介绍自己
    介绍自己
    第三周作业
    第二周作业
    PTA编程总结3
    PTA编程总结2
    PTA编程总结1
    2019年春季学期第七周作业.
    2019年春季学期第六周作业.
  • 原文地址:https://www.cnblogs.com/bittorrent/p/3246540.html
Copyright © 2011-2022 走看看