汇编语言在当今的硬件设计中有哪些应用?它仍然被广泛使用还是大部分被高级语言抽象了?
使用汇编程序进行设备级编程的理由很少。诸如 C 和 C++ 之类的系统级语言可以在资源很少且没有操作系统的独立裸机系统上运行。过去通常求助于汇编程序来实现时间关键的代码部分(根据我的经验,通常几乎没有必要的证据),但现代优化编译器很少需要,并且编译器封装了指令集专业知识,需要人工仅仅学习一个架构就需要很多小时 - 所以编译器通常会在性能上击败人类。
花了数年时间为一种架构磨练汇编技能的开发人员可能为他们的成就感到自豪,但通常不愿考虑新架构,因为他们的架构特定技能可能会击败编译器是多余的,而且通常不愿意承认现代编译器通常可以总体上获得更好的结果,因为这会使他们以前的辛勤工作无效。如果您必须快速行动(并且通常有商业需要这样做),那么汇编程序不是这样做的方法,我会警惕开发人员提倡使用汇编程序而不首先未能获得必要的结果在 C 或 C++(或 ADA 或 Forth - 除了汇编程序之外的任何东西)中。
我可能不会把汇编开发人员写成恐龙(实际上我会 - 但我试图保持礼貌;-)),但在最低级别的系统引导、中断处理或上下文切换(通常由现有的代码或库),汇编程序是您在必要时使用的东西,而不是从一开始就计划使用的东西 - 这通常是“过早的优化”。
如果它仍然被广泛使用,什么类型的工作涉及汇编编程?最流行的汇编编程平台有哪些(68k、x86 等)?
它不是。很少。在超过 25 年的实时系统嵌入式开发中,我很少编写任何汇编程序,但有时需要能够阅读它——通常是编译器生成的汇编程序。
需要汇编代码的地方是高级语言无法到达的区域,这适用于访问非内存映射的核心 CPU 寄存器。例如,为了在 RTOS 中实现上下文切换,这种访问是必要的——但该代码可能非常小并且“样板”被复制——您不必自己编写这样的代码。例如,请参见此处,其中在大部分 C 代码中使用内联汇编程序的一小部分来影响 ARM Cortex-M 上的任务调度程序。
在具有非内存映射 I/O 的体系结构上,通常有需要汇编程序来实现的 inp/outp 指令,尽管这通常由目标库或编译器内部的 C 函数接口提供。对于内存映射 I/O,C 或 C++ 中没有任何内容可以阻止访问任意内存地址。然而,目标硬件可以实现限制此类访问的特权级别或内存保护,管理此类保护可能需要无法以高级语言实现的代码;但通常会再次提供库或内在支持。
在 ARM Cortex-M 上,可以直接从复位向量运行 C 代码,并完全用 C 代码实现中断处理程序,无需汇编程序胶水——因此在某些情况下越来越不需要汇编程序。
最后,如果上述适用,现代汇编编程有哪些资源?
大多数 C 和 C++ 工具链包括一个独立的宏汇编器并支持内联汇编(混合 C 和汇编代码),并且相关的源代码级调试器也支持指令级调试。