我最近参加了数字逻辑课程并学习了所有关于AND,OR和其他各种逻辑的知识。我们没有涉及的一件事,对于编程来说是完全必要的,是if
语句,这使我对它们如何工作感到好奇。
我最好的猜测是,它只是一个2:1的多路复用器,当你添加更多的else
语句时,它会变成4:1和8:1,但这对于这样一个看起来有点过于复杂简单的概念。
任何人都知道if
声明实际转化为什么?
答案 0 :(得分:1)
您忘记了程序是作为单独的指令执行的,并且(至少在最简单的情况下)指令是按顺序执行的。
因此,对于if (a + 4 > 5)
,指令会将a
加载到寄存器中,另一条指令将添加4
,另一条指令会将总和与5
进行比较。然后一条指令将测试比较中的“条件代码”并执行紧随其后的指令(执行“if
body”)或“跳转”到存储器中的几个(或几十个)指令的位置(跳过“if
身体”。
那里有数字逻辑,但它处于较低的层次,决定如何执行每条指令。
答案 1 :(得分:1)
正确的if
语句转换为比晶体管逻辑更高级别的内容。 if
语句通常实现为条件分支(假设没有优化),要么将程序计数器递增默认值,要么根据条件评估为true还是false(通常为1)将其设置为分支中指定的值或0)。
答案 2 :(得分:1)
自从我参加了一个计算机体系结构课程已经有一段时间了,所以请原谅我,如果我对这个答案有点模糊。
您的计算机执行的所有指令都来自指令存储器,我相信有一个数字代表要执行的指令的地址。
典型指令有多个部分,1个用于命令代码,通常用于最多2个源寄存器,目标寄存器以及其他一些我不需要考虑4年以上的东西。
无论如何,其中一个命令代码通常是一个条件跳转,如果你能理解你的数据路径如何在常规ram中存储/检索值,那么将该逻辑扩展到修改指令就不那么难了根据另一个文字值/寄存器值是否等于0来寻址文字值或存储在特定寄存器中的值
答案 3 :(得分:1)
如果语句和所有其他控制流语句在逻辑级别实现为条件跳转。
使用if语句时,如下所示:
int a = 1, b = 0
if (a > b)
{
...
显然,任何智能编译器都会对此进行优化。如果我们特别指示我们的编译器尽可能笨拙并逐字生成指令,我们将得到类似下面的内容:
my_if_statement:
CMP eax, ebx # intrinsically works by subtracting ebx from eax
# eax and ebx are not changed, but the arithmetic flags are
# if it was greater, jump to greater label
JG my_if_statement_was_true
# if it wasn't greater, we get here
my_if_statement_was_false:
# do something
# we're now done, so jump to the end of the statement
J my_if_statement_end
my_if_statement_was_true:
# do something else
# now we're done with the if statement
my_if_statement_end:
# program continues
这些是汇编指令,每个指令都(大致)直接转换为机器代码操作码。处理器执行一系列额外的操作来支持加载和获取指令的过程,这与此相关。有一个称为程序计数器的特殊寄存器(后面称为PC寄存器),它跟踪处理器将要执行的下一个操作码的位置。
这是该过程的概述。如果你想要更深入的解释,我建议你用if语句编写一个简单的C程序,编译它,反汇编它(使用linux objdump
或等价物),并且可以附加一个调试器并运行它
要显示要在gdb
中执行的下一条指令,请使用display/i $pc
答案 4 :(得分:1)
如果您只关心实现if条件,那么简单,
你可能已经阅读了Morris Mano的数字设计, 有一个简单的电路用于比较两个寄存器,顺便说一下,如果你考虑一下,逻辑很简单。
a>b OR a<b OR a==b all these 3 instructions can be implemented easily
by just comparing the two registers
现在,如果您关注if语句,实际上它是如何在 CPU 中实现的,那么它将经历获取,解码和执行
之后,按照之前的说法比较寄存器。
希望它有所帮助.. :)
答案 5 :(得分:0)
if
是编程语言中的控制流操作,而不是数字逻辑中可表达的概念。如果你的课程涵盖了与jump
之类的汇编指令相关的机器(我不确定我是否已经学到了这一点),那就是if
陈述的内容。
答案 6 :(得分:-1)
正如上述其他人所述,有些逻辑比较器最终会做出这些决定。根据设计需求(功率,面积,摆动,时钟或非时钟等),有大量不同的比较器实现。比较器由许多CMOS NMOS / CMOS门构成。
在维基百科页面上查看比较器,并查看动态锁存比较器。不幸的是,我没有足够的代表发帖。
这是动态锁存比较器的示例。根据实现是高还是低的,系统会在这里为架构计时,以便比较两个值并评估语句。