汇编语言-基础知识

汇编语言-基础知识

汇编语言的产生

计算机作为一个只能读懂和执行二进制的东西,在其刚被发明出时,都是用机器语言(01二进制形式表示)来写入程序,随着程序越来越复杂,需要更长的组合,不光一个微小的0->1将会导致错误,以及过于难记忆与分辨。

随后找到了一种解决方法,将这些最基础二进制的指令,用一串字符表示,再由电脑的汇编器(Assembler)将这串字符转化成二进制机器语言,程序员只需要负责写汇编指令的源代码即可。

汇编语言由三部分组成:

  1. 汇编指令(有与其专门对应的机器码)
  2. 伪指令(由汇编器执行,没有与其专门对应的机器码)
  3. 其他符号(如+,-,*,/由汇编器执行,没有与其专门对应的机器码)

程序放在哪里

CPU是电脑能够运算的核心部件,但是想要指挥CPU,需要有指令和数据,储存运行中程序的指令和数据的就是常说的内存。对于磁盘中的数据, CPU无法直接直行,需要加载到内存中才可以被CPU所使用。

指令和数据一样,都是一串二进制码, CPU在工作的时候,会根据需要把它们解释成指令或者数据,例如1000101111000011这一串二进制码,它既可以表示数据8BC3_H,又可以表示指令mov ax, bx (8086CPU中)。

对于内存,目前的方式均为以8个bit即1byte为最小的存储单元(1byte可以保存8位二进制数), CPU想从内存中读取或者存储数据,首先需要找到要存在内存的地址,传达控制信息是读入还是写入,以及读或写的数据。

在一台计算机中, CPU通过总线,与内存等外部设备进行连接,总线可分为三种,分别是地址总线,数据总线以及控制总线,字如其意,地址总线负责找到要读取或者储存的那个位置,数据总线负责数据的传输,控制总线负责传输要执行的行为是读入还是写入。对于8086CPU,他的地址总线有20根,数据总线有16根,也就是说他的寻址空间为2^20Byte,也就是最多可以寻址1MB内存,最多每次只能传输16bit(2Byte)的数据。控制总线与上面所说的地址总线和数据总线不同,他只是一个总称,是计算机不同控制线的集合,控制线分别连接于不同的 外部设备,控制线越多,能控制的外部设备就越多。

内存的地址空间

以典型的8086CPU为例子,他含有20条地址总线,寻址空间最大可达到2^20(00000 -> FFFFF )yte。CPU有20条地址针脚,这些针脚被接在主板上的CPU槽位,通过主板上的地址线连接到各种bios(Base input/output system),和拓展接口。

这些内存地址被分配给不同的功能器件,不同的计算机系统分配内存地址空间 的方式也不同,以8086CPU为例,00000到9FFFF为主存(RAM)空间,A0000到BFFFF为显存的地址空间,C0000到FFFFF为各类ROM(内容无法更改)地址空间。

拆开CPU

一个典型的CPU内部,由运算器,寄存器和控制器等组成,这些器件之间靠内部总线连接,在上面部分说到的均为外部总线,他们被埋在主板中。简单来说:运算器负责执行运算操作,寄存器负责储存运算器要使用的数据,控制器负责控制各种器件协同工作。

对CPU来说,最能直接控制的是它的寄存器,我们通过控制寄存器,来实现对CPU的操作,不同的CPU寄存器的数量与结构不同。8086CPU包含14个寄存器,均为16bit,分别是:

  1. AX,BX,CX,DX,4个通用寄存器,可分为高低8位独立使用
  2. CS,DS,ES,SS,4个段寄存器
  3. BP,SP,SI,DI,4个指针寄存器
  4. FR,标志寄存器
  5. IP,程序计寄存数器

8086的寻址方式

对于8086CPU它包含20条地址总线,和16条数据总线,如何用16位达到20位的寻址呢?8086CPU采用的是:物理地址=段地址*16+段内偏移地址 的方式。比如说段地址是2000H,段内偏移地址是0016H,它所指向的物理地址就是20000H+0016H=20016H。在8086CPU中执行将断地址和段内偏移地址转化成物理地址的器件是地址加法器。

CS段寄存器和IP寄存器

CS和IP可以说是CPU中最重要的两个寄存器,他们指示出CPU当前要读取的指令地址, CPU将CS16+IP所指向的内存地址之后的若干个内存单元压入指令缓存区,通过对指令的解码来拆分出指令,和指令长度N,IP变为IP+N。(8086CPU作为初代X86架构,是CISC指令集,每个指令及长度不等)*。

如果计算机只能按照IP不仅自增顺序执行的话那肯定是不行的,因为很显然,如果计算机不能循环,那么只能把重复的指令不停的写,这是非常不聪明的做法。想要实现循环就需要修改CS和IP寄存器中的内容,在之前有过例子,如果我们想将0045H放到寄存器ax,可以用mov ax, 0045H,但是这对CS和IP寄存器是不可以,系统没有提供直接对他们赋值的操作(mov ip, 0045H ;这样的是非法操作),改变他们内容的有一套专门的指令,被称为跳转指令。

;跳转指令的用法
jmp 6000H:0984H ;同时修改CS段地址和IP地址 jmp CS段地址:IP地址
jmp 0984H       ;只修改IP地址,直接常数赋值
jmp AX          ;只修改IP地址,把ax的内容赋值给IP