__attribute__((regparm(3))) from GNU C
在 x86 上,regparm 属性会传递一个数值给编译器,这个数值会告诉编译器要用多少个寄存器来传递函数参数(EAX, EDX 或 ECX,最多 3 个寄存器),通常情况下函数是用堆栈来传递参数的。如果参数比较多,那么其余的参数仍然通过堆栈来传递。
比如我们指定 __attribute__((regparm(0))) ,则表示不用寄存器来传递参数,所有参数都通过堆栈来传递;如果我们指定 __attribute__((regparm(3))),那么就是说会用 3 个寄存器来传递参数(EAX, EDX, ECX),其余的参数通过堆栈来传递。
下面先看不用寄存器来传递参数的情况:
#include <stdio.h> __attribute__((regparm(3))) int parm_to_register (int reg1, int reg2, int reg3, int stack)
{
return (reg1 + reg2 + reg3 + stack);
} int main()
{
int reg1 = ;
int reg2 = ;
int reg3 = ;
int stack = ; parm_to_register(reg1, reg2, reg3, stack); return ();
}
regparm 的語法是:regparm(number),regparm 屬性只在 Intel 386 平臺上有作用,用來指定最多可以有多少個("number" )參數(arguments)能以暫存器來傳遞,regparm(0) 表示參數都不能透過暫存器來傳遞,因此所有參數都會透過堆疊來傳遞。
關於regparm(3)的討論,是要求comliler從X86的暫存器(EAX,EDX,ECX)依序取值,最大就是三個。一般取值都是由所屬的stack取出。
__attribute__((regparm(3))) from GNU C的更多相关文章
- GNU C 与 ANSI C的区别
		1.零长度数组 GNU C允许使用零长度数组,定义变长度对象时比较方便 struct var_data { int len; char data[0]; }; var_data的大小仅为一个int型, ... 
- 聊聊我理解的ANSI C、ISO C、GNU C、POSIX C
		几句话了解C标准之间的关系 C语言标准 早期的计算机汇编语言是与机器平台紧密耦合的,为了屏蔽这种耦合,增加代码的可移植性,C语言随机出现. 二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异, ... 
- Linux 内核常见宏定义
		我们在阅读Linux内核是,常见到这些宏 __init, __initdata, __initfunc(), asmlinkage, ENTRY(), FASTCALL()等等.它们定义在 /incl ... 
- 转载  linux内核 asmlinkage宏
		转载http://blog.chinaunix.net/uid-7390305-id-2057287.html 看一下/usr/include/asm/linkage.h里面的定义:#define a ... 
- Linux内核中的fastcall和asmlinkage宏
		代码中看见:#define _fastcall 所以了解下fastcall -------------------------------------------------------------- ... 
- 一则利用内核漏洞获取root权限的案例【转】
		转自:https://blog.csdn.net/u014089131/article/details/73933649 目录(?)[-] 漏洞描述 漏洞的影响范围 漏洞曝光时间 漏洞产生的原因 漏洞 ... 
- Linux Debugging(三):  C++函数调用的参数传递方法总结(通过gdb+反汇编)
		上一篇文章<Linux Debugging:使用反汇编理解C++程序函数调用栈>没想到能得到那么多人的喜爱,因为那篇文章是以32位的C++普通函数(非类成员函数)为例子写的,因此只是一个特 ... 
- linux kernel笔记
		文章目录 关于linux内核中的__attribute__关键字 Linux kernel启动参数 gdt / ldt PCB 关于linux内核中的__attribute__关键字 part I: ... 
- gcc的编译属性和选项
		1.指定内存默认对其参数: __attribute__((packed)):按一字节对其__attribute__((aligned(n))):从此之后默认按n字节对其 例如: struct stu ... 
随机推荐
- [CF1228] 简要题解
			A 题意 求\(l \le x \le r\)的所有数位不同的数\(x\), 任意输出一个. \(1 \leq l \leq r \leq 10 ^5\) Solution 按照题意模拟即可. #in ... 
- linux查看日志中特定字符串以及前后信息内容命令
			在项目实施过程中,我们经常会查看日志,更是经常会根据某些特地字符串去查找日志内容. 下面就是日志查找命令: 1.查询字符串命令: cat fileName|grep '要查找的字符串' 实例:cat ... 
- Dubbo  系列(07-2)集群容错 - 服务路由
			目录 Dubbo 系列(07-2)集群容错 - 服务路由 1. 背景介绍 1.1 继承体系 1.2 SPI 2. 源码分析 2.1 创建路由规则 2.2 RouteChain 2.3 条件路由 Dub ... 
- leetcode.分治.241为运算表达式设计优先级-Java
			1. 具体题目 给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果.你需要给出所有可能的组合的结果.有效的运算符号包含 +, - 以及 * . 示例 1: 输入: & ... 
- php分割url,获取参数query
			#测试网址: http://localhost/blog/testurl.php?id=5 //获取域名或主机地址echo $_SERVER['HTTP_HOST']."<br> ... 
- android  pull 解析器解析xml文档
			person.xml <?xml version="1.0" encoding="UTF-8"?> <persons> <pers ... 
- PHP  遍历数组for foreach while
			以下是使用foreach while for 三种循环展示遍历数组的概念 1:foreach( ) <?php $a = array('hank','mike','lucy'); forea ... 
- device tree DTB DTC 相互转换
			DTB --> DTS ./dtc -I dtb -O dts *.dtb -o *.dts DTS -> DTB ./dtc -I dts -O dtb -o test.dtb test ... 
- 拓展练习:Linux权限管理--基础权限/ 特殊权限
			目录 基础权限拓展练习 特殊权限拓展练习 基础权限拓展练习 1.用户基础权限为9位,每三位为一组,每组代表着谁的权限? 前三位代表属主权限位 中间三位代表属组权限位 后三位代表其他用户权限位 2.权限 ... 
- Centos yum的源 设置为阿里云源
			在 阿里巴巴镜像站页面,在centos 操作的帮助,有介绍 wget和curl 2种方式来下载CentOS-Base.repo 备份 mv /etc/yum.repos.d/CentOS-Base.r ... 
