前言
这篇文章是写给对汇编有些兴趣但是又不喜欢麻烦的小伙伴们。你只需要找一个线上的汇编模拟器即可!这篇文章用little man computer (CPU simulator) 来演示和运行代码。little man computer 使用的计算机体系结构是Von Neuman architecture(冯·诺伊曼结构)。


什么是汇编语言
汇编语言是一门低级的编程语言。它将机器语言的二进制指令包装成了助记符号。注意,汇编语言中的每个指令和机器语言里的是一一对应的,也就是说汇编并没有封装,只是给晦涩难懂的指令起了个简单名字缩写而已。
常用指令
我们这篇文章一共就涉及10个指令
INP(input):输入指令——将输入的值存储至累加器
OUT(output):输出指令——将累加器存储的值输出
DAT(data):创建一个变量,具体语法是:var_name DAT value。比如 num DAT 2
BRZ(branch zero):当累加器中存储的值为0时,分支到给定地址
BRP(branch positive):当累加器储存的值为正时,分支到给定地址
BRA(branch always):不管什么情况发生,分支到给定地址(一般用在循环语句中)
STA(store from the accumulator):将累加器中的值存储到给定地址中
LDA(load to the accumulator):将给定地址中的值加载到累加器中
HTL(halt):字如其意,就是停止程序的意思。
ADD:顾名思义,就是将累加器的值与另外一个值相加。
SUB:将累加器的值与另一个值相减
如果看完还有点晕乎乎的,不慌,例子马上来了!
程序结构
顺序结构(sequence)
当一个代码块从开头执行到末尾后停止时,我们就说该代码块以顺序结构执行
例一:自增
我们来看看程序是如何实现的
这是一段实现自增的程序。首先我们将num的值加载到累加器并与one变量进行加运算,最后将相加结果存储回num变量中。注:变量一般在程序末尾初始化。
如果我们再加一行代码,OUT,那么输出是这样的:
是不是特别简单?那咱们再看一个例子。
例二:输入两个数,相加后输出和:
首先我们输入了一个值到累加器内,并将该值存储到变量num1中(num1指向一个内存地址)
接下来再输入一个值到累加器中,然后将该值和num1变量(指向的内存地址)的值相加。得到的结果储存在累加器内,所以我们可以放心地使用OUT指令将结果输出,最后使用HLT停止程序。

选择结构(selection)
选择结构简单地说就是:如果满足这个条件,那么执行这个,否则执行那个。
例子:两数比大小并输出较大数
这是很经典的选择结构。首先加载num1并减去num2,如果是正数则说明num1更大,所以跳到max1语句执行加载并输出num1的值。如果是负数就输出num2的值。就这么简单
循环结构(iteration)
循环结构就是一直重复执行一个代码块。一般分为两种循环,一种是条件循环,即满足什么条件才会继续循环执行;一种是遍历循环,本文不会涉及。
例一:倒数到零
首先计算机将num1中存储的值加载到累加器中。(BRZ END) 如果累加器内的值是零,那就结束循环并执行END代码块,如果不是零,就执行下面的语句:输出累加器内存储的值,将该值减1后把商存入num1中(自减)。BRA LOOP的意思是:不管怎么样都继续循环。END代码块就是执行结束程序。
例二:两数相乘
该程序实现乘法的原理就是乘法的定义,所以这里不再赘述
很多小伙伴看到代码可能有些疑惑:这个程序在循环结构内每次都会让3自减1,所以只会循环三次。根据乘法的定义,我们知道4x3=4+4+4,那为什么在循环之前要先让num2自减一呢?因为循环内的第一次执行就已经是4+4了,那么一共只需要执行2遍(4+4 +4)即可达到效果,所以要让num2自减。这逻辑也太繁琐了,有没有简单又能实现效果的?
改良版:
这段代码是:0+4+4+4 而不是4+4+4+4——初始值从4改为了0所以不需要将num2减一。

例三:两数相除
原理和两数相乘类似,因此不再赘述。