通过机器码程序理解冯诺依曼体系
#right-panel .cover-top { background: linear-gradient(to bottom, #fff 50%, transparent) }
#cover-bottom #cover-bottom-background-right { background: #fff }
#container { color: #373737; font-family: “Roboto”, “Noto Sans”, “Ubuntu”, “Helvetica Neue”, Helvetica, “Segoe UI”, Arial, sans-serif, “Noto Sans CJK SC”, “Source Han Sans SC”, “Microsoft Yahei”; font-size: 14px; line-height: 2; background-color: #fff }
#container a { background-color: transparent }
#container a:active,#container a:hover { outline-width: 0 }
#container strong { font-weight: inherit }
#container strong { font-weight: bolder }
#container h1 { font-size: 2em; margin: 0.67em 0 }
#container img { border-style: none }
#container svg:not(:root) { overflow: hidden }
#container code,#container kbd,#container pre { font-family: “Roboto Mono”, “Ubuntu Mono”, “Menlo”, “Consolas”, monospace; font-size: 1em }
#container hr { height: 0; overflow: visible }
#container input { font: inherit; margin: 0 }
#container input { overflow: visible }
#container button:-moz-focusring,#container [type=”button”]:-moz-focusring,#container [type=”reset”]:-moz-focusring,#container [type=”submit”]:-moz-focusring { outline: 1px dotted ButtonText }
#container [type=”checkbox”] { padding: 0 }
#container table { border-spacing: 0; border-collapse: collapse }
#container td,#container th { padding: 0 }
#container * { }
#container input { font: 13px/1.4 Helvetica, arial, nimbussansl, liberationsans, freesans, clean, sans-serif, “Apple Color Emoji”, “Segoe UI Emoji”, “Segoe UI Symbol” }
#container a { color: #4078c0; text-decoration: none }
#container a:hover,#container a:active { text-decoration: underline }
#container hr { height: 0; margin: 15px 0; overflow: hidden; background: transparent; border: 0; border-bottom: 1px solid #ddd }
#container hr::before { display: table; content: “” }
#container hr::after { display: table; clear: both; content: “” }
#container h1,#container h2,#container h3,#container h4,#container h5,#container h6 { margin-top: 0; margin-bottom: 0; line-height: 1.5 }
#container h1 { font-size: 30px }
#container h2 { font-size: 21px }
#container h3 { font-size: 16px }
#container h4 { font-size: 14px }
#container h5 { font-size: 12px }
#container h6 { font-size: 11px }
#container p { margin-top: 0; margin-bottom: 10px }
#container blockquote { margin: 0 }
#container ul,#container ol { padding-left: 0; margin-top: 0; margin-bottom: 0 }
#container ol ol,#container ul ol { list-style-type: lower-roman }
#container ul ul ol,#container ul ol ol,#container ol ul ol,#container ol ol ol { list-style-type: lower-alpha }
#container dd { margin-left: 0 }
#container code { font-family: “Roboto Mono”, “Ubuntu Mono”, “Menlo”, “Consolas”, monospace; font-size: 12px }
#container pre { margin-top: 0; margin-bottom: 0; font: 12px “Roboto Mono”, “Ubuntu Mono”, “Menlo”, “Consolas”, monospace }
#container .pl-0 { padding-left: 0 !important }
#container .pl-1 { padding-left: 3px !important }
#container .pl-2 { padding-left: 6px !important }
#container .pl-3 { padding-left: 12px !important }
#container .pl-4 { padding-left: 24px !important }
#container .pl-5 { padding-left: 36px !important }
#container .pl-6 { padding-left: 48px !important }
#container .form-select::-ms-expand { opacity: 0 }
#container::before { display: table; content: “” }
#container::after { display: table; clear: both; content: “” }
#container>*:first-child { margin-top: 0 !important }
#container>*:last-child { margin-bottom: 0 !important }
#container a:not([href]) { color: inherit; text-decoration: none }
#container .anchor { display: inline-block; padding-right: 2px; margin-left: -18px }
#container .anchor:focus { outline: none }
#container h1,#container h2,#container h3,#container h4,#container h5,#container h6 { margin-top: 1em; margin-bottom: 16px; font-weight: bold; line-height: 1.4 }
#container h1 .octicon-link,#container h2 .octicon-link,#container h3 .octicon-link,#container h4 .octicon-link,#container h5 .octicon-link,#container h6 .octicon-link { color: #000; vertical-align: middle; visibility: hidden }
#container h1:hover .anchor,#container h2:hover .anchor,#container h3:hover .anchor,#container h4:hover .anchor,#container h5:hover .anchor,#container h6:hover .anchor { text-decoration: none }
#container h1:hover .anchor .octicon-link,#container h2:hover .anchor .octicon-link,#container h3:hover .anchor .octicon-link,#container h4:hover .anchor .octicon-link,#container h5:hover .anchor .octicon-link,#container h6:hover .anchor .octicon-link { visibility: visible }
#container h1 { padding-bottom: 0.3em; font-size: 2.25em; line-height: 1.2; border-bottom: 1px solid #eee }
#container h1 .anchor { line-height: 1 }
#container h2 { padding-bottom: 0.3em; font-size: 1.75em; line-height: 1.225; border-bottom: 1px solid #eee }
#container h2 .anchor { line-height: 1 }
#container h3 { font-size: 1.5em; line-height: 1.43 }
#container h3 .anchor { line-height: 1.2 }
#container h4 { font-size: 1.25em }
#container h4 .anchor { line-height: 1.2 }
#container h5 { font-size: 1em }
#container h5 .anchor { line-height: 1.1 }
#container h6 { font-size: 1em; color: #777 }
#container h6 .anchor { line-height: 1.1 }
#container p,#container blockquote,#container ul,#container ol,#container dl,#container table,#container pre { margin-top: 0; margin-bottom: 16px }
#container hr { height: 4px; padding: 0; margin: 16px 0; background-color: #e7e7e7; border: 0 none }
#container ul,#container ol { padding-left: 2em }
#container ul ul,#container ul ol,#container ol ol,#container ol ul { margin-top: 0; margin-bottom: 0 }
#container li>p { margin-top: 16px }
#container dl { padding: 0 }
#container dl dt { padding: 0; margin-top: 16px; font-size: 1em; font-style: italic; font-weight: bold }
#container dl dd { padding: 0 16px; margin-bottom: 16px }
#container blockquote { padding: 0 15px; color: #777; border-left: 4px solid #ddd }
#container blockquote>:first-child { margin-top: 0 }
#container blockquote>:last-child { margin-bottom: 0 }
#container table { display: block; width: 100%; overflow: auto }
#container table th { font-weight: bold }
#container table th,#container table td { padding: 6px 13px; border: 1px solid #ddd }
#container table tr { background-color: #fff; border-top: 1px solid #ccc }
#container table tr:nth-child(2n) { background-color: #f8f8f8 }
#container img { max-width: 100%; background-color: #fff }
#container code { padding: 0; padding-top: 0.2em; padding-bottom: 0.2em; margin: 0; font-size: 85%; background-color: rgba(0,0,0,0.04) }
#container code::before,#container code::after { letter-spacing: -0.2em; content: ” ” }
#container pre>code { padding: 0; margin: 0; font-size: 100%; white-space: pre; background: transparent; border: 0 }
#container .highlight { margin-bottom: 16px }
#container .highlight pre,#container pre { padding: 16px; overflow: auto; font-size: 85%; line-height: 1.45; background-color: #f7f7f7 }
#container .highlight pre { margin-bottom: 0 }
#container pre { }
#container pre code { display: inline; max-width: initial; padding: 0; margin: 0; overflow: initial; line-height: inherit; background-color: transparent; border: 0 }
#container pre code::before,#container pre code::after { content: normal }
#container kbd { display: inline-block; padding: 3px 5px; font-size: 11px; line-height: 10px; color: #555; vertical-align: middle; background-color: #fcfcfc; border: solid 1px #ccc; border-bottom-color: #bbb }
#container .pl-c { color: #969896 }
#container .pl-c1,#container .pl-s .pl-v { color: #0086b3 }
#container .pl-e,#container .pl-en { color: #795da3 }
#container .pl-s .pl-s1,#container .pl-smi { color: #333 }
#container .pl-ent { color: #63a35c }
#container .pl-k { color: #a71d5d }
#container .pl-pds,#container .pl-s,#container .pl-s .pl-pse .pl-s1,#container .pl-sr,#container .pl-sr .pl-cce,#container .pl-sr .pl-sra,#container .pl-sr .pl-sre { color: #183691 }
#container .pl-v { color: #ed6a43 }
#container .pl-id { color: #b52a1d }
#container .pl-ii { background-color: #b52a1d; color: #f8f8f8 }
#container .pl-sr .pl-cce { color: #63a35c; font-weight: bold }
#container .pl-ml { color: #693a17 }
#container .pl-mh,#container .pl-mh .pl-en,#container .pl-ms { color: #1d3e81; font-weight: bold }
#container .pl-mq { color: #008080 }
#container .pl-mi { color: #333; font-style: italic }
#container .pl-mb { color: #333; font-weight: bold }
#container .pl-md { background-color: #ffecec; color: #bd2c00 }
#container .pl-mi1 { background-color: #eaffea; color: #55a532 }
#container .pl-mdr { color: #795da3; font-weight: bold }
#container .pl-mo { color: #1d3e81 }
#container kbd { display: inline-block; padding: 3px 5px; font: 11px “Roboto Mono”, “Ubuntu Mono”, “Menlo”, “Consolas”, monospace; line-height: 10px; color: #555; vertical-align: middle; background-color: #fcfcfc; border: solid 1px #ccc; border-bottom-color: #bbb }
#container .full-commit .btn-outline:not(:disabled):hover { color: #4078c0; border: 1px solid #4078c0 }
#container :checked+.radio-label { position: relative; z-index: 1; border-color: #4078c0 }
#container .octicon { display: inline-block; vertical-align: text-top }
#container .task-list-item { list-style-type: none }
#container .task-list-item+.task-list-item { margin-top: 3px }
#container .task-list-item input { margin: 0 0.2em 0.25em -1.6em; vertical-align: middle }
#container hr { border-bottom-color: #eee }
.hljs { display: block; padding: 0.5em; color: #333; background: #f8f8f8 }
.hljs-comment,.hljs-quote { color: #998; font-style: italic }
.hljs-keyword,.hljs-selector-tag,.hljs-subst { color: #333; font-weight: bold }
.hljs-number,.hljs-literal,.hljs-variable,.hljs-template-variable,.hljs-tag .hljs-attr { color: #008080 }
.hljs-string,.hljs-doctag { color: #d14 }
.hljs-title,.hljs-section,.hljs-selector-id { color: #900; font-weight: bold }
.hljs-subst { font-weight: normal }
.hljs-type,.hljs-class .hljs-title { color: #458; font-weight: bold }
.hljs-tag,.hljs-name,.hljs-attribute { color: #000080; font-weight: normal }
.hljs-regexp,.hljs-link { color: #009926 }
.hljs-symbol,.hljs-bullet { color: #990073 }
.hljs-built_in,.hljs-builtin-name { color: #0086b3 }
.hljs-meta { color: #999; font-weight: bold }
.hljs-deletion { background: #fdd }
.hljs-addition { background: #dfd }
.hljs-emphasis { font-style: italic }
.hljs-strong { font-weight: bold }
冯诺依曼体系结构
简介
现今所有的商用计算机都是基于冯诺依曼体系的计算机。
冯·诺依曼体系结构冯·诺依曼理论的要点是:计算机的数制采用二进制;计算机应该按照程序顺序执行。存储程序原理,把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式储存,二者地位是相等的。
通过机器码程序理解 冯诺依曼 计算机
下面将通过基于Pep8虚拟计算机运行的机器码程序理解冯诺依曼计算机。(Pep8是用于教学的开源小型计算机,可以执行机器码和汇编程序 下载链接 http://computersystemsbook.com/5th-edition/pep9/ )
首先介绍 冯诺依曼周期
一个冯诺依曼周期包含 5 个操作:
- 取指
- 译码
- 增加PC(程序计数器)
- 执行指令
-
重复
如图:加载机器语言到内存
初始化寄存器(PC,SP,IR等)
do {
取下一条指令
解码 指令指示符
递增PC
执行取出的指令
} while(没有执行停止指令)
指令和寄存器
每种计算机都有自己的指令集,固化在cpu中。Pep8有39条指令,这些指令分为两类,由一个字节(8位二进制)组成的 指令指示符,或者由一个 指令指示符 和一个由一个字(两个字节)组成的 操作数指示符 组成。
Pep8中包含不限于PC(程序指令计数器),SP(栈指针计数器),IR(24位指令寄存器(3字节))等寄存器。
将要用到的指令:
0000 0000 停止执行
0100 1aaa 字符输入
0101 0aaa 字符输出
注(aaa表示一个字段,a可为0或1,表示寻址方式)
一个字符输出程序
地址 机器语言(bin)
---- -------
0000 0101 0001 0000 0000 0000 0111
0003 0101 0001 0000 0000 0000 1000
0006 0000 0000
0007 0100 1000
0008 0110 1001
地址 机器语言(hex)
---- --------
0000 510007
0003 510008
0006 00
0007 48
0008 69
输出
----
Hi
这两段代码是等价的,只不过是前者更利于计算机识别和读取,后者利于人类,但是计算机最终是要保存二进制的序列,而非其他任何形式的结果。(注:地址为了便于表示使用四位十六进制数表示)
分析程序
首先将上面代码输入Pep8虚拟机后,首先要做的是,装载。即将每条指令(每行右侧序列)装载到左侧序列标识的地址。如果装载的指令是一元指令即 指令指示符 ,那么他占据一个内存单元即一个字节。如果指令是一个二元指令也即 操作数指示符 那么他占据三个内存单元,所以第一条指令被装载到 0000、0001、 0002 所标识的内存。
当所有的指令装载完成后,也就意味着一个程序在内存中,并处于可执行状态。注意一点,这个程序的指令在内存中是逐条紧邻的。
执行程序
根据 冯诺依曼周期,程序是顺序执行的,所以初始化程序指令计数器PC,
PC: 0000
CPU根据PC的值作为内存地址索引,找到该内存并将该内存的值(二进制序列)复制,通过总线传输到CPU的指令寄存器IR中,
IR:Mem[PC] // 类比 数组索引值 a[i];
此时CPU解释IR中的指令,指令:0101 0001 0000 0000 0000 0111
我们来解释一下这个指令,首先这是一个二元指令,所以前一个字节是指令指示符,后两个字节是操作数指示符。第一个字节 0101 0001 (原指令模式 0101 0aaa)代表以直接寻址的方式输出字符,后两个字节指示要输出的字符的地址,可以看出,这块地址就是之前我们装载程序时 0007 这块内存,而内存中的值正是 ‘H’ 的ASCII码值 48 。到此我们可以看出,其实 程序 和 程序的数据 对于计算机来说没有区别,都是保存在内存中的二进制数,计算机只单纯的将他们作为二进制数处理,而是作为 指令 被解释还是作为 数据 被解释是需要我们来定义。
接下来继续程序的执行,当获取到 操作数指示符 标识内存中的值后,将这个值发送到输出设备,此时由输出设备负责将该二进制数解释为字符。
下一步,根据取出指令的长度进行PC的自增。重复上述过程,直到
PC:0006
索引值为指令
0000 0000 ;结束指令
程序结束。