前言

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

ea68ebdf3b1ad0d5126bff40df8a88c2.png

little man computer version 2

dd780d8128afff68360a7b56ac0de982.png

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)

当一个代码块从开头执行到末尾后停止时,我们就说该代码块以顺序结构执行

例一:自增

b32318b2450ddb598a7d66a5db163db5.png

 

我们来看看程序是如何实现的

这是一段实现自增的程序。首先我们将num的值加载到累加器并与one变量进行加运算,最后将相加结果存储回num变量中。注:变量一般在程序末尾初始化。

如果我们再加一行代码,OUT,那么输出是这样的:

f3343920b561d48e15de3dbc1d98019c.png

翻译成python是这样子的:

num=0
num+=1
print(num)

 是不是特别简单?那咱们再看一个例子。 


例二:输入两个数,相加后输出和:

d2fe9b20da0749a83c69f372f214f773.png

首先我们输入了一个值到累加器内,并将该值存储到变量num1中(num1指向一个内存地址)

接下来再输入一个值到累加器中,然后将该值和num1变量(指向的内存地址)的值相加。得到的结果储存在累加器内,所以我们可以放心地使用OUT指令将结果输出,最后使用HLT停止程序。

e3c1c6d9de4d73ec6cff512d264a35bd.png

运行结果

下面是以上代码的python版

num1=int(input())
num1+=int(input())
print(num1)

选择结构(selection)

选择结构简单地说就是:如果满足这个条件,那么执行这个,否则执行那个。

例子:两数比大小并输出较大数

64a5d045e51e6ae59c402b0337aa38b4.png

这是很经典的选择结构。首先加载num1并减去num2,如果是正数则说明num1更大,所以跳到max1语句执行加载并输出num1的值。如果是负数就输出num2的值。就这么简单

以下是python代码

num1=5
num2=4
if num1>num2:
    print(num1)
else:
    print(num2)

循环结构(iteration)

循环结构就是一直重复执行一个代码块。一般分为两种循环,一种是条件循环,即满足什么条件才会继续循环执行;一种是遍历循环,本文不会涉及。

例一:倒数到零

9333bc6a84887ef3c6710c48a3b68fe7.png

 首先计算机将num1中存储的值加载到累加器中。(BRZ END) 如果累加器内的值是零,那就结束循环并执行END代码块,如果不是零,就执行下面的语句:输出累加器内存储的值,将该值减1后把商存入num1中(自减)。BRA LOOP的意思是:不管怎么样都继续循环。END代码块就是执行结束程序。

dd360444021df37c1fe43c87662231d9.png

for i in range(5):
    print(5-i)

 


例二:两数相乘

355292d7b181c724cc5b29fe856eadc1.png

该程序实现乘法的原理就是乘法的定义,所以这里不再赘述

很多小伙伴看到代码可能有些疑惑:这个程序在循环结构内每次都会让3自减1,所以只会循环三次。根据乘法的定义,我们知道4x3=4+4+4,那为什么在循环之前要先让num2自减一呢?因为循环内的第一次执行就已经是4+4了,那么一共只需要执行2遍(4+4 +4)即可达到效果,所以要让num2自减。这逻辑也太繁琐了,有没有简单又能实现效果的?

改良版:

e0cfea9100715ec6cc5afe5aa48ff238.png

这段代码是:0+4+4+4 而不是4+4+4+4——初始值从4改为了0所以不需要将num2减一。

9f7b1a9c31bed5aab2c445ac9145df87.png

运行结果

num1=4
num2=3
print(num1*num2)

 


例三:两数相除

389a20740e0d6437ed8ce0d2aa331bd5.png

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

num1=12
num2=3
print(num1/num2)

使用python 直接秒杀

 

 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐