汇编语言在哪里用于对硬件进行编程?

Where is Assembly language used to program hardware?

我四处寻找开始学习嵌入式系统的好地方 design/programming,虽然所有人都建议使用 Arduino 和 RaspberryPi 等初学者设备,但我从未见过任何关于在汇编级别编程的建议.我最近完成了我的计算机科学学士学位,但我越来越被硬件而不是软件编程所吸引。我上过一门硬件设计课程,我们在 Logism 中进行了 68k 的汇编编程和逻辑设计。我有一个 Raspberry Pi,并把它弄乱了一些,但用于这些设备的语言仍然更高级别(C、C++、Python)。

所以我有几个问题,因为我对 chips/computer 硬件的底层设计很感兴趣:

汇编语言在当今硬件设计中有哪些应用?它仍然被广泛使用还是大部分被高级语言抽象出来?

如果它仍然被广泛使用,什么类型的工作涉及汇编编程?最流行的汇编编程平台是什么(68k、x86 等)?

最后,如果上述适用,现代汇编编程有哪些资源?

谢谢,我又看了一些关于深入研究嵌入式系统的其他问题,所以我希望我的问题足够不同,但如果我的问题已经得到回答,请随时标记这个问题!

What are the applications of Assembly language in today's hardware design? Is it still widely used or is most of it abstracted by higher level languages?

汇编语言用于特定用例。它仍然是嵌入式系统软件中特定用例中最常见的,但它仍然存在于其他低级项目中,如 Linux 内核。 它在这里和那里使用是因为某些事情只能在汇编中完成,并且因为汇编会产生更快和更小的代码。我会给你一个真实的例子,让你更清楚。 智能卡固件的一些关键部分是用汇编语言编写的,以保护软件执行免受不同类型的攻击,而汇编语言是唯一可以完全控制程序二进制表示的语言。编译器可能会在固件中留下安全漏洞,这可能成为攻击者的切入点。

If it is still widely used, what type of jobs involve Assembly programming?

这里有几个需要高级汇编语言知识的示例工程职位:

  • 编译器工程师。
  • 固件工程师。
  • 安全固件工程师。
  • 恶意软件分析师。

What are the most popular platforms for assembly programming (68k, x86, etc.)?

看看这些时代最流行的CPU架构,你就会有答案(剧透英特尔x86/x64,ARM)。

Finally, what are some resources for modern-day Assembly programming, if the above applies?

Google

What are the applications of Assembly language in today's hardware design? Is it still widely used or is most of it abstracted by higher level languages?

使用汇编程序进行设备级编程的理由不多。 C 和 C++ 等系统级语言可以 运行 在资源很少且没有 OS 的独立裸机系统上。过去通常采用汇编程序来实现时间关键代码段(根据我的经验,通常几乎没有必要的证据),但是现代优化编译器很少需要,并且编译器封装了需要人类的指令集专业知识仅仅学习一个架构需要花费很多时间——因此编译器通常会在性能上击败人类。

花费数年时间磨练一种架构的汇编程序技能的开发人员可能有理由为他们的成就感到自豪,但通常不愿意考虑新的架构,因为他们可能会击败编译器的特定于架构的技能是多余的,并且他们往往不愿意承认现代编译器通常可以获得更好的整体结果,因为这会让他们之前的努力付诸东流。如果你必须快速行动(通常有商业需要这样做),汇编器不是这样做的方法,我会对提倡使用汇编器的开发人员保持警惕,而不是首先未能获得必要的结果在 C 或 C++(或 ADA 或 Forth - 除了汇编程序之外的任何东西)中。

我可能不会把汇编程序开发人员写成恐龙(实际上我会 - 但我尽量保持礼貌 ;-) ),但在系统的最低级别 bootstrap 之外,中断处理或上下文切换(在任何情况下通常由现有代码或库提供),汇编程序是您在必要时求助的东西,而不是计划从一开始就使用的东西 - 通常是 "premature optimisation".

If it is still widely used, what type of jobs involve Assembly programming? What are the most popular platforms for assembly programming (68k, x86, etc.)?

不是。很少。在超过 25 年的实时系统嵌入式开发中,我很少编写任何汇编程序,但有时需要能够读取它——通常是编译器生成的汇编程序。

需要汇编代码的地方是高级语言无法到达的地方,适用于访问非内存映射核心CPU寄存器。这种访问是必要的,例如在 RTOS 中实现上下文切换 - 但该代码可能非常小并且 "boiler-plate" 被复制 - 您不一定需要自己编写此类代码。例如,请参阅 here,其中在大部分 C 代码中使用了一小部分内联汇编程序来影响 ARM Cortex-M 上的任务调度程序。

在非内存映射的体系结构上 I/O,通常有 inp/outp 指令需要汇编程序来实现,尽管这通常是由目标库或编译器内部的 C 函数接口提供的.对于内存映射 I/O,C 或 C++ 中没有任何内容可以阻止访问任意内存地址。然而,目标硬件可能会实现限制此类访问的特权级别或内存保护,管理此类保护可能需要无法用高级语言实现的代码;但通常会再次提供库或内部支持。

在 ARM Cortex-M 上,可以 运行 直接从复位向量编写 C 代码,并完全用 C 代码实现中断处理程序,无需汇编程序胶水 - 因此在某些情况下越来越多地不需要汇编程序。

Finally, what are some resources for modern-day Assembly programming, if the above applies?

大多数 C 和 C++ 工具链包括一个独立的宏汇编器并支持内联汇编(混合 C 和汇编代码),并且相关的源代码级调试器也支持指令级调试。

What are the applications of Assembly language in today's hardware design? Is it still widely used or is most of it abstracted by higher level languages?

它在低级电子设计中仍然很常见,通常意味着嵌入式微控制器而不是微处理器。

If it is still widely used, what type of jobs involve Assembly programming? What are the most popular platforms for assembly programming (68k, x86, etc.)?

电子硬件设计人员仍然例行地将汇编用于时间确定性或速度关键型操作(通常是较大的高级语言应用程序的一小部分 运行 作为从闪存加载到微控制器的固件)。

仍然常用汇编语言编程的一些芯片是 Atmel、Microchip PIC、Cypress、Parallax、Renesas、MSP430。如果在英特尔处理器或任何 运行 非 RTOS 的大型应用程序上大规模使用汇编语言,我会感到惊讶。

"Use assembly when nanoseconds matter, otherwise stick to high level."是行业内的大致经验法则。