diff --git a/ch3-asm/ch3-02-arch.md b/ch3-asm/ch3-02-arch.md index 803238f..19efecc 100644 --- a/ch3-asm/ch3-02-arch.md +++ b/ch3-asm/ch3-02-arch.md @@ -2,12 +2,12 @@ 汇编语言是直面计算机的编程语言,因此理解计算机结构是掌握汇编语言的前提。当前流行的计算机基本采用的是冯·诺伊曼计算机体系结构(在某些特殊领域还有哈佛体系架构)。冯·诺依曼结构也称为普林斯顿结构,采用的是一种将程序指令和数据存储在一起的存储结构。冯·诺伊曼计算机中的指令和数据存储器其实指的是计算机中的内存,然后在配合CPU处理器就组成了一个最简单的计算机了。 -汇编语言其实是一种非常简单的编程语言,因为它面向的计算机模型就是非常简单的。让人觉得汇编语言难学主要有几个原因:不同类型的CPU都有自己的一套指令;即是是相同的CPU,32位和64位的运行模式依然会有差异;不同的汇编工具同样有自己特有的汇编指令;不同的操作系统和高级编程语言和底层汇编的调用规范并不相同。本节将描述几个有趣的汇编语言模型,最后精简出一个适用于AMD64架构的精简指令集,以便于Go汇编语言的学习。 +汇编语言其实是一种非常简单的编程语言,因为它面向的计算机模型就是非常简单的。让人觉得汇编语言难学主要有几个原因:不同类型的CPU都有自己的一套指令;即使是相同的CPU,32位和64位的运行模式依然会有差异;不同的汇编工具同样有自己特有的汇编指令;不同的操作系统和高级编程语言和底层汇编的调用规范并不相同。本节将描述几个有趣的汇编语言模型,最后精简出一个适用于AMD64架构的精简指令集,以便于Go汇编语言的学习。 ## 图灵机和BF语言 -图灵机是由图灵提出的一种抽象计算模型。机器有一条无限长的纸带,纸带分成了一个一个的小方格,每个方格有不同的颜色,这类似于计算机中的内存。同时机器有一个探头头在纸带上移来移去,类似于通过内存地址来读写内存上的数据。机器头有一组内部计算状态,还有一些固定的程序(更像一个哈佛结构)。在每个时刻,机器头都要从当前纸带上读入一个方格信息,然后根据自己的内部状态和当前要执行的程序指令将信息输出到纸带方格上,同时更新自己的内部状态并进行移动。 +图灵机是由图灵提出的一种抽象计算模型。机器有一条无限长的纸带,纸带分成了一个一个的小方格,每个方格有不同的颜色,这类似于计算机中的内存。同时机器有一个探头在纸带上移来移去,类似于通过内存地址来读写内存上的数据。机器头有一组内部计算状态,还有一些固定的程序(更像一个哈佛结构)。在每个时刻,机器头都要从当前纸带上读入一个方格信息,然后根据自己的内部状态和当前要执行的程序指令将信息输出到纸带方格上,同时更新自己的内部状态并进行移动。 图灵机虽然不容易编程,但是非常容易理解。有一种极小化的BrainFuck计算机语言,它的工作模式和图灵机非常相似。BrainFuck由Urban Müller在1993年创建的,简称为BF语言。Müller最初的设计目标是建立一种简单的、可以用最小的编译器来实现的、符合图灵完全思想的编程语言。这种语言由八种状态构成,早期为Amiga机器编写的编译器(第二版)只有240个字节大小! @@ -38,7 +38,7 @@ 《人力资源机器》(Hunman Resource Machine)是一款设计精良汇编语言编程游戏。在游戏中,玩家扮演一个职员角色,来模拟人力资源机器的运行。通过完成上司给的每一份任务来实现晋升的目标,完成任务的途径就是用游戏提供的11个机器指令编写正确的汇编程序,最终得到正确的输出结果。人力资源机器的汇编语言可以认为是跨平台、跨操作系统的通用的汇编语言,因为在macOS、Windows、Linux和iOS上该游戏的玩法都是完全一致的。 -人力资源机器的机器模型非常简单:INBOX命令对应输入设备,OUTBOX对应输出设备,玩家小人对应一个寄存器,临时存放数据的地板对应内存,然后是数据传输、加减、跳转等几本的指令。总共有11个机器指令: +人力资源机器的机器模型非常简单:INBOX命令对应输入设备,OUTBOX对应输出设备,玩家小人对应一个寄存器,临时存放数据的地板对应内存,然后是数据传输、加减、跳转等基本的指令。总共有11个机器指令: | 名称 | 解释 | | -------- | --- @@ -54,14 +54,14 @@ | JUMP =0 | 为零条件跳转 | JUMP <0 | 为负条件跳转 -除了机器指令外,游戏中有些环节还提供类似寄存器的场所,用于存放临时的数据。人力资源机器游戏的机器指令主要分有以下几类: +除了机器指令外,游戏中有些环节还提供类似寄存器的场所,用于存放临时的数据。人力资源机器游戏的机器指令主要分为以下几类: - 输入/输出(INBOX, OUTBOX): 输入后手中将只有1份新拿到的数据, 输出后手中将没有数据。 - 数据传输指令(COPYFROM/COPYTO): 主要用于仅有的1个寄存器(手中)和内存之间的数据传输,传输时要确保源数据是有效的 - 算术相关(ADD/SUB/BUMP+/BUMP-) - 跳转指令: 如果是条件跳转,寄存器中必须要有数据 -主流的处理器也有类似的指令。除了基本的算术和逻辑预算指令外,在配合有条件跳转指令就可以实现分支、循环等常见控制流结构了。 +主流的处理器也有类似的指令。除了基本的算术和逻辑预算指令外,再配合有条件跳转指令就可以实现分支、循环等常见控制流结构了。 下图是某一层的任务:将输入数据的0剔除,非0的数据依次输出,右边部分是解决方案。