例如,使用类C语言比较两个整数时,如下所示:
if (3 > 2) {
// do something
}
在内部如何判断3是否大于2(真)?
例如,使用类C语言比较两个整数时,如下所示:
if (3 > 2) {
// do something
}
在内部如何判断3是否大于2(真)?
Answers:
一路下到兔子洞,是吗?好的,我会尝试的。
步骤1.从C到机器语言
C编译器将您的比较转换为以机器语言存储的操作码。机器语言是CPU解释为指令的一系列数字。在这种情况下,将有两个操作码:“减去进位”和“跳进进位”。换句话说,在一条指令中从3中减去2,然后下一条指令检查是否溢出。在这之前,将有两条指令将数字2和3加载到可以比较的位置。
MOV AX, 3 ; Store 3 in register AX
MOV BX, 2 ; Store 2 in register BX
SUB AX, BX ; Subtract BX from AX
JC Label ; If the previous operation overflowed, continue processing at memory location "Label"
以上每个都有二进制表示;例如,用于该代码SUB
是2D
十六进制或00101101
二进制。
步骤2.对ALU的操作码
算术操作码喜欢ADD
,SUB
,MUL
,和DIV
执行使用基本整数运算ALU或算术逻辑单元内置于CPU。数字通过一些操作码存储在寄存器中。其他操作码则指示芯片调用ALU对当时存储在寄存器中的内容进行数学运算。
注意:在这一点上,如果使用C之类的3GL,我们已经超出了任何软件工程师可以担心的范围。
步骤3. ALU,半加法器和全加器
您知道吗,您知道的所有数学运算都可以简化为一系列NOR运算?这就是ALU的工作原理。
ALU只知道如何使用二进制数,并且只能执行逻辑运算,例如OR,NOT,AND和XOR。二进制加法和减法的实现是通过在称为加法器的子系统中以一定方式排列的一系列逻辑运算来完成的。这些子系统由“半加法器”网络组成,该网络对两位进行操作并确定其一位和和一位进位标志。通过将它们链接在一起,ALU可以对具有8、16、32等位的数字执行运算。
减法呢?减法只是加法的另一种形式:
A - B = A + (-B)
ALU -B
通过采用的二进制补码进行计算B
。一旦将其转换为负值,将值提交给加法器将导致减法运算。
步骤4:最后一步:片上晶体管
加法器的操作是通过电子元件的组合来实现的,这些电子元件相互作用以创建“逻辑门”,例如在晶体管,晶体管或TTL或CMOS中发现的那些逻辑门。单击此处查看一些示例,以了解如何进行连接。
当然,在芯片上,这些“电路”以数百万个导电和非导电材料的细小片段实现,但原理与它们是面包板上的全尺寸组件一样。 观看此视频,该视频通过电子显微镜的镜头向您展示微芯片上的所有晶体管。
一些附加说明:
您编写的代码实际上将由编译器预先计算,而不在运行时执行,因为它仅由常量组成。
一些编译器不编译为机器代码,而是引入了另一层,例如Java字节码或.NET中间语言。但是最后,所有这些都通过机器语言执行。
某些数学运算实际上并未计算出来;在算术协处理单元上的大量表中查找它们,或者包含查找和计算或插值的组合。一个例子是计算平方根的函数。每个现代PC CPU都在每个CPU内核中内置了一个浮点协处理单元。
CMP
是不会用,SUB
但那还是或多或少的是“ SUB
当结果被忽略并且只设置标志时”
if
共,直接进行编码do something
。