一、汇编语言和c++
汇编语言是一门非常古老的语言,现在的计算机专业好像很多学校都不再开设这门课程了,别说汇编,就是C/C++这门课程好像大多数学校都不再开设了。即使开设了,大多也是讲一些C的基础知识,别说和实用的工程就是能正常编程都
距离十万八千里。为什么?难啊。能学会这两门语言的都是少数,能干活的就少之又少了。毕竟大学里是以发论文评价你的水平而不是按你编程的水平来评价你的水平。
这也是学校教育和社会需求脱节的地方。而且看上去有越来越分开的趋势,没有改变的味道。
有人不禁要问,为什么在这个高级语言满天飞的时代,要学习汇编?无它,实际要用。在业务领域开发中,用到汇编的可能性只局限在很低的底层,但在嵌入式和一些特殊领域则还有更多的应用。当然,再多,也是相对来说。之对比高级
语言,那可是少之又少。和c++/c语言来说,汇编更难于学习,但效率更好,在一些特定场景下,可以将二者结合起来,达到更好的效果。
二、源码实例
正所谓说十遍不如写一遍,来个实例最说明问题:
#include <iostream>
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");
}
运行结果为:
7*5 = 35
代码很简单,它通过构造了一个汇编函数cfi_startproc,通过EAX寄存器把立即数7返回,在主函数里通过n得到此返回值。在leal中,%0的意思是不指定哪个寄存器,输入和输出使用同一寄存器。leal这个汇编指令
%0 + %0 * 4 = %0*5,这样就明白了吧。
更多的汇编代码的技术说明,可以参考一些汇编书籍,注意的是微软的汇编和AT&T的汇编不一样,在Linux中使用的是后者。
再次声明:源码来自c++官网
三、总结
在国家强调基础软件重要的时刻,OS和一些底层软件,汇编和c++/c语言可是大有应用前景。掌握一些混合编程的经验,对于在不同的情况下使用更加有效的语言和工具来实现目的,更具有可操作性和实用性。正如前面反复强调的,
没有最好,只有最合适。