本 Wiki 开启了 HTTPS。但由于同 IP 的 Blog 也开启了 HTTPS,因此本站必须要支持 SNI 的浏览器才能浏览。为了兼容一部分浏览器,本站保留了 HTTP 作为兼容。如果您的浏览器支持 SNI,请尽量通过 HTTPS 访问本站,谢谢!
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录前一修订版后一修订版 | 前一修订版 | ||
cs:comp_n_arch:courses:fnti_i:week_4 [2025/05/08 09:19] – [Symbols] codinghare | cs:comp_n_arch:courses:fnti_i:week_4 [2025/05/08 14:13] (当前版本) – [Flow Control] codinghare | ||
---|---|---|---|
行 20: | 行 20: | ||
* 人类通过汇编语言(// | * 人类通过汇编语言(// | ||
==Symbols== | ==Symbols== | ||
- | Symbols 主要应用于简化内存寻址的过程。比如维护一个 '' | + | Symbols 主要应用于简化内存寻址的过程。比如维护一个 '' |
- | 该映射关系也是由 assmbler 来翻译的。 | + | ====Machine Languages: Elements==== |
+ | * 机器语言是硬件与软件的 Interface,其决定了硬件可以进行什么样的操作 | ||
+ | * 硬件与软件层面的操作通常接近,但不一定一一对应 | ||
+ | * 机器语言的复杂程度取决于设计。通常,设计的操作越复杂,硬件层面的实现花费就越高。 | ||
+ | ===Machine operations=== | ||
+ | * 算术运算:add / sub | ||
+ | * 逻辑运算:and / or | ||
+ | * 流程控制(flow control) | ||
+ | 不同的机器语言之间的实现可能并不相同,取决于其复杂度。 | ||
+ | ===Addressing=== | ||
+ | 内存寻址是一项非常昂贵的操作。通常来说,有两个问题: | ||
+ | * 内存越大,需要提供的地址就越长 | ||
+ | * 内存越大,访问指定内存的时间就越长 | ||
+ | ==Memory Hierarchy== | ||
+ | 解决方案是提供内存的级联:将内存按速度进行划分,不同速度的内存区域对应不同的任务。需要注意的是,速度越快,对应的内存就越小。 | ||
+ | ==Registers== | ||
+ | 寄存器是访问速度最快的内存,通常由 CPU 内置。寄存器分为几个类型: | ||
+ | * Data Registers:比如 '' | ||
+ | * 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 | ||
+ | </ | ||
+ | ==Input / Output== | ||
+ | 外设(键盘鼠标)通常通过寄存器链接,并通过一定的协议(驱动)来使其工作。 | ||
+ | ===Flow Control=== | ||
+ | * 通常按顺序执行 | ||
+ | * 某些情况需要进行无条件跳转(unconditional jump),比如 loop | ||
+ | * 通常使用寄存器来存储每次迭代的结果 | ||
+ | * loop 的起始点通常会使用一个名字与其地址相关联,方便跳转(比如 loop 关联到 102,则使用 Jump loop 等同于 jump 102) | ||
+ | * 某些情况下需要进行带条件跳转 (condtional jump) | ||
+ | |||
+ | ====The HACK Computer==== |