What & How & Why

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

后一修订版
前一修订版
cs:comp_n_arch:courses:fnti_i:week_4 [2025/05/08 02:09] – 创建 codingharecs:comp_n_arch:courses:fnti_i:week_4 [2025/05/08 14:13] (当前版本) – [Flow Control] codinghare
行 2: 行 2:
 //Week 4 notes// //Week 4 notes//
 ---- ----
 +====Overview====
 +  * //Univeraslity//: 相同的**硬件**运行不同的**软件** //Turing// + //von Neumann//
 +  * 计算机通过机器语言(二进制指令)来实现软件层面上的不同功能
 +  * 机器语言提供的的三个信息:
 +    * Operations:指令需要计算机做什么
 +    * Counter:指令以及下一步指令是什么
 +    * Addressing:指令需要操作哪些硬件
 +===Compilcation===
 +  * 计算机只能识别机器语言
 +  * 人类需要通过编译器将人类友好的语言转化为机器语言
 +==Mnemonics==
 +为了更方便的讨论机器语言,人们通常将指定的代码段与相应的含义(//Mnemonic Form//)对应起来。下面的例子中,''ADD'' 就是 ''0100010'' 对应的 //Mnemonic Form//。可以观察到的是,这种替代不仅可以代表 operation,也可以代表地址。
 +\\ \\ 
 +{{ :cs:comp_n_arch:courses:fnti_i:mnemonics.svg?300 |}}
 +需要注意的是:
 +  * 类似 ''ADD'' 这样的形式不是真正存在的
 +  * 人类通过汇编语言(//assembly language//)来讲上述形式转化为机器语言
 +==Symbols==
 +Symbols 主要应用于简化内存寻址的过程。比如维护一个 ''index'',将指定的内存区域分为不同的片区,当需要对指定区域进行操作时,我们可以通过对应的 ''index'' 对其进行快速访问。这种将 symbol 与实际内存地址建立映射关系的方式,会大大增强程序的易读性和可维护性。该映射关系也是由 assmbler 来翻译的。
 +====Machine Languages: Elements====
 +  * 机器语言是硬件与软件的 Interface,其决定了硬件可以进行什么样的操作
 +  * 硬件与软件层面的操作通常接近,但不一定一一对应
 +  * 机器语言的复杂程度取决于设计。通常,设计的操作越复杂,硬件层面的实现花费就越高。
 +===Machine operations===
 +  * 算术运算:add / sub
 +  * 逻辑运算:and / or
 +  * 流程控制(flow control)
 +不同的机器语言之间的实现可能并不相同,取决于其复杂度。
 +===Addressing===
 +内存寻址是一项非常昂贵的操作。通常来说,有两个问题:
 +  * 内存越大,需要提供的地址就越长
 +  * 内存越大,访问指定内存的时间就越长
 +==Memory Hierarchy==
 +解决方案是提供内存的级联:将内存按速度进行划分,不同速度的内存区域对应不同的任务。需要注意的是,速度越快,对应的内存就越小。
 +==Registers==
 +寄存器是访问速度最快的内存,通常由 CPU 内置。寄存器分为几个类型:
 +  * Data Registers:比如 ''add r1 r2'',''r1'' 和 ''r2'' 就是该加法操作中,对应数据所在的寄存器名称。
 +  * Address Registers:类似于指针,作为某一片我们需要使用的内存区域的入口
 +==Addressing Modes==
 +<code py>
 +# Register mode R2 <- R2 + R1
 +Add R1, R2
 +# Direct mode Mem[200] <- Mem[200] + R1
 +Add R1, M[200]
 +# Indirect Mem[A] <- Mem[A] + R1
 +Add R1, @A
 +# Immediate R1 <- R1 + 73
 +Add 73, R1
 +</code>
 +==Input / Output==
 +外设(键盘鼠标)通常通过寄存器链接,并通过一定的协议(驱动)来使其工作。
 +===Flow Control===
 +  * 通常按顺序执行
 +  * 某些情况需要进行无条件跳转(unconditional jump),比如 loop
 +    * 通常使用寄存器来存储每次迭代的结果
 +    * loop 的起始点通常会使用一个名字与其地址相关联,方便跳转(比如 loop 关联到 102,则使用 Jump loop 等同于 jump 102)
 +  * 某些情况下需要进行带条件跳转 (condtional jump)
 +
 +====The HACK Computer====