只是想知道汇编世界是如何运作的,我正在阅读wiki上的汇编语言,这句话让我感到震惊:
它实现了编程特定CPU架构所需的数字机器代码和其他常量的符号表示。
我一直认为汇编是一种基于CPU的固定语言(基于所说的CPU使用不同的编译器和语言),因此对于你的CPU,你只能使用这种类型的汇编来与硬件通信。
但基于该引用,可能还有其他语言使用其他符号来表示相同的数字机器代码。
那么,有没有其他语言可以直接与不是汇编的硬件对话?或者我弄错了?
答案 0 :(得分:7)
您可以使用一组不同的符号来表示机器代码。但没有人会烦恼,因为你不会获得太多收益。
ARM有一条名为ADD的指令。在ARM汇编程序中,“ADD r0,r0,#1”表示4字节的机器代码,它构成增加寄存器0的指令。
无论您将该指令称为什么,都无法更改可用的指令集,仍称其为ARM汇编程序。无论您将ADD操作称为“ADD”,“SUM”,“PLUS”还是“ADDITION”,它仍然基本上是相同的编程语言。因为如果每个人都使用相同的名称来使用现有的引用更容易,那就是发生的事情。
一个有用的变化可能是将指令表示为“INC r0”,因为ARM没有INC指令,这是一个常见的操作。这导致汇编语言中的宏。这些确实改变了语言,但是一旦你有发出多个ARM指令的宏,你开始失去汇编的WYSIWYG性质。最后你开始认为也许你可能只写C语言。我从经验中说话(它不是ARM,但它是一个宏观的汇编程序)。
一个常见的区别是 - 如果你觉得自己很迂腐,你可以说有两种不同版本的ARM汇编语言,一种是大写的,一种是小写的(或者说有一种语言,有多种符号用于一样)。同一机器代码的不同反汇编器有时会输出不同的格式。有时这些是不同的,特定的汇编程序将无法处理所有这些,或者汇编程序将提供它们自己的便利,这些便利与同一平台上的另一个汇编程序不兼容。但实际上,这一切都是一样的,如果你想要区分它,通常是因为你被叮咬而不是因为发生了任何好事......
答案 1 :(得分:4)
你弄错了(或者可能是对的 - 从你的问题中很难说出来)。汇编语言是特定CP体系结构的二进制指令模式的符号(易于人类阅读)表示。有人偶尔会遇到“portabe汇编程序”的引用(Scott Nudds,有人吗?)但这些语言实际上略高一些。
答案 2 :(得分:3)
以下是Clozure Common Lisp的示例。它允许在Lisp中编写内联汇编代码。下面定义了用x86汇编程序表示法编写的函数%safe-get-ptr:
(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))
仍然是集会。除此之外,还有许多语言具有低级结构来设置/读取内存或寄存器中的值等。
CPU不执行汇编语言。汇编语言只是特定CPU机器代码的一些(或多或少直接)文本表示。
答案 3 :(得分:2)
汇编语言与目标系统的硬件架构密切相关。
在很大程度上,存在从asm代码到机器指令的一对一映射 - 这就是真正的重点 - 因此您可以在单个指令的级别上操作硬件。
它们还允许您以与机器内存架构(monolithis,segemnted,virtual等)匹配的方式访问和操作内存。
汇编程序差别很大,有些人比将3个字母代码翻译成4个字节的指令要多得多,其他的,就像古老的OS / 390汇编语言一样,本身就是复杂的编程环境。
说过所有这些最现代的芯片都在模仿古老的指令集,所以你真的不是那么接近电线,而且,更好的C编译器都知道底层的微架构(管道之类的东西,有多少整数指令)每个周期执行等等。所以好的C编译器几乎总是会执行平庸的汇编代码!
答案 4 :(得分:2)
弄清有关Burroughs B5000和B6000系列机器的一些答案,没有汇编程序,因此也没有汇编语言编程。也完全没有链接加载程序。单遍Algol编译器(由Donald Knuth编写)直接生成了机器代码。硬件参考手册描述了汇编程序员可以识别的使用助记符的指令,但这是我们最接近的指令。
您可以要求Algol编译器在编译过程中将生成的代码与源代码内联打印。
Narrative Description of the Master Control Program对堆栈体系结构和主要指令进行了很好的描述。
答案 5 :(得分:1)
与C混合的装配被大量使用。一些CPUS(如8052芯片)带有更高级别的ROM语言。这些语言具有特殊语句,允许在较低级别与硬件进行交互。
CPUS系列通常设计为使用相同的机器代码,这意味着相同的汇编语言。特定CPU可能具有更多缓存,管道等,但在其他情况下可以运行与同一系列中的其他CPUS相同的机器代码。
因此编译到一个CPU的软件将在所有这些上运行。其中最受欢迎的是i386指令集,它几乎可以为所有Windows机器供电。有一个16位的前身和一个64位的后继者。
答案 6 :(得分:1)
...那么对于你的CPU你可以 只使用这种类型的组件来说话 到您的硬件。
所有语言最终都转换为在真实硬件上执行的指令,无论是像汇编程序那样直接完成,还是像C一样通过高级抽象完成。棘手的一点是实际获取机器指令来操作硬件以你想要的方式,因为一个更高级别的语言是保护你免受硬件细节。
某些语言(如C语言)旨在直接操作硬件,因此它们包含易失性等关键字,以防止编译器优化对设备寄存器的引用。这些可能会被写入而不会被回读,因此编译器认为保存的值永远不会再次使用。或者可能需要读取设备寄存器,尽管从未使用过该值。对于诸如启用和禁用普通程序不会生成的中断之类的操作,还有其他指令。
这可能还需要链接器支持,以便存储器位置(用于存储器映射的I / O)可以位于设备寄存器的正确地址。但是,有些处理器对I / O使用不同的指令,并且必须有一些工具可以将它们插入到代码流中,因此在许多情况下,除非有明确的语言支持,否则可能无法访问H / W.
最后,对于大多数现代操作系统,如Windows和Linux,应用程序在虚拟内存中运行,其中程序地址与物理地址不匹配,并且程序通常被拒绝访问硬件。当操作系统未授予特定权限时尝试访问硬件的代码将生成中断,返回操作系统并且不再执行。
答案 7 :(得分:1)
当然,有很多语言直接与非汇编的硬件对话。例如,在Burroughs B5000上,CPU在ALGOL的变体中编程,在Lisp机器上,CPU直接执行Lisp代码,在早期的Smalltalk工作站上,CPU直接执行Smalltalk字节码。研究人员已经基于直接执行Lambda Calculus的图形缩减引擎构建了CPU。有多个公司构建Java处理器,当然用JVM字节码编程。
答案 8 :(得分:1)
是的,只要您将硬件视为虚拟,就称为FORTH! FORTH堆栈机的原始寄存器操作的机器代码为FORTH。但是,如果您仿真此硬件,那么也许很重要? 看看http://www.greenarraychips.com/的领先优势和Leo Brodie 1984年的“ Thinking Forth”经典作品,即使您从未使用过Forth,也可能会帮助您...
答案 9 :(得分:0)
你的问题是:
那么,有没有其他语言可以直接与未组装的硬件对话?或者我弄错了?
我很惊讶没有人提及Register Transfer Language或任何硬件描述语言,例如Verilog或VHDL。
RTL本身不是一种编程语言 ,并且通常是硬件中立的(程序集绝对不是中立的,它是针对特定的架构)。
VHDL和Verilog最常用于可编程逻辑,我认为它可以称为“直接与硬件对话”。软核通常在可编程逻辑中实现,因此您可以使用其中一个来实现(例如)ARM处理器,它本身可以在汇编中进行编程....
有趣的东西....让我希望我可以回去&让我所有的EE / CE再次工作......