从机器语言到汇编
我们计算机底层的硬件只能识别二进制的数据,而上一篇文章提到人们设计了一系列的指令集来告诉CPU需要去做什么,完成什么功能。但是,如果我们直接编写和检查指令集就有很大的问题,举个例子,因为指令集是由一堆010101010的二进制组成的,假如程序出现问题,或者我们要排查bug的时候,难道要去一行一行的检查这些二进制吗,显然效率是很低的!因此,我们能不能对这些机器语言进行翻译,搭配助记符的方式使得我们人更好的了解机器语言?这就引出了汇编语言。
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。
特点
1、汇编语言与硬件相关,因为不同硬件对应的上层指令集可能不一样,因此每一种处理器都有相应的汇编语言;
2、汇编语言与机器码相关,指令通常与机器码一一对应;
作用
1、能够深入理解硬件工作原理;
2、充分利用计算机特性(如SIMD,即单指令多数据);
3、开发操作系统内核、驱动程序等;
4、优化程序,汇编语言就是对机器语言的翻译,如果了解汇编语言,那么对于优化我们的程序将的大有帮助。
寄存器
汇编语言使用的寄存器实际上并不是物理寄存器,而是在通过一定的操作映射CPU内部特定的物理寄存器。你也可以这样理解,汇编语言就是操作寄存器!在早期的8086处理器中,共有14个寄存器,下一篇文章我将从推到的角度去分析这些寄存器。
通用寄存器
数据寄存器
AX
Accumulator:累加寄存器,也称之为累加器,常用于存放算术、逻辑运算中的操作数或结果。另外,所有的外部设备的输入输出指令都只能使用AL或AX作为数据寄存器。
BX
BX (Base):基地址寄存器,可用于数据寄存器,访问存储器时、可以存放被访问内存的地址,是具有双重功能的寄存器
CX
CX (Count):计数器寄存器;在循环、串操作指令中用作计数器。如在loop循环中用作计数器。
DX
DX (Data):数据寄存器;在乘除法中作为数据累加器,在输入输出操作中存放端口的地址。此外,在做双字长乘除法运算时,DX 与AX合起来存放一个双字长数(32位),其中DX存放高16位(余数),AX存放低16位(商)。
指针寄存器
SP
Stack Pointer:堆栈指针寄存器,存放栈顶的偏移位置,供堆栈操作使用,常用SS搭配进行使用
BP
Base Pointer:基指针寄存器;存放堆栈内数据的基地址
变址寄存器
SI
Source Index:源变址寄存器;主要用于存放地址,在字符串操作中存放源操作数的偏移地址。变址寄存器内存放 的地址在数据传送完成后,具有自动修改的功能。
DI
Destination Index:目的变址寄存器;主要用于存放地址,在字符串操作中存放目的操作数的偏移地址。
2、控制寄存器
IP
IP(Instruction Pointer):指令指针寄存器,常与CS进行配合使用,用于共同寻址。
FLAG
标志寄存器
3、段寄存器
CS(Code Segment):代码段寄存器
DS(Data Segment):数据段寄存器
SS(Stack Segment):堆栈段寄存器
ES(Extra Segment):附加段寄存器
CS:代码段寄存器
总结
本小章从推导的角度说明了汇编语言的重要性,同时介绍了早期8086的一些寄存器。