【问题标题】:Where is Assembly language used to program hardware?汇编语言在哪里用于编程硬件?
【发布时间】:2015-10-31 09:20:32
【问题描述】:

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

所以我有几个问题,因为我对芯片/计算机硬件的底层设计非常感兴趣:

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

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

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

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

【问题讨论】:

    标签: assembly embedded hardware-programming


    【解决方案1】:

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

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

    如果它仍然被广泛使用,什么类型的工作涉及组装 编程?

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

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

    什么是最流行的汇编编程平台(68k, x86 等)?

    查看这些时代最流行的 CPU 架构,您就会得到答案(剧透 Intel x86/x64、ARM)。

    最后,现代汇编编程有哪些资源, 以上是否适用?

    谷歌

    【讨论】:

    • 谢谢,这很有帮助:)
    • 嵌入式系统的标准绝对是 C,自 ARM Cortex-M 以来,C++ 变得越来越流行。汇编程序用于非常特殊的问题,例如仅用于 DSP 或用于无法使用 C 的少数系统存根(例如 RTOS 中的调度程序的一部分)。即使在那里,大部分代码通常都是用 C 或 C++ 实现的,而汇编代码被封装在非常低级的函数中。
    • 添加到列表游戏编程 - 不像以前那么重要,但有时仍然需要。
    【解决方案2】:

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

    使用汇编程序进行设备级编程的原因很少。诸如 C 和 C++ 之类的系统级语言可以在资源很少且没有操作系统的独立裸机系统上运行。过去通常求助于汇编程序来实现时间关键的代码部分(根据我的经验,通常几乎没有必要的证据),但现代优化编译器很少需要,并且编译器封装了指令集专业知识,需要人工仅仅学习一个架构就需要很多小时 - 所以编译器通常会在性能上击败人类。

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

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

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

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

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

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

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

    最后,现代汇编编程有哪些资源, 以上是否适用?

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      “当纳秒重要时使用汇编,否则坚持高水平。”是业内的大致经验法则。

      【讨论】:

        猜你喜欢
        • 2014-10-07
        • 2011-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-01
        • 2017-04-24
        • 1970-01-01
        相关资源
        最近更新 更多