我经常听到人们说你可以“理论上向 CPU 编写直接指令”,但是还有什么比汇编更“直接”的东西是人类可以编写的,然后可以在没有任何从语义到机器指令的“汇编”的情况下执行?
我知道你不能写电压,但请耐心等待......是否存在这样的事情?
我经常听到人们说你可以“理论上向 CPU 编写直接指令”,但是还有什么比汇编更“直接”的东西是人类可以编写的,然后可以在没有任何从语义到机器指令的“汇编”的情况下执行?
我知道你不能写电压,但请耐心等待......是否存在这样的事情?
汇编是 CPU 的操作码(操作码)之上的抽象。
http://en.wikipedia.org/wiki/Opcode
x86 操作码列表:
http://ref.x86asm.net/coder32.html
实际上,您可以在操作码级别进行编程(我在大学时就这样做了)。要在 DOS 上执行此操作,您将使用十六进制编辑器并在文件中键入由 COM 或 EXE 格式指定的标头,然后开始编写表示操作码的二进制指令,以及操作的数据的二进制表示代码可能会起作用。
是的,您可以将机器代码本身插入内存(取决于您的环境的“保护”程度)。除了将源代码映射到机器指令的复杂性之外,编译和汇编代码之间几乎没有区别。
一些处理器实际上具有更低的级别,例如微码,但它们很少用于一般用途。
正如其他人所说,机器语言。一些 CPU 级别的命令没有在汇编语言中公开,这并非闻所未闻 - 没有助记符。LOADALL
首先想到的是英特尔的臭名昭著——它存在于 CPU 中,但汇编器不会识别它。
db
要使用它,可以使用汇编命令将相关字节直接插入代码中。
如果问题是——如何在没有汇编程序的情况下编写机器语言,答案是——使用十六进制编辑器。
编辑:有时,程序集本身比人们想要的更高级别。MIPS 汇编器以具有内置宏而闻名 - 助记符可以扩展到一个或多个命令,具体取决于操作数和命令行选项的具体情况。Thumb-2 模式下的 ARM 也是如此。这与故意阻碍底层指令集(RISC)有关。
很久以前,当我提出一块带有 CPU 芯片的新电路板时,我必须首先将十六进制值编程到 ROM 芯片中才能开始运行。
每个 CPU 芯片在通电时都有一些约定。通常它从内存中的固定位置加载某些内容,并将其用作加载第一条指令的内存地址,或者将其用作要执行的第一条指令。
回到新的董事会。对 ROM 芯片进行编程后,将芯片插入电路板并通电。弄清楚它是否做对了是一件痛苦的事。也许新硬件正在工作。也许不是。我用示波器观察 CPU 上的数据和地址线,看它是否是可识别的模式。由于处理器在一种情况下是如此简单,这就足够了。
一旦你知道它真的出现了,你就开始使用交叉汇编器(甚至交叉编译器)编写低级代码来运行它。它生成十六进制字节,然后以处理器需要执行的模式将这些字节烧录到另一个 ROM 中。很快你就可以让它工作了。(或者可能不会那么快。)
我只做了两次我记得的。在一种情况下,小板只需要监听来自硬件端口的字节,并通过将其他字节发送到另一个端口来响应它们。这就是与外界的全部联系。(它实际上类似于今天的 Web 服务。字节进来,字节出去。)
这是具有挑战性和令人沮丧的,但非常充实。我很高兴我做到了。我不想再这样做了。