今日(きょう)(さわ)がしく(たわむ)れ生きる人々の漫画映画(まんがえいが)

高中衔接-汇编入门(待续)

很多人都在高中里学过了程序框图,但是到大学里学程序语言时仿佛又要重新学起。其实汇编语言和程序框图非常相似,经过一定的删减,汇编语言甚至可以与程序框图一一对应。本文尝试对这样的精简汇编语言做一个教程,希望能够作为 C 语言快速入门的一个衔接。

注意:只看本文的话,大概率是写不出像样的汇编程序的,因为本文不会讲述汇编语言的语法,甚至会避免一些随意的关键字的使用。本文的目的只是为 C 语言快速入门提供一个起点而已。

一些基本概念 Part 1

二进制、十六进制

这个在高中似乎有,这里不详细讲。

指令

和中学的程序框图的框框们一模一样。一条指令对应一个框框。通常我们会把这样的_框框_写成一列。

在下面的类比中,你可以把指令当作“你”所能做的事情或是“你”所计划做的事情。

寄存器

如果高中学的程序框图里有变量的概念,那么理解起来方便:寄存器就相当于变量。

更详细地解释一下的话:寄存器好比一个个小盒子。 1. 你的桌子上能摆的下的盒子就那么几个:寄存器的数量有限; 2. 你可以往盒子里一整块东西把它填满,也可以放半块东西放两次:寄存器里放数字,空想的例子:你可以放 1020 也可以放 1020

内存、地址

寄存器数量有限,那么我们可以把更多的数字用铅笔写在一本笔记本里。那么这个笔记本就相当于内存。一般来说,笔记本要翻来翻去,寄存器更加触手可及。

为了更有效地记笔记,内存这个笔记本每一页都折出了格子。比如说,我想记住 pi 这个数字,由于寄存器数量有限,我们把它写在笔记本里:每页有 80 个格子,从第 8 页 76 格开始写:

| —- | —- | | 第 8 页 76 格 | 3 | | 第 8 页 77 格 | 1 | | 第 8 页 78 格 | 4 | | 第 8 页 79 格 | 1 | | 第 8 页 80 格 | 5 | | 第 9 页 01 格 | 9 | | 第 9 页 02 格 | 2 | | 第 9 页 03 格 | 6 | | …. | … |

这里我们要引入地址的概念。我们把“第 8 页 76 格”这个描述变成一个数字:

8 * 80 + 76 = 716
页数 * 每页格子 + 这一页的第几个格子 = “地址”

716 就是我们的 pi 的“地址”。这很容易理解,“第 8 页 76 格”就是整本笔记本的第 716 格。我们大可以把 716 放到我们的一个寄存器里,之后再去找我们的 pi。

注:计算机中的确有“页”的概念,但和我们这里的有所不同:计算机里是先有一大堆格子,再有把格子整理起来的“页”的。

开始!指令介绍 Part 1

MOV

MOV 指令可以让你把一个数字复制一份,然后放到寄存器或是内存里,覆盖原有的内容。

通常来说MOV指令有一些限制,但是本文并不想涉及这些内容。

ADD, SUB, MUL, DIV

熟悉吗?ADD, SUB, MUL, DIV,分别对应加减乘除。加减乘除的结果必须马上放在寄存器或是内存里,你可以指定它放在哪里,也可以等它放好之后用 MOV 放到自己想放的地方。

JMP

跳转到哪里执行。这相当于程序流程图中的一个箭头,指向某个框框,程序流程就从那个框框继续下去。

CMP / JZ, JC, JG, JL

简单起见,我们将这多个指令放在一起。流程图中,这样的框框并不少见:

“这个大于等于那个吗?” --> YES:一个箭头指向某个框框
||
\/
NO:一个箭头指向另一个框框

在汇编里,我们用 CMPJZ, JC, JG, JL 等指令组合实现这个功能。

CMP:请比较_这个数_和_那个数_!比较的方法是用_这个数_减去_那个数_! JZ:若两个数相等,也就是相减结果为零的话,从我这边的箭头走。 JG:若_这个数_大于_那个数_,也就是相减结果大于零的话,从我这边的箭头走! …:

中场休息

思考题

  1. 你有思路将下面的流程图_大致_转换为汇编语言吗?

一些基本概念 Part 2

函数

评论