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