Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 有没有直接与硬件对话的语言不是';t组装?_Assembly_Programming Languages_Cpu Architecture_Machine Code_Machine Language - Fatal编程技术网

Assembly 有没有直接与硬件对话的语言不是';t组装?

Assembly 有没有直接与硬件对话的语言不是';t组装?,assembly,programming-languages,cpu-architecture,machine-code,machine-language,Assembly,Programming Languages,Cpu Architecture,Machine Code,Machine Language,我只是想知道汇编世界是如何运作的,当时我正在阅读关于汇编语言的文章,这句话打动了我: 它实现了数字机器代码的符号表示,以及编程特定CPU体系结构所需的其他常量 我一直认为汇编语言是一种基于CPU的固定语言(有不同的编译器和基于CPU的语言),因此对于CPU,您只能使用这种类型的汇编与硬件进行对话 但根据这句话,可能还有其他语言使用其他符号来表示相同的数字机器代码 那么,有没有其他语言可以直接与非汇编语言的硬件对话?还是我弄错了?你弄错了(或者可能是对的——很难从你的问题中分辨出来)。汇编语言是特

我只是想知道汇编世界是如何运作的,当时我正在阅读关于汇编语言的文章,这句话打动了我:

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

我一直认为汇编语言是一种基于CPU的固定语言(有不同的编译器和基于CPU的语言),因此对于CPU,您只能使用这种类型的汇编与硬件进行对话

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


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

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

汇编语言与C语言混合使用的情况很多。一些CPU(如8052芯片)带有一种在ROM中烧录的高级语言。这些语言有特殊的语句,允许在较低级别上与硬件交互

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


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

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

在很大程度上,从asm代码到机器指令之间存在一对一的映射——这才是真正的关键所在——因此,您可以在单个指令的级别上操作硬件

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

汇编程序差别很大,有些不只是将三个字母的代码翻译成4字节的指令,还有一些,如令人尊敬的OS/390汇编语言本身就是复杂的编程环境

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

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

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

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

一个有用的更改可能是将指令表示为“incr0”,因为ARM没有INC指令,这是一种常见的操作。这导致了汇编语言中的宏。这些确实改变了语言,但是一旦你有了发出多个ARM指令的宏,你就开始失去汇编的所见即所得特性。最终你开始想,也许你也可以写C。我是根据经验说的(它不是ARM,但它是一个宏化汇编程序)

一个共同的区别是大小写——如果你觉得自己很迂腐,你可以说ARM汇编语言有两种不同的版本,一种是大写的,一种是小写的(或者说有一种语言,同一种语言有多个符号)。同一机器代码的不同反汇编程序有时输出不同的格式。有时,这些功能差异很大,某个特定的汇编程序无法处理所有这些功能,或者汇编程序会提供自己的便利,而这些便利与同一平台上的另一个汇编程序不兼容。但事实上,这一切都是一样的,如果你费心去区分,那通常是因为你被咬了屁股,而不是因为任何好事正在发生

。。。因此,对于您的CPU,您可以 仅使用此类型的程序集进行对话 到你的硬件

所有语言最终都会转换为在真实硬件上执行的指令,无论是直接使用汇编程序还是通过高级抽象使用C语言,最棘手的是让机器指令以您想要的方式操作硬件,因为高级语言的一个要点是保护您不受硬件细节的影响

有些语言,如C,是为了直接操作硬件而设计的,因此它们包含volatile等关键字,以防止编译器以其他方式优化对设备寄存器的引用。这些值可能会被写入而不会被读回,因此编译器认为保存的值永远不会被再次使用。或者,尽管从未使用该值,但可能需要读取设备寄存器。还有一些其他的操作指令,比如启用和禁用普通程序不会生成的中断

这可能还需要链接器支持,以便
(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))