rip c语言,GNU C 对标准C语言的扩展

特殊属性声明

GNU C 允许声明函数、变量和类型的特殊属性,以便进行手工的代码优化和定制。如果要指定一个属性声明,只需要在声明后添加__ attribute __((ATTRIBUTE))。其中ATTRIBUTE为属性说明,如果存在多个属性,则以逗号分隔。GNU C 支持noreturn,noinline, always_inline, pure, const, nothrow, format, format_arg, no_instrument_function, section, constructor, destructor, used, unused, deprecated, weak, malloc, alias warn_unused_result nonnull等十个属性。

noreturn属性作用于函数,表示该函数从不返回。这会让编译器优化代码并消除不必要的警告信息。例如: #define ATTRIB_NORET __attribute__((noreturn)) ....

asmlinkage NORET_TYPE void do_exit(long error_code) ATTRIB_NORET;

packed属性作用于变量和类型,用于变量或结构域时,表示使用最小可能的对齐,用于枚举、结构或联合类型时表示该类型使用最小的内存。如对于结构体,就是它告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。例如: struct example_struct

{

char a;

int b;

long c;

} __attribute__((packed));

regparm属性用于指定最多可以使用n个寄存器(eax, edx, ecx)传递参数,n的范围是0~3,超过n时则将参数压入栈中(n=0表示不用寄存器传递参数)。

注意:以上这些属性都是在X86处理器体系结构下的,在X64体系结构下,大部分内容都是同样有效的。但是,这里要注意regparm属性,由于在X64体系结构下,GUN C的默认调用约定使用寄存器传递参数。所以,如果regparm属性里使用的寄存器个数超过3个,也仍然会使用其他寄存器来传递参数。这一点要遵循X64体系结构的调用约定。

下面可以看一个例子。 int q = 0x5a;

int t1 = 1;

int t2 = 2;

int t3 = 3;

int t4 = 4;

#define REGPARM3 __attribute((regparm(3)))

#define REGPARM0 __attribute((regparm(0)))

void REGPARM0 p1(int a)

{

q = a + 1;

}

void REGPARM3 p2(int a, int b, int c, int d)

{

q = a + b + c + d + 1;

}

int main()

{

p1(t1);

p2(t1,t2,t3,t4);

return 0;

}

使用objdump命令反汇编,相关命令如下: objdump -D 可执行程序

其中-D选项用于反汇编所有的程序段,包括:代码段、数据段、只读数据段以及一些系统段等等。而-d命令只反汇编代码段的内容。

反汇编后的关键代码如下: Disassembly of section .text:

0000000000400474 :

400474: 55 push %rbp

400475: 48 89 e5 mov %rsp,%rbp

400478: 89 7d fc mov %edi,-0x4(%rbp)

40047b: 8b 45 fc mov -0x4(%rbp),%eax

40047e: 83 c0 01 add $0x1,%eax

400481: 89 05 3d 04 20 00 mov %eax,0x20043d(%rip) # 6008c4

400487: c9 leaveq

400488: c3 retq

0000000000400489 :

400489: 55 push %rbp

40048a: 48 89 e5 mov %rsp,%rbp

40048d: 89 7d fc mov %edi,-0x4(%rbp)

400490: 89 75 f8 mov %esi,-0x8(%rbp)

400493: 89 55 f4 mov %edx,-0xc(%rbp)

400496: 89 4d f0 mov %ecx,-0x10(%rbp)

400499: 8b 45 f8 mov -0x8(%rbp),%eax

40049c: 8b 55 fc mov -0x4(%rbp),%edx

40049f: 8d 04 02 lea (%rdx,%rax,1),%eax

4004a2: 03 45 f4 add -0xc(%rbp),%eax

4004a5: 03 45 f0 add -0x10(%rbp),%eax

4004a8: 83 c0 01 add $0x1,%eax

4004ab: 89 05 13 04 20 00 mov %eax,0x200413(%rip) # 6008c4

4004b1: c9 leaveq

4004b2: c3 retq

00000000004004b3 :

4004b3: 55 push %rbp

4004b4: 48 89 e5 mov %rsp,%rbp

4004b7: 53 push %rbx

4004b8: 8b 05 0a 04 20 00 mov 0x20040a(%rip),%eax # 6008c8

4004be: 89 c7 mov %eax,%edi

4004c0: e8 af ff ff ff callq 400474

4004c5: 8b 0d 09 04 20 00 mov 0x200409(%rip),%ecx # 6008d4

4004cb: 8b 15 ff 03 20 00 mov 0x2003ff(%rip),%edx # 6008d0

4004d1: 8b 1d f5 03 20 00 mov 0x2003f5(%rip),%ebx # 6008cc

4004d7: 8b 05 eb 03 20 00 mov 0x2003eb(%rip),%eax # 6008c8

4004dd: 89 de mov %ebx,%esi

4004df: 89 c7 mov %eax,%edi

4004e1: e8 a3 ff ff ff callq 400489

4004e6: b8 00 00 00 00 mov $0x0,%eax

4004eb: 5b pop %rbx

4004ec: c9 leaveq

4004ed: c3 retq

4004ee: 90 nop

4004ef: 90 nop

Disassembly of section .data:

00000000006008c0 <__data_start>:

6008c0: 00 00 add %al,(%rax)

...

00000000006008c4 :

6008c4: 5a pop %rdx

6008c5: 00 00 add %al,(%rax)

...

00000000006008c8 :

6008c8: 01 00 add %eax,(%rax)

...

00000000006008cc :

6008cc: 02 00 add (%rax),%al

...

00000000006008d0 :

6008d0: 03 00 add (%rax),%eax

...

00000000006008d4 :

6008d4: 04 00 add $0x0,%al

...

如果读者还记得2.2.3节中,关于GCC基于X64体系结构的调用约定的话,那就很容易可以看出,函数p1和p2都使用寄存器传递参数,顺序就是RDI, RSI, RDX, RCX,这些细节已经跟regparm的规定完全不一致了。所以,在这里作者觉得,regparm已经不起作用了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410815.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python学习格式化输出(一)

name input(请输入你的姓名&#xff1a;) age input(请输入你的年龄&#xff1a;) job input(你的职业是&#xff1a;) msg -------------info %s------------ 我的名字叫&#xff1a;%s 我的年龄&#xff1a;%s 我的职业是&#xff1a;%s ------------end-------------- %…

Ubuntu linux上Nautilus安装RabbitVCS扩展

安装包 $ sudo add-apt-repository ppa:rabbitvcs $ sudo aptitude update $ sudo apt-get install rabbitvcs-core rabbitvcs-nautilus 重新启动nautilus $ nautilus -q 转载于:https://www.cnblogs.com/wdpp/archive/2010/11/22/2386291.html

bat与C语言混合编程,BAT与HTML混合编程的方法

:οnkeypresswindow.close()>colorgreen>HTMLCodes我一直是菜菜。就楼主这个帖来说&#xff0c;其思想就是把VBS混合编程的思想用到html语言上&#xff0c;随便举个混合编程的例子&#xff0c;来表达(我就懂点点VBS)楼主此贴的思想&#xff1a; 2>nul 3>nul&ec…

小数转换成二进制c语言,只写出了十进制小数转换成二进制的,求二进制小数转十进制的...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include #include #define NUM 2#define ZERO 0.000001int PrnMainMenu(void);void ProcessLoop(void);void two(void);void ten(void);int a,b[10],i0,c0;void integer(int n) //定义整数部分{if(n>0){integer(n/NUM…

SAS 读取数据文件

每次读取数据时需要告诉SAS3件事&#xff1a;1&#xff1a;数据存在哪里&#xff1f;2&#xff1a;数据的形式3&#xff1a;创建的数据集的类型&#xff08;永久/临时&#xff09; 1 读取SAS数据集 DATA temp; /*temp 为创建的数据集名称*/ INFILE C\mysas\data\temp.dat; /*数…

C++ 数制转换

一、十进制 转换成 n 进制 这里要求 1< n < 9 转换函数实现如下 //将十进制 dec 转换成 n 进制&#xff0c;结果存在 other中&#xff0c;other在外部分配内存 void Decimal_to_Other(int dec, char *other, int n) { //1 < n < 9 int i0; int dec_copy dec; char…

计算机二级C语言考的函数,【帮考网】2012计算机等级二级考试C语言:函数递归...

一、栈在说函数递归的时候&#xff0c;顺便说一下栈的概念。栈是一个后进先出的压入(push)和弹出(pop)式数据结构。在程序运行时&#xff0c;系统每次向栈中压入一个对象&#xff0c;然后栈指针向下移动一个位置。当系统从栈中弹出一个对象时&#xff0c;最近进栈的对象将被弹出…

自我总结篇之vue的组件通信(父传子 子传父 非父子)

一&#xff1a;父传子 父组件代码如下&#xff1a; <template><div class"father"><child :messagemessage :message2message2></child> </div> </template> <script> import child from /components/child.vue export de…

Window Server 2008中开启Window Media Player功能

Window Server 2008中开启Window Media Player功能 服务器管理器 功能 优质Windows音频视频体验 打勾 安装 其它功能有&#xff1a; 桌面休验 等.... the end! 转载于:https://www.cnblogs.com/sqlite3/archive/2010/12/02/2566887.html

c语言数据结构kmp中next计算,数据结构——关于KMP算法中next函数的详细解析

以前看到数据结构中字符串的模式匹配时&#xff0c;花了半天的时间&#xff0c;才把KMP算法中的next函数整明白了&#xff0c;结果过了几天在看到这时&#xff0c;只记得next[j1]next[j]1&#xff0c;但是有时候能套公式正确算出&#xff0c;有时候就算不对&#xff0c;因此今天…

浅谈“微服务”

微服务概述 1.1 易于扩展 1.2 部署简单 1.3 技术异构性 数据库的服务化切分 2.1 什么是“分库分表”&#xff1f; 2.2 数据库扩展的几种方式 2.3 分库分表的几种方式 2.4 引入分库分表中间件后面临的问题 2.5 现有分库分表中间件的横向对比 微服务架构中的分布式事务 3.1 什么…

liigo:爱可视70平板电脑使用感受,遗憾与满足并存

我想大部分人来这里&#xff0c;不是想听美言的。许多资料、宣传性文章、评测、视频等等&#xff0c;网络上已经有很多了&#xff08;其中外文占很大比例&#xff09;。 我想大部分人来这里&#xff0c;是想听真正的使用感受的。我想&#xff0c;我这里提到的许多内容&#xff…

c语言 拓补排序源代码,拓扑排序C语言代码

#include#include#include#include//----------------公共的-----------------#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2//---------------------------------------//*************栈的初始大小和增量*************…

visual studio 正则表达式 查找与替换文本

好多时候想要重构一些代码&#xff0c;但是修改起来发现很麻烦&#xff0c;因为简单的文本替换不能满足需求&#xff0c;这时候就要借助ide的力量了。还好visual studio 2010支持正则表达式查找和替换。如下图所示&#xff1a; document.all.domElementA.style.visibility hid…

51 Python - 装饰器 参数化装饰器——装饰器更通用

05参数化装饰器——装饰器更通用 参数化装饰器如何理解&#xff0c;简单理解就是让装饰器可以通用。场景举例&#xff0c;现在有个需求要改某一段文字&#xff0c;既要加<P>标签&#xff0c;又要加<B>&#xff0c;还有加<Div>。是不是意味着需要定义多个装饰…

手机android怎么开机画面,Android使用BroadcastReceiver实现手机开机之后显示画面的功能...

本文实例讲述了Android使用BroadcastReceiver实现手机开机之后显示画面的功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;在此例中介绍了怎样使用BroadcastRececiver。使用BroadcastReceiver需要继承这个类&#xff0c;并且重写public void onReceiver(Context co…

[html] HTML采用的是RGB颜色还是CMYK颜色?为什么?

[html] HTML采用的是RGB颜色还是CMYK颜色&#xff1f;为什么&#xff1f; 用在电脑或者手机上显示的大部分都是RGB&#xff0c;用于需要印刷的都用CMYK 并且不同的显示器色域不同会导致色差&#xff0c;不同浏览器也有自己的调色板&#xff0c;后面总结出来过一套web安全色&am…

Registered Nurse in the US

注册护士移民美国的条件美国护士RN考试介绍美国注册护士考试复习美国各州注册护士考试要求CGFNSRegistered nurseTop Paid Registered Nurses 转载于:https://www.cnblogs.com/sbxlm/p/3655784.html

安卓突然自动关机 android正在启动,华为手机开机重启后老是显示安卓正在启动优化应用是为什么?...

建议进入Recovery模式执行双清wipe操作。Recovery模式指的是一种可以对安卓机内部的数据或系统进行修改的模式(类似于windowsPE或DOS)。在这个模式下可以刷入新的安卓系统&#xff0c;或者对已有的系统进行备份或升级&#xff0c;也可以在此恢复出厂设置。进入recovery的方法&a…

[html] 写一个密码默认星号,但可以查看密码的输入框

[html] 写一个密码默认星号&#xff0c;但可以查看密码的输入框 <i class"icon-password"></i> <input type"text" v-if"pwdType" v-model"eyeTxt" /> <input type"password" placeholder"输入新…