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