比较宏和宏函数的工作效率

通过 gdb 查看程序的汇编代码,比较宏和宏函数的工作效率。

程序汇编代码

更精彩内容,可以关注我的博客:wenfh2020.com


程序

例子中的最大值实现,宏和函数逻辑基本相同。宏在源码预编译阶段,被替换为代码,增加了代码的体积;函数多了参数传递,函数进栈和出栈等逻辑,自然资源消耗要比宏多。

  • 测试代码
#define _max(x, y) (x) > (y) ? (x) : (y)

int max_func(int x, int y) {
    return x > y ? x : y;
}
int main() {
    int aaa, bbb, ccc, ddd, eee, mmm;

    aaa = 1;
    bbb = 2;
    eee = 3;
    mmm = 4;
    ccc = max_func(aaa, bbb);
    ddd = _max(aaa, bbb);
    eee = ddd;
}

预编译后,宏被替换为源码。

gcc -E test.cpp -o test.i
int max_func(int x, int y) { return x > y ? x : y; }
int main() {
    int aaa, bbb, ccc, ddd, eee, mmm;

    aaa = 1;
    bbb = 2;
    eee = 3;
    mmm = 4;
    ccc = max_func(aaa, bbb);
    ddd = (aaa) > (bbb) ? (aaa) : (bbb);
    eee = ddd;
}

  • 编译源码为 elf 文件进行 gdb 调试
gcc -g test.cpp -o test
  • 通过 gdb 命令查看程序汇编代码
layout asm

0x4004ed <max_func(int, int)>           push   %rbp
0x4004ee <max_func(int, int)+1>         mov    %rsp,%rbp
0x4004f1 <max_func(int, int)+4>         mov    %edi,-0x4(%rbp)
0x4004f4 <max_func(int, int)+7>         mov    %esi,-0x8(%rbp)
0x4004f7 <max_func(int, int)+10>        mov    -0x4(%rbp),%eax
0x4004fa <max_func(int, int)+13>        cmp    -0x8(%rbp),%eax
0x4004fd <max_func(int, int)+16>        jle    0x400504 <max_func(int, int)+23>
0x4004ff <max_func(int, int)+18>        mov    -0x4(%rbp),%eax
0x400502 <max_func(int, int)+21>        jmp    0x400507 <max_func(int, int)+26>
0x400504 <max_func(int, int)+23>        mov    -0x8(%rbp),%eax
0x400507 <max_func(int, int)+26>        pop    %rbp
0x400508 <max_func(int, int)+27>        retq
0x400509 <main()>                       push   %rbp
0x40050a <main()+1>                     mov    %rsp,%rbp
0x40050d <main()+4>                     sub    $0x20,%rsp
0x400511 <main()+8>                     movl   $0x1,-0x4(%rbp)
0x400518 <main()+15>                    movl   $0x2,-0x8(%rbp)
0x40051f <main()+22>                    movl   $0x3,-0xc(%rbp)
0x400526 <main()+29>                    movl   $0x4,-0x10(%rbp)
0x40052d <main()+36>                    mov    -0x8(%rbp),%edx
0x400530 <main()+39>                    mov    -0x4(%rbp),%eax
0x400533 <main()+42>                    mov    %edx,%esi
0x400535 <main()+44>                    mov    %eax,%edi
0x400537 <main()+46>                    callq  0x4004ed <max_func(int, int)>
0x40053c <main()+51>                    mov    %eax,-0x14(%rbp)
0x40053f <main()+54>                    mov    -0x4(%rbp),%eax
0x400542 <main()+57>                    cmp    -0x8(%rbp),%eax
0x400545 <main()+60>                    jle    0x40054c <main()+67>
0x400547 <main()+62>                    mov    -0x4(%rbp),%eax
0x40054a <main()+65>                    jmp    0x40054f <main()+70>
0x40054c <main()+67>                    mov    -0x8(%rbp),%eax
0x40054f <main()+70>                    mov    %eax,-0x18(%rbp)
0x400552 <main()+73>                    mov    -0x18(%rbp),%eax
0x400555 <main()+76>                    mov    %eax,-0xc(%rbp)
0x400558 <main()+79>                    mov    $0x0,%eax
0x40055d <main()+84>                    leaveq
0x40055e <main()+85>                    retq

汇编知识

测试中出现的汇编知识。

寄存器

寄存器描述
rbp64 bit 栈基址寄存器—指向栈底顶
ebp32 bit 栈基址寄存器—指向栈底
bp16 bit 栈基址寄存器—指向栈底
rsp64 bit 栈寄存器—指向栈顶
esp32 bit 栈寄存器—指向栈顶
sp16 bit 栈寄存器—指向栈顶
eax32 bit 通用寄存器
rip64 bit 地址偏移寄存器

汇编指令

命令描述
jmp无条件段内直接转移指令
sub减法指令
jle条件转移指令
mov传送指令
cmp比较指令
push进栈指令
pop出栈指令
ret段内过程返回指令,使子程序结束,继续执行主程序
callq相当于 pushq %rip; jmpq addr
leaveq相当于 movq %rbp; %rsp popq %rbp
retq相当于 popq %rip

callq,leaveq,retq 中的q是指64位操作数


引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Sick Eplan是一种用于自动化控制系统的软件命令,可以用于编写自定义函数和程序来实现特定的功能。它基于Eplan平台开发,主要用于工程师在Eplan软件中进行配置和编程。 Sick Eplan具有许多功能和应用,可以帮助工程师更高效地完成工程设计和项目管理任务。它可以用于创建自定义报告和文档,自动化生成控制图表和电气图,以及自动化生成器件清单等。此外,它还提供了一些实用的工具和功能,例如一键生成电缆接线图和设备布局。 Sick Eplan还可以与其他自动化软件和系统进行集成,如PLC编程和SCADA监控系统。通过与这些系统的集成,工程师可以更方便地进行工程设计和数据交换,大大提高了工作效率和精确性。 Sick Eplan还具有灵活性和可扩展性,可以根据具体的项目要求进行个性化定制。工程师可以根据项目的需求编写自己的命令,以实现特定的功能和自动化任务。 总之,Sick Eplan是一种功能强大的自动化控制软件,在工程设计和项目管理中起到了重要的作用。它可以帮助工程师提高工作效率,减少错误和重复工作,并与其他系统集成,实现更高级的功能和自动化任务。 ### 回答2: Sick Eplan是在工业自动化领域常用的软件工具。它是Eplan公司开发的一套指令库,用于提高工程师在电气系统设计和机械制图方面的效率和准确性。 Sick Eplan可以集成到Eplan电气图纸设计软件中,为用户提供电气符号、脚本和指令等功能。通过使用Sick Eplan,用户可以在电气设计过程中快速选择和插入Sick产品的符号和组件,并生成自动化的电气图纸。 Sick Eplan还可以帮助用户自动生成报表和文档,提高设计文件的一致性和可追溯性。它可以自动提取电气图纸中的关键信息,并生成各种报表和文档,如电气接线图、物料清单、统计报告等。这为用户减少了繁琐的手工工作,提高了设计的效率和准确性。 此外,Sick Eplan还具备了自动化检查和错误纠正的功能。它可以自动检测设计中的错误和不一致性,提供修正建议,并帮助用户快速解决问题。这大大减少了设计过程中的错误和失误可能性,提高了设计的质量和可靠性。 总的来说,Sick Eplan是一款强大的软件工具,它能够为用户提供自动化的电气设计和制图功能,提高工作效率,减少设计错误,提高设计质量。它在工业自动化领域具有广泛的应用前景。 ### 回答3: Sick eplan是一种工业自动化软件中的功能扩展模块。Sick eplan主要用于电气工程设计方面,具有自动化生成电气图纸和电气设计文档的功能。通过Sick eplan,工程师可以快速准确地设计和绘制电气图纸,提高工作效率和设计质量。 Sick eplan提供了丰富的电气符号库和设备模型,可以根据用户需求自定义电气元件,并支持常见的电气标准和规范。用户只需在软件中选择所需的设备,Sick eplan会自动生成相应的电气符号和连接关系,并自动完成电气图纸的绘制工作。此外,Sick eplan还可以自动编号、生成电气部件清单和设备接线图,方便设计人员进行工程管理和文档整理。 Sick eplan还具有数据交互和协作功能,可以与其他设计软件和系统进行数据交换,实现设计和工程资料的共享与同步更新。它可以与PLC、DCS等控制系统进行数据链接,辅助控制系统的编程和调试工作。此外,Sick eplan支持多人同时协作,不同的设计人员可以在同一项目中进行各自的设计工作,并随时查看和修改他人的设计内容,便于团队协作和项目管理。 总之,Sick eplan是一款功能强大的工业自动化软件模块,可以快速准确地进行电气工程设计和绘图工作,提高工作效率和设计质量,方便与其他系统进行数据交互和协作,适用于各种工业自动化和控制系统的设计与实施。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值