汇编语言如何运作?

时间:2011-06-24 05:50:09

标签: assembly hardware grammar

我很好奇汇编语言是如何工作的 - 我仍然很普遍,因为我不是只谈论intel x86汇编(尽管它是我唯一熟悉的汇编语言)。为了更清楚......

mov %eax,%ebx

计算机如何知道“mov”之类的指令是什么?怎么知道eax和ebx是寄存器?人们会为汇编语言编写语法吗?他们怎么写这个?我想没有什么可以阻止某人编写汇编语言,用movdog等替代horse指令(显然这根本不是语义)

对不起,如果这不是太清楚,但这是我觉得有点令人费解的事情 - 我知道这不是魔术,但我看不出它是如何工作的。我在维基百科上查了一些东西,但似乎只是将它翻译成机器代码,好吧,我想问的是我认为翻译是怎么发生的。

思想?

编辑:我意识到这些东西是在参考手册和事物中定义的,我想我想知道的是你如何告诉处理器“好的,当你看到mov你将会这样做时”。我也知道它可能是一大堆逻辑门。但是处理器必须有一些方法来识别mov是意味着“使用这些逻辑门”的符号

5 个答案:

答案 0 :(得分:20)

计算机基本上是由logic gates构建的。虽然这是真实物理机械的抽象理想化,但它足够接近我们现在可以相信的事实。在非常基础的层面上,这些东西就像真/假谓词一样。或者,如果你曾经玩过我的世界,它的工作方式很像红石。研究如何将逻辑门组合在一起以制作有趣的复杂电路(如计算机)的领域称为computer architecture。它传统上被视为计算机科学和电气工程的混合体。

最基本的逻辑门是AND和OR之类的东西,它们只是将位拼凑在一起并粉碎它们之间的一些布尔运算。通过在逻辑门中创建反馈回路,您可以存储内存。一种类型的标准存储器电路称为flip-flop,它基本上是一个小线圈,连同一些AND门和电源以保持稳定。将多个锁存器放在一起可以创建位向量,这些东西称为registers(eax和ebx之类的东西代表)。还有许多其他类型的部件,如加法器,多路复用器等,它们实现了各种布尔逻辑。这是一些电路的目录:

http://www.labri.fr/perso/strandh/Teaching/AMP/Common/Strandh-Tutorial/Dir.html

你的CPU基本上是把这些东西粘在一起,都是用同样的基本逻辑门构建的。计算机知道如何继续执行指令的方式是,有一种称为时钟的特殊机器,可以定期发出脉冲。当CPU的时钟发出脉冲时,它会在这些逻辑门中引发一系列反应,导致CPU执行指令。例如,当它读取一条说“mov eax,ebx”的指令时,最终发生的是其中一个寄存器(ebx)的状态在下一个寄存器之前及时被复制到另一个寄存器(eax)的状态。脉冲不受时间限制。

当然这是一个粗略的过度简化,但作为一个高级别的图片,它基本上是正确的。剩下的细节需要一段时间才能解释,而且由于不必要的细微之处,我忽略了一些事情(例如,在真正的CPU中,有时多个指令在单个时钟中执行;并且由于寄存器分页有时eax不是总是一样的东西;有时由于偶尔重新排序,指令执行的方式会被移动,等等。然而,它绝对值得学习整个故事,因为它实际上是非常惊人的(或者至少我喜欢这么认为!)你会很乐意出去阅读这些东西,也许试着建立一个您自己的几个电路(使用真实硬件,模拟器,甚至是我的世界!)

无论如何,希望能回答一些关于mov eax,ebx的问题。

答案 1 :(得分:8)

你看到的是助记符,它使编程人员可以轻松编写汇编程序,但它不能以助记符形式执行。 当您通过汇编程序传递这些汇编指令时,它们将被转换为它们所代表的机器代码,这是CPU及其各种协处理器解释和执行的内容(它通常被CPU分成较小的单元,称为微操作)

如果你对它究竟是如何做到这一点充满好奇,那就是一个漫长的过程,但this拥有所有这些信息。

所有语义等都由汇编程序处理,汇编程序会尽可能检查有效性和完整性(但仍可以汇编无效代码!)。这基本上使得汇编成为一种低级语言,即使它与输出的机器代码具有1比1的相关性(除非使用基于宏的汇编程序,但随后宏仍然扩展为1比1)。

答案 2 :(得分:7)

您的CPU不执行程序集。汇编程序将其转换为机器代码。此过程取决于特定的汇编语言和目标计算机体系结构。通常这些是齐头并进的,但你可能会发现不同的汇编语言(例如,nasm与AT& T),它们都转化为类似的机器代码。

典型的(MIPS)汇编指令,例如“And immediate”

andi $t, $s, imm

将成为32位机器代码字

0011 00ss ssst tttt iiii iiii iiii iiii

其中st是0-31中的数字,它们是名称寄存器,i是16位值。这是CPU实际执行的这种位模式。开头的001100是与andi指令对应的操作码,后面的位模式--5位源寄存器,5位目标寄存器,16位字面值 - 取决于指令。当该指令放入CPU时,它通过解码操作码,选择要读取和写入的寄存器以及配置ALU以执行必要的算术来适当地响应。

答案 3 :(得分:3)

汇编代码中的指令映射到您要定位的CPU架构的实际指令集和寄存器名称。 mov是一条X86指令,eax和其他是(在这种情况下是通用的)寄存器的名称,它定义为Intel x86参考手册。

其他架构也是如此 - 汇编代码直接映射到芯片规格/文档中定义的操作的实际名称。

该映射比编译C代码更简单。

答案 4 :(得分:2)

第一件事,像mov,add等每个指令都有二进制形式的含义,如10101010,00110000,10100其中一些也是,它总是理解cpu。

但人类无法记住所有这些。所以...用于英语语言的编程目的。最终会到达自己的位置(二进制)。

在汇编或编译代码时,从英语(mov,add等)转换为二进制的第二件事发生在。        之后 - 二进制指令(指令集)存储在ram中并准备执行。

但是我知道这可能不是你的答案。

如果你想知道并想象完美 - 如何cpu执行指令并处理它们。你可以在这里学习图形。 在youtube上观看此视频:(此处提供链接)

https://m.youtube.com/watch?v=cNN_tTXABUA&itct=CCUQpDAYAyITCOHa_9e_q80CFZ1Vvgodek8KmzILYzQtb3ZlcnZpZXdaGFVDNmVhVm43MzQ5TFJoNXl6cFhqZXU4QQ%3D%3D&client=mv-google&gl=IN&hl=en-GB

https://m.youtube.com/watch?v=NKYgZH7SBjk&itct=CBoQpDAYAiITCOHa_9e_q80CFZ1Vvgodek8KmzILYzQtb3ZlcnZpZXdaGFVDNmVhVm43MzQ5TFJoNXl6cFhqZXU4QQ%3D%3D&client=mv-google&gl=IN&hl=en-GB

看一次,我向你保证。你会更清楚它。看看是对的。