• 跟我学c++初级篇——汇编语言的使用


    一、汇编语言和c++

    汇编语言是一门非常古老的语言,现在的计算机专业好像很多学校都不再开设这门课程了,别说汇编,就是C/C++这门课程好像大多数学校都不再开设了。即使开设了,大多也是讲一些C的基础知识,别说和实用的工程就是能正常编程都
    距离十万八千里。为什么?难啊。能学会这两门语言的都是少数,能干活的就少之又少了。毕竟大学里是以发论文评价你的水平而不是按你编程的水平来评价你的水平。
    这也是学校教育和社会需求脱节的地方。而且看上去有越来越分开的趋势,没有改变的味道。
    有人不禁要问,为什么在这个高级语言满天飞的时代,要学习汇编?无它,实际要用。在业务领域开发中,用到汇编的可能性只局限在很低的底层,但在嵌入式和一些特殊领域则还有更多的应用。当然,再多,也是相对来说。之对比高级
    语言,那可是少之又少。和c++/c语言来说,汇编更难于学习,但效率更好,在一些特定场景下,可以将二者结合起来,达到更好的效果。

    二、源码实例

    正所谓说十遍不如写一遍,来个实例最说明问题:

    #include 
    
    extern "C" int func();
    // func 的定义以汇编语言书写
    // 原始字符串字面量可以很有用
    asm(R"(
    .globl func
        .type func, @function
        func:
        .cfi_startproc
        movl $7, %eax
        ret
        .cfi_endproc
    )");
    
    int main()
    {
        int n = func();
        // 扩展内联汇编
        asm ("leal (%0,%0,4),%0"
             : "=r" (n)
             : "0" (n));
        std::cout << "7*5 = " << n << std::endl; // 冲刷缓冲区是有意的
    
        // 标准内联汇编
        asm ("movq $60, %rax\n\t" // Linux 上的“退出”的系统调用序号
             "movq $2,  %rdi\n\t" // 此程序返回 2
             "syscall");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    运行结果为:

    7*5 = 35
    
    • 1

    代码很简单,它通过构造了一个汇编函数cfi_startproc,通过EAX寄存器把立即数7返回,在主函数里通过n得到此返回值。在leal中,%0的意思是不指定哪个寄存器,输入和输出使用同一寄存器。leal这个汇编指令
    %0 + %0 * 4 = %0*5,这样就明白了吧。
    更多的汇编代码的技术说明,可以参考一些汇编书籍,注意的是微软的汇编和AT&T的汇编不一样,在Linux中使用的是后者。

    再次声明:源码来自c++官网

    三、总结

    在国家强调基础软件重要的时刻,OS和一些底层软件,汇编和c++/c语言可是大有应用前景。掌握一些混合编程的经验,对于在不同的情况下使用更加有效的语言和工具来实现目的,更具有可操作性和实用性。正如前面反复强调的,
    没有最好,只有最合适。

  • 相关阅读:
    基于node.js+Vue在线电子商务购物商城系统 Element
    MySQL查询将一个值设置为 1,将所有其他值设置为 0
    输入一个大写字母,程序根据输入字符在字母表的顺序位置n,输出一个高度为n的金字塔图形
    深入flink系列——集群启动流程
    10-DOM节点操作
    【无标题】
    Qt---文件系统
    openpyxl修改excel列数据
    用aardio写一个旋转验证码标注小工具
    牛客小白月赛62
  • 原文地址:https://blog.csdn.net/fpcc/article/details/127713606