What & How & Why

差别

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

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
cs:comp_n_arch:courses:fnti_i:week_4 [2025/05/08 09:20] – [Symbols] codingharecs:comp_n_arch:courses:fnti_i:week_4 [2025/05/08 14:13] (当前版本) – [Flow Control] codinghare
行 21: 行 21:
 ==Symbols== ==Symbols==
 Symbols 主要应用于简化内存寻址的过程。比如维护一个 ''index'',将指定的内存区域分为不同的片区,当需要对指定区域进行操作时,我们可以通过对应的 ''index'' 对其进行快速访问。这种将 symbol 与实际内存地址建立映射关系的方式,会大大增强程序的易读性和可维护性。该映射关系也是由 assmbler 来翻译的。 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====