跟我学汇编(一)基础知识
零、前言
身为程序猿。序号一定从零開始数。哈哈。
这篇文章是在学习汇编语言是所做的笔记,当中的内容必然会受到书中内容的影响。我所看的课本是王爽所著的《汇编语言》(第三版),写博客的目的是为了巩固自己所学的知识,同一时候将自己的想法表达出来,和大家一起分享,共同进步,不会将内容用于不论什么商业目的。假设博文中内容涉及侵权,请及时与我联系删除,谢谢。
一、汇编语言的产生
我们知道机器仅仅能看懂机器语言,也就是0和1。实际上0和1仅仅是我们规定的数字,机器事实上连0和1也看不懂,这里的0和1实际上是指两种不同的电压状态。计算机是用电的。它能理解的就是电压的变化。所以我们通过不同的电压驱动计算机运算。来完毕我们所需要的任务。
在早期,人们通过纸带来编程,打孔的地方表示1,不打孔的地方表示0。然后将纸带输入计算机中。这种方式不但费时费力,并且不同发现错误。
比如以下的程序:
101110000000000000000011
000001010000000000110000
001011010000000000000101
这是8086CPU完毕运算s=768+12288-1280的程序,假设这个程序中错误的将一个0写成了1,试想要想发现这个错误是多么的困难。
为了方便人们编敲代码。并且避免01代码easy出错的问题。人们发明了汇编语言。
比如:机器指令1000100111011000表示把寄存器BX的内容送到AX中。
汇编指令则写成mov ax,bx。
这种写法与人类语言接近。便于阅读和记忆。
我们上边说过,计算机仅仅认识高低不同的电压,那么汇编语言在计算机中是怎么转化成机器认识的语言的呢。
汇编语言的运行过程如上图所看到的。首先经过编译器将汇编指令编译成机器码,然后机器码就行运行在计算机上了。
汇编语言又分为以下的三种:
- 汇编指令:机器码的助记符。有相应的机器码。
- 伪指令:没有相应的机器码,由编译器运行,计算机并不运行。
- 其它符号:如+、-、*、/等,由编译器识别,没有相应的机器码。
二、CPU对存储器的读写
我们知道数据和指令是放在内存中的,CPU通过总线对存储器进行訪问。但实际上总线是分为三部分的,即地址线,控制线和数据线。
地址线表示CPU要对内存中的哪个地址进行操作,所以地址线的条数决定了CPU可以訪问的内存范围,由于一根线上最多仅仅能有两种不同的状态即0和1,所以10根地址线可以訪问的存储单元的个数就是2^10个。
地址线仅仅是送出了要操作的地址,可是并没有声明要进行什么操作,所以控制线就是来决定对存储单元的操作的。所以说控制线的条数决定了CPU可以运行的操作的种类。
数据线是用来在CPU和内存之间进行数据传送的,所以数据线的条数决定了一次最多传送的数据的数量,比如8根数据线一次就能传送8个bit即一个字节。
上图展示了CPU从3号内存单元中读取数据的过程。首先CPU利用数据线送出地址3。然后通过控制线发送读命令。然后内存将结果通过数据线返回给CPU。
三、内存地址空间
什么是内存地址空间呢?举例来讲,一个CPU的地址总线宽度为10,那么可以寻址1024个内存单元。这1024个可寻到的内存单元就构成了这个CPU的内存地址空间。当然这里所说的内存并不单单是内存条中的内存,还包含其它各种外设中的RAM和ROM。
比如,显卡也有自己的内存,用来存储在显示屏上显示的内容,另外显卡BIOS ROM也被当做是内存空间中的一部分,此外还有网卡的BIOS ROM和系统BIOS ROM地址空间等。
因此我们在基于一个计算机硬件系统编程时,必需要知道这个系统中的内存地址空间分配情况。应为当我们想在某类存储器中读写数据的时候。必须知道它的第一个单元地址和最后一个单元地址。才干保证读写操作是在预期的存储器中进行的。比方,我们希望在显示器上输出一段信息,那么必须将这段信息写到显存中,显卡才干将它输出到显示器上,要想向显存中写入数据。必须知道显存在地址空间中的地址。
上图展示了8086PC机内存地址空间分配的基本情况。
从地址0~9FFFF的内存单元中读取数据。实际上就是在读取住随机存储器中的数据。向地址A0000~BFFFF的内存单元中写数据,就是向显示器中写入数据,这些数据会被显卡显示到显示器上。我们向C0000~FFFFFF的内存单元中写入数据的操作是无效的,由于这等于改写仅仅读存储器中的内容。