汇编语言学习笔记(一):基础知识

1.前言

此文章如出现歧义或错误的地方请谅解,这篇文章是我在学习汇编的时候同时记录下来的笔记,然后通过教程的方式发表出来,因为通过这样的方式发表出来,可以锻炼自己的语言组织能力,并且能够把问题思考懂了,然后再通过初学者的角度来记录这片文章,从而巩固自己的知识。如果有任何错误歧义的地方,可以通过邮箱与我取得联系。

2.为什么学习汇编?

首先在现在用汇编语言来写用户层面上的应用是很少的了,当然也有一些应用比如驱动、boot loader等。既然已经很少有人用汇编写用户层面的应用了,但是为什么要学习?因为汇编语言是作用于硬件上工作的语言,有便于理解计算机工作的原理,以后学习高级语言更为有利,特别是对于反汇编、破解这一块的技术对汇编语言的学习是必须的。

3.机器语言

机器语言,顾名思义就是机器能看懂的语言,因为计算机智能看懂0和1,通电为1,没有通电为0,所以机器语言就是0和1组成的,也就是二进制。比如:01010000。

4.汇编语言

而汇编语言就是机器语言的一种表达方式,便于程序员更好的去记忆理解。比如机器码为01010000对应的汇编指令就是PUSH AX。

汇编语言包含两个部分:汇编指令、编译器指令(比如符号运算、伪指令等)。

计算机是没有办法计算加减乘除运算符的,而加减乘除是通过编译器转换成计算机能够识别的逻辑运算符(或、与、非),然后利用这些逻辑运算符的组合达到加减乘除的一个效果。

5.编译器

编译器的作用就是把汇编语言转换成机器能够识别的机器语言,可以大概理解编译器就是一个扫描仪,把汇编语言的指令对应相应的机器码翻译出来。

它们大致的关系是:程序员编写汇编语言通过编译器转换汇编语言为机器语言后交给计算机执行。

6.存储器

首先来了解存储器,为什么要了解存储器,因为学习汇编就是操作CPU与这些存储器进行交换数据,存储器不止是硬盘,CPU内部也有存储器、内存、bios、显卡都是存储器,每个存储单元可以存储1字节(Byte),也就是等于8bit。而每个存储器都会被划分为若干个存储单元,而所有的储存单元都会被CPU看成是一个内存,比如01开始是BIOS,05开始是显卡等。,比如下图:

存储单元

内存是一个计算机仅次于CPU的硬件的,CPU无法直接读取硬盘中的数据,而是内存读取硬盘的数据后,CPU从内存中读取的。

在*NIX系统中经常会看见一个叫swap的交换文件,这个文件就是虚拟内存,它的作用就是当内存满了后,把暂时不用的数据放在这个交换文件中,当你需要读取这部分数据的时候,内存会再次从虚拟内存中加载数据到内存中,所以从虚拟内存中实际上等于从硬盘加载数据,所以速度比较慢。

7.指令和数据

指令和数据对于计算机来说都是一堆0和1,比如下面的一串机器码:

1000100111011000:等于89D8H

1000100111011000:等于MOV AX,BX

上面两个同样的机器码确表达出了不同的意思,那么计算机如何来分辨我们这串机器码到底是数据还是指令?这个完全由我们来决定它是指令还是数据。

8.CPU对存储器的读写

首先CPU与其他芯片都有电路线连接,而这些电路线一般称为总线,总线又分为三种,分别为:地址总线、控制总线、数据总线。而这三类总线,是CPU与其他芯片通讯的重要部件。

CPU与存储器的三类总线

CPU想要对存储器进行读写,必须通过三类通讯的交互,而这三类通讯是通过上面不同的总线进行通讯的:

地址信息:如果不清楚储存单元的地址,就随便找一个,有可能把需要从bios中读取的数据变为从显卡中读取了。

读写信息:通过读写信息,CPU才知道是读取指定地址的数据还是写入指定地址数据。

数据信息:当上面两部分完成了,那么如果是读,就读取数据,如果是写就写入数据。

知道了CPU如何进行数据的读写,而该去怎么操作计算机去执行这步的操作?通过机器码,比如:

MOV AX,[3]

翻译成机器码就等于:

10100001 00000011 00000000

当CPU接收到这条机器码就会执行我们上面代码所代表的操作。

9.地址总线

CPU通过地址总线来对存储器进行寻址,比如要从03储存单元读取数据,那么地址总线上面传输的信息为:00000011。从这里就能知道如果地址总线越多表示的不同数字就越多,CPU寻址的范围就越大,因为一根地址总线可以表示0和1两种信息,那10根地址总线,寻址的就是2的10次方,等于1024,因为计算器从0开始计算,所以最小能表示0个,最大能表示1023个。

10.数据总线

而数据总线有多少根也决定了CPU与其他存储器的传输能力,8088CPU数据总线有8根,所以一次性能传输8个二进制位,8086CPU数据总线有16根,所以一次性可以传输16个二进制位。

比如要传输一个8D9AH数据,8088CPU需要分两次传输,第一次传输8D,第二次传输9A。而8086CPU只需要传输一次8D9A。所以数据总线的根数决定了数据的传输速度。

11.控制总线

控制总线有多少根也决定了CPU对于储存器的控制能力,而需要注意的是控制总线指的是一个总称,控制总线是由几根不同的控制线构成的。

而当读取信息的时候控制总线中有一个专门负责读取信号的控制线有低电平的时候表示读取。

而写入数据的时候,同样控制总线中也有一根专门负责写入信号的控制线,当向它输出低电平的时候表示写入。

文档信息

发表评论

电子邮件地址不会被公开。 必填项已用*标注