代码之家  ›  专栏  ›  技术社区  ›  Ólafur Waage

有没有直接与硬件对话的语言不是汇编语言?

  •  2
  • Ólafur Waage  · 技术社区  · 15 年前

    只是想知道汇编世界是如何运作的,我在网上读到了汇编语言 wiki

    它实现了数字机器代码的符号表示,以及编程特定CPU体系结构所需的其他常量。

    但根据这句话,可能还有其他语言使用其他符号来表示相同的数字机器代码。

    那么,有没有其他语言可以直接与非汇编语言的硬件对话?还是我弄错了?

    8 回复  |  直到 4 年前
        1
  •  8
  •   Steve Jessop    15 年前

    能够 使用一组不同的符号来表示机器代码。但是没有人会打扰你,因为你不会得到太多。

    ARM有一个名为ADD的指令。在ARM汇编程序中,“ADDR0,r0,#1”表示构成递增寄存器0指令的4字节机器代码。

    无论您将该指令称为什么,都不能更改可用的指令集,而仍然将其称为ARM汇编程序。无论您将ADD操作称为“ADD”、“SUM”、“PLUS”还是“ADD”,它基本上都是相同的编程语言。因为如果每个人对所有事物都使用相同的名称,那么使用现有的引用就更容易了,所以情况就是这样。

        2
  •  4
  •   anon anon    15 年前

    你弄错了(或者可能是对的——很难从你的问题中分辨出来)。汇编语言是特定CP体系结构的二进制指令模式的符号(易于阅读)表示。人们偶尔会遇到对“portabe汇编程序”(Scott Nudds,有人吗?)的引用,但这些确实是稍微高级一点的语言。

        3
  •  3
  •   Rainer Joswig mmmmmm    15 年前

    Clozure Common Lisp . 它允许用Lisp编写内联汇编代码。以下定义了一个函数%safe get ptr,该函数用x86汇编程序表示法编写:

    (defx86lapfunction %safe-get-ptr ((src arg_y) (dest arg_z))
      (check-nargs 2)
      (save-simple-frame)
      (macptr-ptr src imm0)
      (leaq (@ (:^ done) (% fn)) (% ra0))
      (movq (% imm0) (@ (% :rcontext) x8664::tcr.safe-ref-address))
      (movq (@ (% imm0)) (% imm0))
      (jmp done)
      (:tra done)
      (recover-fn-from-rip)
      (movq ($ 0) (@ (% :rcontext) x8664::tcr.safe-ref-address))
      (movq (% imm0) (@ x8664::macptr.address (% dest)))
      (restore-simple-frame)
      (single-value-return))
    

    它仍在组装中。除此之外,还有许多语言具有低级结构,用于从内存或寄存器等设置/读取值。

        4
  •  2
  •   James Anderson    15 年前

    汇编语言与目标系统的硬件体系结构密切相关。

    它们还允许您以与机器内存体系结构(单片、分段、虚拟等)匹配的方式访问和操作内存。

    话虽如此,最现代的芯片都在模拟古老的指令集,因此无论如何,你真的没有那么接近实际情况,而且,更好的C编译器知道底层的微体系结构(比如管道、每个周期执行多少整数指令等)因此,一个好的C编译器几乎总是比一般的汇编代码表现得更好!

        5
  •  2
  •   Peter Quirk    4 年前

    为了澄清关于Burroughs B5000和B6000系列机器的一些答案,没有汇编程序,因此也没有汇编语言编程。也完全没有链接加载器。单通道Algol编译器(由Donald Knuth编写)直接生成机器代码。《硬件参考手册》使用汇编程序员可以识别的助记符来描述指令,但这是我们最接近的。

    您可以要求Algol编译器在编译期间将生成的代码与源代码内联打印。

    Narrative Description of the Master Control Program

        6
  •  1
  •   RS Conley    15 年前

    与C混合的程序集被大量使用。一些CPU(如8052芯片)带有一种在ROM中烧录的高级语言。这些语言有特殊的语句,允许在较低级别上与硬件交互。

    CPU系列通常被设计为使用相同的机器代码,这意味着相同的汇编语言。一个特定的CPU可能有更多的缓存、管道等,但在其他方面可以与同一系列中的其他CPU运行相同的机器代码。

    因此,编译成一个CPU的软件将在所有CPU上运行。其中最流行的是i386指令集,它几乎为所有Windows机器提供了电源。有一个16位前置和一个64位后继。

        7
  •  1
  •   HankB    15 年前

    仅使用此类型的程序集进行对话 到你的硬件。

    最后,对于大多数现代操作系统,如Windows和Linux,应用程序运行在虚拟内存中,其中程序地址与物理地址不匹配,并且程序通常被拒绝访问硬件。当操作系统未授予硬件特定权限时,尝试访问硬件的代码将生成中断,返回操作系统并不再执行。

        8
  •  1
  •   Jörg W Mittag    15 年前

        9
  •  1
  •   Andrew    4 年前

    是的,只要你认为硬件是虚拟的,它就被调用了!第四堆栈机器的基本寄存器操作的机器代码为FORTH。但是,如果你模拟这个硬件,也许它很重要? http://www.greenarraychips.com/ 对于领先的优势和1984年的经典“思考”的利奥布罗迪,这可能会帮助你。。。即使你从不使用Forth。

        10
  •  0
  •   Dan    15 年前

    你的问题是:

    我很惊讶没有人提到 Register Transfer Language Verilog VHDL .

    RTL不是一种编程语言 ,并且通常与硬件无关(程序集绝对不是无关的,它针对特定的体系结构)。

    VHDL和Verilog是最常用于可编程逻辑的,我认为这符合“直接与硬件对话”的条件。软核通常在可编程逻辑中实现,因此您可以使用其中一个来实现(例如)ARM处理器,它本身可以在汇编中编程。。。。

    有趣的东西。。。。让我希望我能回去&重新做我所有的EE/CE工作。。。。