标题：汇编语言
简介
汇编语言是直接面向处理器（Processor）的程序设计语言。处理器是在指令的控制下工作的，处理器可以识别的每一条指令称为机器指令。每一种处理器都有自己可以识别的一整套指令，称为指令集。处理器执行指令时，根据不同的指令采取不同的动作，完成不同的功能，既可以改变自己内部的工作状态，也能控制其它外围电路的工作状态。
如图所示，在电路中，每条机器指令都表现为一组电信号，通过一排导线进入处  [1]理器。这些电信号有的呈高电平，有的呈低电平，哪些为高，哪些为低，取决于不同的机器指令。如果把高电平记为“1”，低电平记为“0”，那么，不同的机器指令将表现为不同的二进制序列，由于它们的无规律性，这就使得机器指令机器指令难以理解、书写和记忆。
人类最容易接受自己每天都使用的自然语言。为了使机器指令的书写和理解变得容易，需要借鉴自然语言的优点，为此就引入了汇编语言。汇编语言使用符号来代表不同的机器指令，而这些符号非常接近于自然语言的要素。基本上，汇编语言里的每一条指令，都对应着处理器的一条机器指令。
汇编语言包括两个部分：语法部分和编译器。语法部分提供与机器指令相对应的助记符，方便指令的书写和阅读。当然，汇编语言的符号可以被人类接受，但不能被处理器识别，为此，还要由汇编语言编译器将这些助记符转换成机器指令。
根据应用领域的不同，处理器的种类繁多，比如用于工业控制和嵌入式计算的Z80、MC68000和MCS-51、广泛应用于个人计算机的INTEL x86系列，以及基于ARM体系结构的处理器，包括苹果公司在内的大企业都是ARM的客户。事实上，今天的ARM是最受欢迎的32位嵌入式处理器，而且，今天的ARM处理器比INTEL奔腾系列卖得还多，基本上是3：1的比例。
不同的处理器有不同的指令集。正是因为这个原因，每一种处理器都会有自己专属的汇编语言语法规则和编译器。即使是同一种类型的处理器，也可能拥有不同的汇编语言编译器。一个明显的例子是INTEL x86系列的处理器，围绕它就开发出好多种编译器来，如MASM、NASM、FASM、TASM和AT&T等。而且，这每一种编译器，都使用不同的语法。
优缺点
优点1、因为用汇编语言设计的程序最终被转换成机器指令，故能够保持机器语言的一致性，直接、简捷，并能象机器指令一样访问、控制计算机的各种硬件设备，如磁盘、存储器、CPU、I/O端口等。使用汇编语言，可以访问所有能够被访问的软、硬件资源。
2、目标代码简短，占用内存少，执行速度快，是高效的程序设计语言，经常与高级语言配合使用，以改善程序的执行速度和效率，弥补高级语言在硬件控制方面的不足，应用十分广泛。缺点1、汇编语言是面向机器的，处于整个计算机语言层次结构的底层，故被视为一种低级语言，通常是为特定的计算机或系列计算机专门设计的。因此，不同的处理器有不同的汇编语言语法和编译器，编译的程序无法在不同的处理器上执行，缺乏可移植性；
2、难于从汇编语言代码上理解程序设计意图，可维护性差，即使是完成简单的工作也需要大量的汇编语言代码，很容易产生bug，难于调试；
3、使用汇编语言必须对某种处理器非常了解，而且只能针对特定的体系结构和处理器进行优化，开发效率很低，周期长且单调。
应用
历史上，汇编语言曾经是非常流行的程序设计语言之一。随着软件规模的增长，以及随之而来的对软件开发进度和效率的要求，高级语言逐渐取代了汇编语言。但即便如此，高级语言也不可能完全替代汇编语言的作用。就拿Linux内核来讲，虽然绝大部分代码是用C语言编写的，但仍然不可避免地在某些关键地方使用了汇编代码。由于这部分代码与硬件的关系非常密切，即使是C语言也会显得力不从心，而汇编语言则能够很好扬长避短，最大限度地发挥硬件的性能。 
首先，汇编语言的大部分语句直接对应着机器指令，执行速度快，效率高，代码体积小，在那些存储器容量有限，但需要快速和实时响应的场合比较有用，比如仪器仪表和工业控制设备中。
其次，在系统程序的核心部分，以及与系统硬件频繁打交道的部分，可以使用汇编语言。比如操作系统的核心程序段、I/O接口电路的初始化程序、外部设备的低层驱动程序，以及频繁调用的子程序、动态连接库、某些高级绘图程序、视频游戏程序等等。
再次，汇编语言可以用于软件的加密和解密、计算机病毒的分析和防治，以及程序的调试和错误分析等各个方面。
最后，通过学习汇编语言，能够加深对计算机原理和操作系统等课程的理解。通过学习和使用汇编语言，能够感知、体会和理解机器的逻辑功能，向上为理解各种软件系统的原理，打下技术理论基础；向下为掌握硬件系统的原理，打下实践应用基础。
特点
1．机器相关性。
这是一种面向机器的低级语言，通常是为特定的计算机或系列计算机专门设计的。因为是机器指令的符号化表示，故不同的机器就有不同的汇编语言。使用汇编语言能面向机器并较好地发挥机器的特性，得到质量较高的程序。
2．高速度和高效率。
汇编语言保持了机器语言的优点，具有直接和简捷的特点，可有效地访问、控制计算机的各种硬件设备，如磁盘、存储器、CPU、I/O端口等，且占用内存少，执行速度快，是高效的程序设计语言。
3．编写和调试的复杂性。
由于是直接控制硬件，且简单的任务也需要很多汇编语言语句，因此在进行程序设计时必须面面俱到，需要考虑到一切可能的问题，合理调配和使用各种软、硬件资源。这样，就不可避免地加重了程序员的负担。与此相同，在程序调试时，一旦程序的运行出了问题，就很难发现。
经典教材
汇编语言教材很多，各种处理器都有涉及，粗略统计不下百种。在这么多的教材里，用得较多的可以分类列举如下：　x86处理器1.《x86汇编语言：从实模式到保护模式》，李忠 著，电子工业出版社，2013－1 。  [1]
基于INTEL x86处理器、NASM编译器和BOCHS虚拟机。汇编语言就是处理器的语言，从这个意义上来说，既然学习汇编语言，就必须直接面向硬件编程，而不是使用莫名其妙的DOS中断和API调用。这是一本有趣的书，它没有把篇幅花在计算一些枯燥的数学题上。相反，它教你如何直接控制硬件，在不借助于BIOS、DOS、Windows、Linux或者任何其他软件支持的情况下来显示字符、读取硬盘数据、控制其他硬件等。 
我们知道，32位和64位是主流，实模式和DOS操作系统已经成为历史，Linux和Windows都工作在保护模式下。这本书从实模式讲到32位保护模式，尤其以32位保护模式为重点，阅读本书，对理解现代计算机和现代操作系统的工作原理有非常大的帮助作用。
2.《汇编语言》（第2版），王爽　著，清华大学出版社，2008-4-1
基于INTEL 8086处理器、MASM编译器，以及DOS平台的汇编教材，完全以8086处理器的实模式为主，不涉及常用的32位和64位模式，但因为通俗易懂，读者反映很好。
3.《80X86汇编语言程序设计教程》，杨季文等 编著，清华大学出版社，1999-3-1
基于INTEL x86处理器、MASM和TASM编译器，包含16位实模式和32位保护模式的内容，而且对后者讲述较为详细。
4.《32位汇编语言程序设计》，钱晓捷　编著，机械工业出版社，2011-8-1
基于INTEL x86处理器、MASM编译器，以及WINDOWS平台的汇编教材。
5.《16/32位微机原理汇编语言及接口技术》，钱晓捷，陈涛 编著，机械工业出版社，2005-2-1
基于INTEL x86处理器，论述16位微型计算机的基本原理、汇编语言和接口技术，并引出32位微机系统相关技术。
6.《Intel汇编语言程序设计》（第五版），（美）欧文　著，电子工业出版社，2012-7-1
基于INTEL x86处理器、MASM编译器，以及DOS/WINDOWS平台的汇编教材，既有16位实模式的内容，也有32位保护模式的内容。
7.《汇编语言的编程艺术》（第2版），（美）海德　著，清华大学出版社，2011-12-1
基于INTEL x86处理器，使用了作者自制的高级语言汇编器(High Level Assembler，HLA)作为教学工具，以部分地获得高级语言的优势和功能。
8.《x86 PC汇编语言、设计与接口》（第五版），（美）马兹迪，考西 著，电子工业出版社，2011-1-1
基于INTEL x86处理器，既讲了16位实模式的内容，也讲了32位保护模式的内容，对64位也有所介绍。ARM及单片机1.《汇编语言程序设计--基于ARM体系结构》(第2版)，文全刚　等主编，北京航空航天大学出版社，2010-8-1
基于ARM体系结构的处理器，是学习嵌入式技术的入门教材。
2.《零基础学AVR单片机》，徐益民 等编著，机械工业出版社，2011-1-1
单片机概述、avr单片机的开发工具、avr单片机c语言、atmega16单片机基本结构、avr的指令系统与汇编系统等。
3.《基于Multisim10的51单片机仿真实战教程》，聂典，丁伟 主编，电子工业出版社，2010-2-1
阐述了NI Multisim 10在单片机仿真中的各项主要功能。
4.《PIC18微控制器：体系结构、编程与接口设计》，（美）贝里著，清华大学出版社，2009-4-1
微控制器广泛应用于汽车、家电、工业控制、医疗设备等众多领域。本书以Microchip公司的PIC18系列微控制器为例，全面讲解如何使用C语言和汇编语言对微控制器进行编程。
5.《CASL汇编语言程序设计》，赵立辉编著，中国电力出版社，2002-10-1
CASL汇编语言是中国计算机软件专业技术资格和水平考试高级程序员级的必考内容。本书是讲述CASL汇编语言程序设计的专著。
编译环境
用汇编语言等非机器语言书写好的符号程序称为源程序，汇编语言编译器的作用是将源程序翻译成目标程序。目标程序是机器语言程序，当它被安置在内存的预定位  置上后，就能被计算机的CPU处理和执行。
汇编的调试环境总的来说比较少，也很少有非常好的编译器。编译器的选择依赖于目标处理器的类型和具体的系统平台。一般来说，功能良好的编译器用起来应当非常方便，比如，应当可以自动整理格式、语法高亮显示，集编译、链接和调试为一体，方便实用。
对于广泛使用的个人计算机来说，可以自由选择的汇编语言编译器有MASM、NASM、TASM、FASM、RADASM等，但大都不具备调试功能。如果是为了学习汇编语言，轻松汇编因为拥有一个完善的集成环境，是一款非常适合初学者的汇编编译器。
x86处理器指令集
数据传送指令这部分指令包括通用数据传送指令MOV、条件传送指令CMOVcc、堆栈操作指令PUSH/ PUSHA/ PUSHAD/ POP/ POPA/ POPAD、交换指令XCHG/ XLAT/ BSWAP、地址或段描述符选择子传送指令LEA/ LDS/ LES/ LFS/ LGS/ LSS等。注意，CMOVcc不是一条具体的指令，而是一个指令簇，包括大量的指令，用于根据EFLAGS寄存器的某些位状态来决定是否执行指定的传送操作。整数和逻辑运算指令这部分指令用于执行算术和逻辑运算，包括加法指令ADD/ ADC、减法指令SUB/ SBB、加一指令INC、减一指令DEC、比较操作指令CMP、乘法指令MUL/ IMUL、除法指令DIV/ IDIV、符号扩展指令CBW/ CWDE/ CDQE、十进制调整指令DAA/ DAS/ AAA/ AAS、逻辑运算指令NOT/ AND/ OR/ XOR/ TEST等。移位指令这部分指令用于将寄存器或内存操作数移动指定的次数。包括逻辑左移指令SHL、逻辑右移指令SHR、算术左移指令SAL、算术右移指令SAR、循环左移指令ROL、循环右移指令ROR等。位操作指令这部分指令包括位测试指令BT、位测试并置位指令BTS、位测试并复位指令BTR、位测试并取反指令BTC、位向前扫描指令BSF、位向后扫描指令BSR等。条件设置指令这不是一条具体的指令，而是一个指令簇，包括大约30条指令，用于根据EFLAGS寄存器的某些位状态来设置一个8位的寄存器或者内存操作数。比如SETE/ SETNE/ SETGE等等。控制转移指令这部分包括无条件转移指令JMP、条件转移指令Jcc/ JCXZ、循环指令LOOP/ LOOPE/ LOOPNE、过程调用指令CALL、子过程返回指令RET、中断指令INT n、INT3、INTO、IRET等。注意，Jcc是一个指令簇，包含了很多指令，用于根据EFLAGS寄存器的某些位状态来决定是否转移；INT n是软中断指令，n可以是0到255之间的数，用于指示中断向量号。串操作指令这部分指令用于对数据串进行操作，包括串传送指令MOVS、串比较指令CMPS、串扫描指令SCANS、串加载指令LODS、串保存指令STOS，这些指令可以有选择地使用REP/ REPE/ REPZ/ REPNE和REPNZ的前缀以连续操作。输入输出指令这部分指令用于同外围设备交换数据。包括端口输入指令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等。浮点和多媒体指令这部分指令用于加速浮点数据的运算，以及用于加速多媒体数据处理的单指令多数据(SIMD及其扩展SSEx)指令。这部分指令数据非常庞大，无法一一列举，请自行参考INTEL手册。虚拟机扩展指令这部分指令包括INVEPT/ INVVPID/ VMCALL/ VMCLEAR/ VMLAUNCH/ VMRESUME/ VMPTRLD/ VMPTRST/ VMREAD/ VMWRITE/ VMXOFF/ VMON等。
发展前景
汇编语言是机器语言的助记符，相对于比枯燥的机器代码易于读写、易于调试和修改，同时优秀的汇编语言设计者经过巧妙的设计，使得汇编语言汇编后的代码比高级语言执行速度更快，占内存空间少等优点，但汇编语言的运行速度和空间占用是针对高级语言并且需要巧妙设计，而且现在部分高级语言在编译后代码执行效率同样很高，所以现在此优点慢慢弱化。而且在编写复杂程序时具有明显的局限性，汇编语言依赖于具体的机型，不能通用，也不能在不同机型之间移植。常说汇编语言是低级语言，并不是说汇编语言要被弃之，相反，汇编语言仍然是计算机（或微机）底层设计程序员必须了解的语言，在某些行业与领域，汇编是必不可少的，非它不可适用。只是，现在计算机最大的领域为IT软件，也是我们常说的计算机应用软件编程，在熟练的程序员手里，使用汇编语言编写的程序，运行效率与性能比其它语言写的程序相对提高，但是代价是需要更长的时间来优化，如果对计算机原理及编程基础不扎实，反而增加其开发难度，实在是得不偿失，对比现在的软件开发，已经是市场化的软件行业，加上高级语言的优秀与跨平台，一个公司不可以让一个团队使用汇编语言来编写所有的东西，花上几倍甚至几十倍的时间，不如使用其它语言来完成，只要最终结果不比汇编语言编写的差太多，就能抢先一步完成，这是市场经济下的必然结果。  
但是，迄今为止，还没有程序员敢断定汇编语言是不需要学的，同时，汇编语言(Assembly Language)是面向机器的程序设计语言，设计精湛的汇编程序员，部分已经脱离软件开发，挤身于工业电子编程中。对于功能相对小巧但硬件对语言设计要求苛刻的行业，如4位单片机，由于其容量及运算，此行业的电子工程师一般负责从开发设计电路及软件控制，主要开发语言就是汇编，c语言使用只占极少部分，而电子开发工程师是千金难求，在一些工业公司，一个核心的电子工程师比其它任何职员待遇都高，对比起来，一般电子工程师待遇是程序员的十倍以上。这种情况是因为现在学习汇编的人虽然也不少，但是真正能学到精通的却不多，它相对于高级语言难学，难用，适用范围小，虽然简单，但是过于灵活，学习过高级语言的人去学习汇编比一开始学汇编的人难得多，但是学过汇编的人学习高级语言却很容易，简从繁易，繁从简难。对于一个全面了解微机原理的程序员，汇编语言是必修语言。

图书或教材
  
汇编语言[1]著 译 者：王晓虹出版日期：2011-3-11上架时间：2011-7-7出 版 社：清华大学出版社ISBN：978 730 224 767 8内容简介：
《汇编语言》共11章，以intel 8086/8088系列计算机为背景，前8章系统地介绍宏汇编语言程序设计的基础知识、语法规则和程序设计方法；后3章主要介绍8086、8088计算机汇编语言的应用，包括输入输出的概念及其程序设计方法，中断的概念、方法及其开发应用技巧，文件编程方法等内容。为方便自学，在各章后面增加了理解与练习或课外阅读，通过例题分析，加强对汇编语言的理解与掌握。 　《汇编语言》可作为高校计算机本科专业的教材和自学考试的教材，也可作为教师、非计算机专业的研究生及计算机应用技术人员的参考书。
图书目录：
第1章 概论 1

专业课程
一直以来，汇编语言是高等学校计算机相关专业（计算机科学与技术、软件工程、自动化等）的必修课程。近几年，由于课时的原因，某些高校和某些计算机应用专业陆续取消了这一课程。但鉴于汇编语言课程的重要性，汇编语言仍是某些专业的必修课。
论坛或讨论组
为了学习汇编语言，网络上有一些爱好者自发组织的论坛和讨论小组，比如百度的“汇编语言”吧。在很多知名的计算机和编程网站上，也设立有“汇编语言”论坛等版块。这些贴吧和论坛，有助于汇编语言爱好者交流编程经验，解决他们在学习过程中遇到的各种问题。