本篇作为【精通高并发系列】第一章【深入理解计算机原理】这部分分为3篇文章,汇编语言基础(一),C语言基础与汇编下的C语言(二),计算机组成原理和操作系统(三)。
本文作为整个系列的开篇为读者讲解机器语言基础,汇编语言基础知识,寄存器的分类与工作原理,文中给出常见的汇编指令方便记忆与查询。
在计算机语言最初试机器语言,机器语言就是机器指令的集合,机器指令就是一串形如10100001010的二进制数字,计算机可以直接识别和执行;现在的计算机是通过CPU来完成此处理,CPU由于硬件设计和构造的不同,需要不同的电平脉冲来控制,所有每种CPU有自己的机器指令集(这个机器指令集就是机器语言)
汇编语言的主体是汇编指令,汇编是机器指令方便书写的形式,例如,把寄存器bx的内容传送到ax中,机器指令为:1000100111011000,汇编指令:mov ax,bx。
mov(传送的意思,指令写法:MOV target,source),通用寄存器(ax、bx、cx、dx、si、di)
汇编直接面向处理器(CPU),操作的对象是寄存器或者存储器,汇编语言的核心是汇编指令,汇编指令就是机器指令的的易于人类阅读的的形式,然后通过汇编器编译成计算机识别的语言。机器语言在上层抽象出了一层编译器(分层思想)。
汇编语言主要有以下3项组成:
汇编指令:会生成对应的机器码,例如mov等
伪指令:不生成对应的机器码,由编译器执行,计算机不执行,例如 ENTRY伪指令用来告诉编译器的执行入口
其他符号:如+ - * /等,由编译器识别,不生成对应的机器码
寄存器就是,CPU在执行程序时需要读取数据和存储数据,这是需要存储数据的区域,这个区域在CPU中被称为寄存器,也就是内存中的变量、地址、指令等信息都需要背加载进寄存器中,然后CPU 才能读取和执行(寄存了内存中的数据)
这里我对8086CPU(16位)进行寄存器类别的分析,通用寄存器、指针寄存器、变址寄存器、控制寄存器、段寄存器
通用寄存器用于存储普通数据,可以存储任何数据
AX:16位累加寄存器,分为AL和AH,低8位构成AL寄存器,高8位构成AH寄存器
BX:16位基地址寄存器,分为BL和BH,低8位构成BL寄存器,高8位构成BH寄存器
CX:16位技术寄存器,分为CL和CH,低8位构成CL寄存器,高8位构成CH寄存器
DX:16位数据寄存器,分为DL和DH,低8位构成DL寄存器,高8位构成DH寄存器
指针寄存器用于保存指针,即某个地址值。指针用于指向内存中的某个地址信息,通过指针寄存器,我们可以获取内存中的值
SP:16位堆栈指针寄存器,栈指针寄存器指向栈顶
BP:16基指针寄存器,SP指向栈顶,BP指向栈底
变址寄存器,在8086中源变址寄存器有两个SI寄存器和DI寄存器,他们分别用于基址变址寻址和相对变址寻址,也就是,有效地址要由一个基址地址寄存器和一个变址寻址寄存器一起确定最终要访问的内存。
SI:16位源变址寄存器
DI:16位目的变址寄存器
控制寄存器
IP:指令指针寄存器,在CPU中,相当于JVM的PC计数器,用于指明要获取那一条数据
段寄存器
8086的CPU地址总线有20位,寄存器只有16位,如何用16位表示20位的寄存器,我们知道2^16byte是64KB,2^20byte是1M,这里将段寄存器左移4位,就生成了20位的地址,高4位指明某个段,低14位保存IP的16位地址,从而实现1M的寻址地址空间。IP的16位地址就被称为偏移地址,所以通常使用段地址为CS,段内偏移地址为IP地址,使用CS:IP的方式可指明完整的20位地址,CS是代码段寄存器,IP是指向指令的寄存器,这里CPU通过CS:IP的地址找到下一条要执行的指令地址,并将它传送至CPU中执行。
CS:代码段寄存器,指向程序代码段(code segment)
DS:数据段寄存器,指向程序数据段(data segment)
SS:堆栈段寄存器,指向程序堆栈段(stack segment)
ES:附加段寄存器(extra segment)
是指在C语言中插入汇编。在Linux中编写汇编常见,后续文章中会见到
注:intel官网有详细的指令集介绍
指令集架构
通用传送指令:MOV、XCHG、PUSH、POP
算数运算指令:INC、DEC、MUL、DIV、ADD.....
逻辑运算指令:NOT、AND、OR、XOR、TEST
重复指令:REP、REPE/REPZ、PEPNE/PEPNZ
转移指令:JMP、JA/JNBE、JAE/JNB、JB/JNAE、TEB......
循环指令:LOOP、LOOPZ/LOOPE、LOOPNZ/LOOPNE、JCXZ、CALL
方法调用指令:CALL、RET
地址传送指令:LEA、LDS
输入输出指令:IN、OUT