// Note : zx 2016
-> 汇编语言语法、编译器、机器硬件资源(磁盘(文件系统)、储存器、寄存器、CPU、IO端口)
-> 硬件平台指令集
汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。
在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。
许多汇编程序为程序开发、汇编控制、辅助调试提供了额外的支持机制。有的汇编语言编程工具经常会提供宏,它们也被称为宏汇编器。驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言。
历史发展 :
- 微处理器 : 机器指令集 : 机器语言
-> 机器语言是机器指令的集合。机器指令展开来讲就是一台机器可以正确执行的命令。
电子计算机的机器指令是一列二进制数字。计算机将之转变为一列高低电平,以使计算机的电子器件受到驱动,进行运算。
-> 计算机指的是可以执行机器指令,进行运算的机器。这是早期计算机的概念。
在我们常用的PC机中,有一个芯片来完成上面所说的计算机的功能。这个芯片就是我们常说的CPU(Central Processing Unit,中央处理单元)。
每一种微处理器,由于硬件设计和内部结构的不同,就需要用不同的电平脉冲来控制,使它工作。所以每一种微处理器都有自己的机器指令集,也就是机器语言。
- 汇编语言的主体是汇编指令
汇编指令和机器指令的差别在于指令的表示方法上。汇编指令是机器指令便于记忆的书写格式。
计算机能读懂的只有机器指令,需要有一个能够将汇编指令转换成机器指令的翻译程序,称为编译器。程序员用汇编语言写出源程序,再用汇编编译器将其编译为机器码,由计算机最终执行。
- 汇编语言是直接面向处理器(Processor)的程序设计语言。
-> 处理器是在指令的控制下工作的,处理器可以识别的每一条指令称为机器指令。每一种处理器都有自己可以识别的一整套指令,称为指令集。
处理器执行指令时,根据不同的指令采取不同的动作,完成不同的功能,既可以改变自己内部的工作状态,也能控制其它外围电路的工作状态。
汇编语言的另一个特点就是它所操作的对象不是具体的数据,而是寄存器或者存储器,也就是说它是直接和寄存器和存储器打交道。
-> 寻址方式 : 用什么方法找到所需要的数据。
高级语言中寻址这部分工作是由编译系统来完成的,而在汇编语言中是由程序员自己来完成的
-> 汇编语言指令是机器指令的一种符号表示,不同类型的CPU有不同的机器指令系统,也就有不同的汇编语言
除了同系列、不同型号CPU 之间的汇编语言程序有一定程度的可移植性之外,其它不同类型(如:小型机和微机等)CPU 之间的汇编语言程序是无法移植的
- 汇编语言保持了机器语言的优点,直接简捷,可有效访问控制机器的各种硬件设备
- 语言组成
-> 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>. 汇编器 : 建造目标代码,由解译组语指令集的易记码(mnemonics)到操作码(OpCode),并解析符号名称(symbolic names)成为存储器地址以及其它的实体
基本就是把机器码变成一些字母而已,编译的时候再把输入的指令字母替换成为晦涩难懂机器码。
-> 汇编语言编译器有MASM、NASM、TASM、GAS、FASM、RADASM