// Note : zx 2016

    -> 汇编语言语法、编译器、机器硬件资源(磁盘(文件系统)、储存器、寄存器、CPU、IO端口)

    -> 硬件平台指令集

    汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。

    在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。

    在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。

    许多汇编程序为程序开发、汇编控制、辅助调试提供了额外的支持机制。有的汇编语言编程工具经常会提供宏,它们也被称为宏汇编器。驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言。

    历史发展 :

    1. 微处理器 : 机器指令集 : 机器语言

    -> 机器语言是机器指令的集合。机器指令展开来讲就是一台机器可以正确执行的命令。

    电子计算机的机器指令是一列二进制数字。计算机将之转变为一列高低电平,以使计算机的电子器件受到驱动,进行运算。

    -> 计算机指的是可以执行机器指令,进行运算的机器。这是早期计算机的概念。

    在我们常用的PC机中,有一个芯片来完成上面所说的计算机的功能。这个芯片就是我们常说的CPU(Central Processing Unit,中央处理单元)。

    每一种微处理器,由于硬件设计和内部结构的不同,就需要用不同的电平脉冲来控制,使它工作。所以每一种微处理器都有自己的机器指令集,也就是机器语言。

    1. 汇编语言的主体是汇编指令

    汇编指令和机器指令的差别在于指令的表示方法上。汇编指令是机器指令便于记忆的书写格式。

    计算机能读懂的只有机器指令,需要有一个能够将汇编指令转换成机器指令的翻译程序,称为编译器。程序员用汇编语言写出源程序,再用汇编编译器将其编译为机器码,由计算机最终执行。

    1. 汇编语言是直接面向处理器(Processor)的程序设计语言。

    -> 处理器是在指令的控制下工作的,处理器可以识别的每一条指令称为机器指令。每一种处理器都有自己可以识别的一整套指令,称为指令集。

    处理器执行指令时,根据不同的指令采取不同的动作,完成不同的功能,既可以改变自己内部的工作状态,也能控制其它外围电路的工作状态。

    汇编语言的另一个特点就是它所操作的对象不是具体的数据,而是寄存器或者存储器,也就是说它是直接和寄存器和存储器打交道。

    -> 寻址方式 : 用什么方法找到所需要的数据。

    高级语言中寻址这部分工作是由编译系统来完成的,而在汇编语言中是由程序员自己来完成的

    -> 汇编语言指令是机器指令的一种符号表示,不同类型的CPU有不同的机器指令系统,也就有不同的汇编语言

    除了同系列、不同型号CPU 之间的汇编语言程序有一定程度的可移植性之外,其它不同类型(如:小型机和微机等)CPU 之间的汇编语言程序是无法移植的

    1. 汇编语言保持了机器语言的优点,直接简捷,可有效访问控制机器的各种硬件设备
    2. 语言组成

    -> 1>. 数据传送指令 :

    通用数据传送指令MOV、条件传送指令CMOVcc、堆栈操作指令PUSH/PUSHA/PUSHAD/POP/POPA/POPAD、

    交换指令XCHG/XLAT/BSWAP、地址或段描述符选择子传送指令LEA/LDS/LES/LFS/LGS/LSS等。

    注意,CMOVcc是一个指令簇,包括大量的指令,用于根据EFLAGS寄存器的某些位状态来决定是否执行操作。

    -> 2>. 整数和逻辑运算指令 : 执行算术和逻辑运算

    加法指令ADD/ADC、减法指令SUB/SBB、加一指令INC、减一指令DEC、比较操作指令CMP、

    乘法指令MUL/IMUL、除法指令DIV/IDIV、符号扩展指令CBW/CWDE/CDQE、十进制调整指令DAA/DAS/AAA/AAS、

    逻辑运算指令NOT/AND/OR/XOR/TEST

    -> 3>. 移位指令 : 用于将寄存器或内存操作数移动指定的次数

    逻辑左移指令SHL、逻辑右移指令SHR、算术左移指令SAL、算术右移指令SAR、循环左移指令ROL、

    循环右移指令ROR

    -> 4>. 位操作指令 :

    位测试指令BT、位测试并置位指令BTS、位测试并复位指令BTR、位测试并取反指令BTC、

    位向前扫描指令BSF、位向后扫描指令BSR

    -> 5>. 条件设置指令 : 指令簇,包括大约30条指令

    SETE/SETNE/SETGE

    用于根据EFLAGS寄存器的某些位状态来设置一个8位的寄存器或者内存操作数

    -> 6>. 控制转移指令 :

    无条件转移指令JMP、条件转移指令Jcc/JCXZ、循环指令LOOP/LOOPE/LOOPNE、过程调用指令CALL、

    子过程返回指令RET、中断指令INTn、INT3、INTO、IRET等。

    注意,Jcc是一个指令簇,包含了很多指令,用于根据EFLAGS寄存器的某些位状态来决定是否转移;INT n是软中断指令,n可以是0到255之间的数,用于指示中断向量号

    -> 7>. 串操作指令 : 对数据串进行操作

    串传送指令MOVS、串比较指令CMPS、串扫描指令SCANS、串加载指令LODS、串保存指令STOS

    这些指令可以有选择地使用REP/REPE/REPZ/REPNE和REPNZ的前缀以连续操作

    -> 8>. 输入输出指令 : 用于同外围设备交换数据

    包括端口输入指令IN/INS、端口输出指令OUT/OUTS

    => 高级语言辅助指令 : 为高级语言的编译器提供方便,包括创建栈帧的指令ENTER和释放栈帧的指令LEAVE

    => 控制和特权指令 :

    无操作指令NOP、停机指令HLT、等待指令WAIT/MWAIT、换码指令ESC、总线封锁指令LOCK、

    内存范围检查指令BOUND、全局描述符表操作指令LGDT/SGDT、中断描述符表操作指令LIDT/SIDT、

    局部描述符表操作指令LLDT/SLDT、描述符段界限值加载指令LSR、描述符访问权读取指令LAR、

    任务寄存器操作指令LTR/STR、请求特权级调整指令ARPL、任务切换标志清零指令CLTS、

    控制寄存器和调试寄存器数据传送指令MOV、高速缓存控制指令INVD/WBINVD/INVLPG、

    型号相关寄存器读取和写入指令RDMSR/WRMSR、处理器信息获取指令CPUID、时间戳读取指令RDTSC等

    => 浮点和多媒体指令 : 用于加速浮点数据的运算,以及用于加速多媒体数据处理的单指令多数据

    => 虚拟机扩展指令 : INVEPT/INVVPID/VMCALL/VMCLEAR/VMLAUNCH/VMRESUME/VMPTRLD/VMPTRST/VMREAD/VMWRITE/VMXOFF/VMON

    1. 相关技术

    1>. 汇编器 : 建造目标代码,由解译组语指令集的易记码(mnemonics)到操作码(OpCode),并解析符号名称(symbolic names)成为存储器地址以及其它的实体

    基本就是把机器码变成一些字母而已,编译的时候再把输入的指令字母替换成为晦涩难懂机器码。

    -> 汇编语言编译器有MASM、NASM、TASM、GAS、FASM、RADASM