汇编零基础入门

前言

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

little man computer version 2
little man computer version 1

什么是汇编语言

汇编语言是一门低级的编程语言。它将机器语言的二进制指令包装成了助记符号。注意,汇编语言中的每个指令和机器语言里的是一一对应的,也就是说汇编并没有封装,只是给晦涩难懂的指令起了个简单名字缩写而已。


常用指令

我们这篇文章一共就涉及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减一。

运行结果

例三:两数相除

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


版权声明:本文为jimmy1881415157原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。