<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>汇编语言</title>
	<atom:link href="https://www.aitaocui.cn/tag/217122/feed" rel="self" type="application/rss+xml" />
	<link>https://www.aitaocui.cn</link>
	<description>翡翠玉石爱好者聚集地</description>
	<lastBuildDate>Fri, 25 Nov 2022 05:18:10 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.1.1</generator>

<image>
	<url>https://www.aitaocui.cn/wp-content/uploads/2022/11/taocui.png</url>
	<title>汇编语言</title>
	<link>https://www.aitaocui.cn</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>汇编语言(面向机器的程序设计语言)</title>
		<link>https://www.aitaocui.cn/article/328727.html</link>
					<comments>https://www.aitaocui.cn/article/328727.html#respond</comments>
		
		<dc:creator><![CDATA[学而后知不足]]></dc:creator>
		<pubDate>Fri, 25 Nov 2022 05:18:10 +0000</pubDate>
				<category><![CDATA[百科]]></category>
		<category><![CDATA[汇编语言]]></category>
		<guid isPermaLink="false">https://www.aitaocui.cn/?p=328727</guid>

					<description><![CDATA[汇编语言（Assembly Language）是面向机器的程序设计语言。在汇编语言中，用助记符（Mnemonics）代替机器指令的操作码，用地址符号（Symbol）或标号（Labe...]]></description>
										<content:encoded><![CDATA[</p>
<article>
<p>汇编语言（Assembly Language）是面向机器的程序设计语言。在汇编语言中，用助记符（Mnemonics）代替机器指令的操作码，用地址符号（Symbol）或标号（Label）代替指令或操作数的地址，如此就增强了程序的可读性并且降低了编写难度，象这样符号化的程序设计语言就是汇编语言，因此亦称为符号语言。使用汇编语言编写的程序，机器不能直接识别，还要由汇编程序或者叫汇编语言编译器（即汇编器）转换成机器指令。汇编程序将符号化的操作代码组装成处理器可以识别的机器指令，这个组装的过程称为组合或者汇编。因此，有时候人们也把汇编语言称为组合语言。</p>
</article>
<p><img decoding="async" src="https://www.aitaocui.cn/wp-content/uploads/2022/08/20220828_630b7f321643e.jpg" /></p>
<article>
<h1>简介</h1>
<div></div>
<p>汇编语言是一种功能很强的程序设计语言，也是利用计算机所有硬件特性并能直接控制硬件的语言。汇编语言，作为一门语言，对应于高级语言的编译器，需要一个“汇编器”来把汇编语言原文件汇编成机器可执行的代码。高级的汇编器如MASM，TASM等等为我们写汇编程序提供了很多类似于高级语言的特征，比如结构化、抽象等。在这样的环境中编写的汇编程序，有很大一部分是面向汇编器的伪指令，已经类同于高级语言。现在的汇编环境已经如此高级，即使全部用汇编语言来编写windows的应用程序也是可行的，但这不是汇编语言的长处。汇编语言的长处在于编写高效且需要对机器硬件精确控制的程序。</p>
<p>符号语言</p>
<p>在汇编语言中，用助记符(Memoni)代替操作码，用地址符号(Symbol)或标号(Label)代替地址码。这样用符号代替机器语言的二进制码，就把机器语言变成了汇编语言。因此汇编语言亦称为符号语言。</p>
<p>汇编</p>
<p>使用汇编语言编写的程序，机器不能直接识别，要由一种程序将汇编语言翻译成机器语言，这种起翻译作用的程序叫汇编程序，汇编程序是系统软件中语言处理系统软件。汇编语言编译器把汇编程序翻译成机器语言的过程称为汇编。</p>
<p>不能通用</p>
<p>汇编语言比机器语言易于读写、调试和修改，同时具有机器语言全部优点。但在编写复杂程序时，相对高级语言代码量较大，而且汇编语言依赖于具体的处理器体系结构，不能通用，因此不能直接在不同处理器体系结构之间移植。</p>
<p>汇编语言是—种编程语言</p>
<p>计算机语言从低级到高级可以分为:</p>
<p>机器语言，即由0、1组成的机器硬件可以识别的语言;低级语言，即汇编语言</p>
<p>中级语言，如C语言</p>
<p>高级语言，如C++,JAVA,C#等。</p>
<p>汇编语言是将由0、1组成的机器语言用具有简单语义的英文代码表示，以便于理解和程序员编程。汇编语言通常用于对硬件的直接操控。由于汇编语言编写的程序很小，所以通常在程序中最核心的、控制硬件的代码可以采用汇编语言编写，—方面是安全，另一方面提高运行速度。</p>
<p>对于计算机的初学者，应该从中高级语言学起，如c语言，vbjava等，如果你是想要学习如何编程，学习一到两门高级语言已经够用了。</p>
<p>如果你已经掌握了基本的编程技能，最好是可以学习数据结构和操作系统以及计算机硬件的基本工作原理，以便优化你编写的程序，提高安全性和运行效率。</p>
<p>如果你想要从事更高级的开发工作，则可能需要学习汇编语言。</p>
<p>在高校中，计算机科技专业的学生汇编语言是必修课，而软件工程专业的学生则对汇编语言不做要求。至于汇编与编程的区别是显而易见的，汇编语言是一种用于编写某些程序的语言。而编程则是程序员用某种语言编写程序的过程。</p>
<h1>发展历程</h1>
<h2 id="a-e1c3fafa">编程语言</h2>
<p>自从1946年世界上第一台电子计算机问世，人类和机器的交流方式和语言就成为了软件工程师和计算机从业者的主要研究方向，更有效更简便的编程语言成为了软件工程师的新宠儿，伴随着计算机的飞速发展，计算机的硬件升级速度也越来越快，对编程语言的要求也日益严格。在过去的几十年，编程语言有了长足的发展，至今已经有四代语言问世。大量的编程语言为了满足不同领域的编程要求和软件功能，经历 了被修改，被取代，被发展等过程，最终发展成了现在编程语言的多样化。尽管人们多次试图寻找一个能够适应所有编程环境的通用语言，但 是却没有一次成功。程序设计语言正在与现代科技日益飞跃，人类的智慧在日益彰显。</p>
<h2 id="a-d42c1e2b">机器语言</h2>
<p>计算机的硬件作为一种电路元件，它的输出和输入只能是有电或者没电，也就是所说的高电平和低电平，所以计算机传递的数据是由“0” 和“1”组成的二进制数，所以说二进制的语言是计算机语言的本质。计算机发明之初，人们为了去控制计算机完成自己的任务或者项目，只能去编写“0”、“ 1”这样的二进制数字串去控制电脑，其实就是控制计算机硬件的高低电平或通路开路，这种语言就是机器语言。直观上看，机器语言十分晦涩难懂，其中的含义往往要通过查表或者手册才能理解， 使用的时候非常痛苦，尤其当你需要修改已经完成的程序时，这种看起来无序的机器语言会让你无从下手，也很难找到程序的错误。而且，不同计算机的运行环境不同，指令方式操作方式也不尽相同，所以当你在这种机器语言就有了特定性，只能在特定的计算机上执行，而一旦换了机器就需要重新编程，这极大的降低了程序的使用和推广效率。但由于机器语言具有特定性，完美适配特定型号的计算机，故而运行效率远远高过其他语言。机器语言，也就是第一代编程语言。</p>
<h2 id="a-037ce18a">汇编语言</h2>
<p>不难看出机器语言作为一种编程语言， 灵活性较差可阅读性也很差，为了减轻机器语言带给软件工程师的不适应，人们对机器语言进行了升级和改进：用一些容易理解和记忆的字母，单词来代替一个特定的指令。通过这种方法，人们很容易去阅读 已经完成的程序或者理解程序正在执行的功能，对现有程序的bug修复以及运营维护都变得更加简单方便，这种语言就是我们所说的汇编语言， 即第二代计算机语言。</p>
<p>比起机器语言，汇编语言具有更高的机器相关性，更加便于记忆和书写，但又同时保留了机器语言高速度和高效率的特点。汇编语言仍是面向机器的语言，很难从其代码上理解程序设计意图，设计出来的程序不易被移植，故不像其他大多数的高级计算机语言一样被广泛应用。所以在高级语言高度发展的今天，它通常被用在底层，通常是程序优化或硬件操作的场合。</p>
<h2 id="a-a84eec68">高级语言</h2>
<p>在编程语言经历了机器语言，汇编语言等更新之后，人们发现了限制程序推广的关键因素——程序的可移植性。需要设计一个能够不依赖于计算机硬件，能够在不同机器上运行的程序。这样可以免去很多编程的重复过程，提高效率，同时这种语言又要接近于数学语言或人的自然语言。在计算机还很稀缺的50年代，诞生了第一个高级编程语言。当时计算机的造价不菲，但是每天的计算量又有限，如何有效的利用计算机有限的计算能力成为了当时人们面对的问题。同时，因为资源的稀缺， 计算机的运行效率也成为了那个年代工程师追寻的目标。为了更高效的使用计算机，人们设计出了高级编程语言，来满足人们对于高效简洁的编程语言的追求。</p>
<h1>特点</h1>
<p>汇编语言是直接面向处理器（Processor）的程序设计语言。处理器是在指令的控制下工作的，处理器可以识别的每一条指令称为机器指令。每一种处理器都有自己可以识别的一整套指令，称为指令集。处理器执行指令时，根据不同的指令采取不同的动作，完成不同的功能，既可以改变自己内部的工作状态，也能控制其它外围电路的工作状态。</p>
<p>在电路中，每条机器指令都表现为一组电信号，通过一排导线进入处理器。这些电信号有的呈高电平，有的呈低电平，哪些为高，哪些为低，取决于不同的机器指令。如果把高电平记为“1”，低电平记为“0”，那么，不同的机器指令将表现为不同的二进制序列，由于它们的无规律性，这就使得机器指令难以理解、书写和记忆。</p>
<p>人类最容易接受自己每天都使用的自然语言。为了使机器指令的书写和理解变得容易，需要借鉴自然语言的优点，为此就引入了汇编语言。汇编语言使用符号来代表不同的机器指令，而这些符号非常接近于自然语言的要素。基本上，汇编语言里的每一条指令，都对应着处理器的一条机器指令。</p>
<p>汇编语言包括两个部分：语法部分和汇编器。语法部分提供与机器指令相对应的助记符，方便指令的书写和阅读。当然，汇编语言的符号可以被人类接受，但不能被处理器识别，为此，还要由汇编语言编译器将这些助记符转换成机器指令。</p>
<p>根据应用领域的不同，处理器的种类繁多，比如用于工业控制和嵌入式计算的Z80、MC68000和MCS-51、广泛应用于个人计算机的INTELx86系列，以及基于ARM体系结构的处理器，包括苹果公司在内的大企业都是ARM的客户。事实上，今天的ARM是最受欢迎的32位嵌入式处理器，而且，今天的ARM处理器比INTEL奔腾系列卖得还多，基本上是3:1的比例。</p>
<p>不同的处理器有不同的指令集。正是因为这个原因，每一种处理器都会有自己专属的汇编语言语法规则和编译器。即使是同一种类型的处理器，也可能拥有不同的汇编语言编译器。一个明显的例子是INTELx86系列的处理器，围绕它就开发出好多种编译器来，如MASM、NASM、FASM、TASM、GAS和AT&amp;T等。而且，每一种编译器，都使用不同的语法。</p>
<h1>优点与缺点</h1>
<h2 id="a-9a816614">优点</h2>
<p>汇编语言直接同计算机的底层软件甚至硬件进行交互，它具有如下一些优点：</p>
<p>（1）能够直接访问与硬件相关的存储器或I/O端口；</p>
<p>（2）能够不受编译器的限制，对生成的二进制代码进行完全的控制；</p>
<p>（3）能够对关键代码进行更准确的控制，避免因线程共同访问或者硬件设备共享引起的死锁；</p>
<p>（4）能够根据特定的应用对代码做最佳的优化，提高运行速度；</p>
<p>（5）能够最大限度地发挥硬件的功能。</p>
<p>（6）汇编语言用来编制系统软件和过程控制软件，其目标程序占用内存空间少，运行速度快，有着高级语言不可替代的用途。</p>
<h2 id="a-91bcf63e">缺点</h2>
<p>同时还应该认识到，汇编语言是一种层次非常低的语言，它仅仅高于直接手工编写二进制的机器指令码，因此不可避免地存在一些缺点：</p>
<p>（1）编写的代码非常难懂，不好维护；</p>
<p>（2）很容易产生bug，难于调试；</p>
<p>（3）只能针对特定的体系结构和处理器进行优化；</p>
<p>（4）开发效率很低，时间长且单调。</p>
<p>（5）汇编语言像机器指令一样，是硬件操作的控制信息，因而仍然是面向机器的语言，使用起来还是比较繁琐费时，通用性也差。</p>
<h1>应用</h1>
<p>历史上，汇编语言曾经是非常流行的程序设计语言之一。随着软件规模的增长，以及随之而来的对软件开发进度和效率的要求，高级语言逐渐取代了汇编语言。但即便如此，高级语言也不可能完全替代汇编语言的作用。就拿Linux内核来讲，虽然绝大部分代码是用C语言编写的，但仍然不可避免地在某些关键地方使用了汇编代码。由于这部分代码与硬件的关系非常密切，即使是C语言也会显得力不从心，而汇编语言则能够很好扬长避短，最大限度地发挥硬件的性能。</p>
<p>首先，汇编语言的大部分语句直接对应着机器指令，执行速度快，效率高，代码体积小，在那些存储器容量有限，但需要快速和实时响应的场合比较有用，比如仪器仪表和工业控制设备中。</p>
<p>其次，在系统程序的核心部分，以及与系统硬件频繁打交道的部分，可以使用汇编语言。比如操作系统的核心程序段、I/O接口电路的初始化程序、外部设备的低层驱动程序，以及频繁调用的子程序、动态连接库、某些高级绘图程序、视频游戏程序等等。</p>
<p>再次，汇编语言可以用于软件的加密和解密、计算机病毒的分析和防治，以及程序的调试和错误分析等各个方面。</p>
<p>最后，通过学习汇编语言，能够加深对计算机原理和操作系统等课程的理解。通过学习和使用汇编语言，能够感知、体会和理解机器的逻辑功能，向上为理解各种软件系统的原理，打下技术理论基础；向下为掌握硬件系统的原理，打下实践应用基础。</p>
<h1>Linux汇编语言</h1>
<h2 id="a-b9cf33b3">汇编代码</h2>
<p>作为最基本的编程语言之一，汇编语言虽然应用的范围不算很广，但重要性却勿庸置疑，因为它能够完成许多其它语言所无法完成的功能。就拿Linux内核来讲，虽然绝大部分代码是用C语言编写的，但仍然不可避免地在某些关键地方使用了汇编代码，其中主要是在Linux的启动部分。由于这部分代码与硬件的关系非常密切，即使是C语言也会有些力不从心，而汇编语言则能够很好扬长避短，最大限度地发挥硬件的性能。</p>
<h2 id="a-9a41e6fd">Linux程序员</h2>
<p>大多数情况下Linux程序员不需要使用汇编语言，因为即便是硬件驱动这样的底层程序在Linux操作系统中也可以用完全用C语言来实现，再加上GCC这一优秀的编译器目前已经能够对最终生成的代码进行很好的优化，的确有足够的理由让我们可以暂时将汇编语言抛在一边了。但实现情况是Linux程序员有时还是需要使用汇编，或者不得不使用汇编，理由很简单：精简、高效和libc无关性。假设要移Linux到某一特定的嵌入式硬件环境下，首先必然面临如何减少系统大小、提高执行效率等问题，此时或许只有汇编语言能帮上忙了。</p>
<h2 id="a-ac9d79ec">优点</h2>
<p>汇编语言直接同计算机的底层软件甚至硬件进行交互，它具有如下一些优点：</p>
</p>
<p>能够直接访问与硬件相关的存储器或I/O端口；</p>
</p>
<p>能够不受编译器的限制，对生成的二进制代码进行完全的控制；</p>
</p>
<p>能够对关键代码进行更准确的控制，避免因线程共同访问或者硬件设备共享引起的死锁；</p>
</p>
<p>能够根据特定的应用对代码做最佳的优化，提高运行速度；</p>
</p>
<p>能够最大限度地发挥硬件的功能。</p>
</p>
<h2 id="a-1bb5682d">缺点</h2>
<p>同时还应该认识到，汇编语言是一种层次非常低的语言，它仅仅高于直接手工编写二进制的机器指令码，因此不可避免地存在一些缺点：</p>
<p>•编写的代码非常难懂，不好维护；</p>
<p>•很容易产生bug，难于调试；</p>
<p>•只能针对特定的体系结构和处理器进行优化；</p>
<p>•开发效率很低，时间长且单调。</p>
<p>两种不同的形式</p>
<p>Linux下用汇编语言编写的代码具有两种不同的形式。第一种是完全的汇编代码，指的是整个程序全部用汇编语言编写。尽管是完全的汇编代码，Linux平台下的汇编工具也吸收了C语言的长处，使得程序员可以使用#include、#ifdef等预处理指令，并能够通过宏定义来简化代码。第二种是内嵌的汇编代码，指的是可以嵌入到C语言程序中的汇编代码片段。虽然ANSI的C语言标准中没有关于内嵌汇编代码的相应规定，但各种实际使用的C编译器都做了这方面的扩充，这其中当然就包括Linux平台下的GCC。</p>
<h1>应用举例</h1>
<h2 id="a-1b501786">用汇编语言实现RESET启动和热启动</h2>
<p>程序名:RESET.ASM/BOOT.ASM程序类别:完整的汇编语言程序</p>
<p>功能:用程序完成RESET启动和热启动</p>
<p>使用说明:汇编连接以后转换为com文件运行</p>
<p>程序说明:</p>
<p>在日常用机过程中,如果出现了异常情况常常需要重新启动系统。对于IBMPC以及其兼容机,除了开机冷启动外,还有热启动和RESET开关复位启动,他们的共同特点是转入BIOS的入口点(即ROM的起始单元FFFF:0处),执行该处的跳转指令,转向启动程序,该启动程序在执行过程中需检测复位标志字(在地址0040:0072处,占2个字节)的值,若为1234则启动是不检测内存；若非1234则启动先检测内存,再启动系统。热启动和RESET启动的不同之处在于热启动时不检测内存,而RESET启动是需要检测内存。</p>
<p>下面的俩个程序分别实现RESET启动和热启动。经过汇编，连接再转换成文件后才能运行。</p>
<p>RESET.ASMRESET开关复位启动程序)</p>
<p>BOOT.ASM(热启动程序)</p>
<h1>编译环境</h1>
<p>用汇编语言等非机器语言书写好的符号程序称为源程序，汇编语言编译器的作用是将源程序翻译成目标程序。目标程序是机器语言程序，当它被安置在内存的预定位置上后，就能被计算机的CPU处理和执行。</p>
<p>汇编的调试环境总的来说比较少，也很少有非常好的编译器。编译器的选择依赖于目标处理器的类型和具体的系统平台。一般来说，功能良好的编译器用起来应当非常方便，比如，应当可以自动整理格式、语法高亮显示，集编译、链接和调试为一体，方便实用。</p>
<p>对于广泛使用的个人计算机来说，可以自由选择的汇编语言编译器有MASM、NASM、TASM、GAS、FASM、RADASM等，但大都不具备调试功能。如果是为了学习汇编语言，轻松汇编因为拥有一个完善的集成环境，是一款非常适合初学者的汇编编译器。</p>
<h1>处理器指令集</h1>
<h2 id="a-1933c233">数据传送指令</h2>
<p>这部分指令包括通用数据传送指令MOV、条件传送指令CMOVcc、堆栈操作指令PUSH/PUSHA/PUSHAD/POP/POPA/POPAD、交换指令XCHG/XLAT/BSWAP、地址或段描述符选择子传送指令LEA/LDS/LES/LFS/LGS/LSS等。注意，CMOVcc不是一条具体的指令，而是一个指令簇，包括大量的指令，用于根据EFLAGS寄存器的某些位状态来决定是否执行指定的传送操作。</p>
<h2 id="a-87fb2486">整数和逻辑运算指令</h2>
<p>这部分指令用于执行算术和逻辑运算，包括加法指令ADD/ADC、减法指令SUB/SBB、加一指令INC、减一指令DEC、比较操作指令CMP、乘法指令MUL/IMUL、除法指令DIV/IDIV、符号扩展指令CBW/CWDE/CDQE、十进制调整指令DAA/DAS/AAA/AAS、逻辑运算指令NOT/AND/OR/XOR/TEST等。</p>
<h2 id="a-92767f32">移位指令</h2>
<p>这部分指令用于将寄存器或内存操作数移动指定的次数。包括逻辑左移指令SHL、逻辑右移指令SHR、算术左移指令SAL、算术右移指令SAR、循环左移指令ROL、循环右移指令ROR等。</p>
<h2 id="a-186e518e">位操作指令</h2>
<p>这部分指令包括位测试指令BT、位测试并置位指令BTS、位测试并复位指令BTR、位测试并取反指令BTC、位向前扫描指令BSF、位向后扫描指令BSR等。</p>
<h2 id="a-8a34f52c">条件设置指令</h2>
<p>这不是一条具体的指令，而是一个指令簇，包括大约30条指令，用于根据EFLAGS寄存器的某些位状态来设置一个8位的寄存器或者内存操作数。比如SETE/SETNE/SETGE等等。</p>
<h2 id="a-fc1421b8">控制转移指令</h2>
<p>这部分包括无条件转移指令JMP、条件转移指令Jcc/JCXZ、循环指令LOOP/LOOPE/LOOPNE、过程调用指令CALL、子过程返回指令RET、中断指令INTn、INT3、INTO、IRET等。注意，Jcc是一个指令簇，包含了很多指令，用于根据EFLAGS寄存器的某些位状态来决定是否转移；INTn是软中断指令，n可以是0到255之间的数，用于指示中断向量号。</p>
<h2 id="a-c88f832d">串操作指令</h2>
<p>这部分指令用于对数据串进行操作，包括串传送指令MOVS、串比较指令CMPS、串扫描指令SCANS、串加载指令LODS、串保存指令STOS，这些指令可以有选择地使用REP/REPE/REPZ/REPNE和REPNZ的前缀以连续操作。</p>
<h2 id="a-59da86da">输入输出指令</h2>
<p>这部分指令用于同外围设备交换数据，包括端口输入指令IN/INS、端口输出指令OUT/OUTS。</p>
<h2 id="a-3025cc98">高级语言辅助指令</h2>
<p>这部分指令为高级语言的编译器提供方便，包括创建栈帧的指令ENTER和释放栈帧的指令LEAVE。</p>
<h2 id="a-8a0cc50f">控制和特权指令</h2>
<p>这部分包括无操作指令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等。</p>
<p>浮点和多媒体指令</p>
<p>这部分指令用于加速浮点数据的运算，以及用于加速多媒体数据处理的单指令多数据(SIMD及其扩展SSEx)指令。这部分指令数据非常庞大，无法一一列举，请自行参考INTEL手册。</p>
<h2 id="a-29cd6a16">虚拟机扩展指令</h2>
<p>这部分指令包括INVEPT/INVVPID/VMCALL/VMCLEAR/VMLAUNCH/VMRESUME/VMPTRLD/VMPTRST/VMREAD/VMWRITE/VMXOFF/VMON等。</p>
<h1>汇编语言的概念</h1>
<p>汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。汇编语言的实质和机器语言是相同的，都是直接对硬件操作，只不过指令采用了英文缩写的标识符，更容易识别和记忆。/n/n汇编语言是计算机提供给用户的执行效率极高、功能极强的一种程序设计语言,它能够直接控制计算机硬件,并最大限度地发挥硬件的能力。对程序的执行时间和占用空间要求很高的场合,须使用汇编语言才能满足要求。汇编语言还可以与高级语言混合编程,但由于编写和调试汇编语言程序要比高级语言复杂,因此其应用不如高级语言广泛。</p>
<h1>汇编语言的特点</h1>
<p>1.面向机器的低级语言，通常是为特定的计算机或系列计算机专门设计的。/n/n2.保持了机器语言的优点，具有直接和简捷的特点。/n/n3.可有效地访问、控制计算机的各种硬件设备。/n/n4.目标代码简短，占用内存少，执行速度快，是高效的程序设计语言。/n/n5.经常与高级语言配合使用，应用十分广泛。汇编语言的概念</p>
<p>汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。汇编语言的实质和机器语言是相同的，都是直接对硬件操作，只不过指令采用了英文缩写的标识符，更容易识别和记忆。/n/n汇编语言是计算机提供给用户的执行效率极高、功能极强的一种程序设计语言,它能够直接控制计算机硬件,并最大限度地发挥硬件的能力。对程序的执行时间和占用空间要求很高的场合,须使用汇编语言才能满足要求。汇编语言还可以与高级语言混合编程,但由于编写和调试汇编语言程序要比高级语言复杂,因此其应用不如高级语言广泛。/n</p>
<h1>汇编语言源程序的组成原则</h1>
<ol style="list-style-type:decimal">
<li>
<div>完整的汇编语言源程序由段组成。一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段，段与段之间的顺序可随意排列。/n</div>
</li>
<li>
<div>需要独立运行的程序必须包含一个代码段，并指示程序执行的起始点，一个程序只有一个起始点。/n</div>
</li>
<li>
<div>所有的可执行性语句必须位于某一个代码段内，说明性语句可根据需要位于任一段内。</div>
</li>
</ol>
<h1>对比高级语言</h1>
<h2 id="a-0b7b3a5e">区别</h2>
<p>汇编语言的特点是容易被计算机识别和执行，使用它进行编程可以减少占用空间、提高运行速度，并能直接对硬件实施控制。在需要实时控制的时候，有着不可替代的重要地位，但汇编语言在编程和理解时要复杂、困难一些，尤其是在进行数据处理或是逻辑运算时更加凸显出其劣势。</p>
<p>高级语言是面向使用者的语言，能更准确地被程序员所理解，它的表达能力强，功能多，编程效率高，上手速度快， 自动化程度高，因而更受欢迎。在大部分软件开发中，使用者都采用高级语言编程，以提高编程效率。但在要求存储空间小，执行速度快，需直接对硬件进行控制的场合，则应用汇编语言编程，以达到优化程序速度的目的。</p>
<h2 id="a-ad5c46e9">联系</h2>
<p>这样两种看似差别很大的语言，它们之间又有着紧密的联系。在一些程序设计当中，如果把两者结合起来使用，将两种语言的优势同时发挥出来，则可以解决很多特性难题。 在许多程序的设计当中，高级语言和汇编语言可以相互交叉调用，进行参数传递，共享数据信息，这便是所谓的混合编程。程序员往往在高级语言程序中直接嵌入汇编语句，以实现对硬件直接进行控制的功能，这是混合编程中常见的做法。也可以在高级语言程序中使用汇编语言中定义的变量和常量，或使用内部函数对汇编语句进行调用。 简而言之，这类混合编程的方法可以让高级语言与汇编语言互相取长补短，各自发挥各自优势，同时减少各自缺点所带来的不便，善用这个方法可以使开发和编程工作达到事半功倍的效果。</p>
<h1>相关技术</h1>
<h2 id="a-9909cf95">汇编器</h2>
<p>典型的现代汇编器（Assembler）建造目标代码，由解译组语指令集的易记码（Mnemonics）到操作码（OpCode），并解析符号名称（Symbolic Names）成为存储器地址以及其它的实体。使用符号参考是汇编器的一个重要特征，它可以节省修改程序后人工转址的乏味耗时计算。基本就是把机器码变成一些字母而已，编译的时候再把输入的指令字母替换成为晦涩难懂机器码。</p>
<h2 id="a-d91050e0">编译环境</h2>
<p>用汇编语言等非机器语言书写好的符号程序称为源程序，汇编语言编译器的作用是将源程序翻译成目标程序。目标程序是机器语言程序，当它被安置在内存的预定位置上后，就能被计算机的CPU处理和执行。</p>
<p>汇编的调试环境总的来说比较少，也很少有非常好的编译器。编译器的选择依赖于目标处理器的类型和具体的系统平台。一般来说，功能良好的编译器用起来应当非常方便，比如，应当可以自动整理格式、语法高亮显示，集编译、链接和调试为一体，方便实用。</p>
<p>对于广泛使用的个人计算机来说，可以自由选择的汇编语言编译器有MASM、NASM、TASM、GAS、FASM、RADASM等，但大都不具备调试功能。如果是为了学习汇编语言，轻松汇编因为拥有一个完善的集成环境，是一款非常适合初学者的汇编编译器。</p>
<h1>发展前景</h1>
<p>汇编语言是机器语言的助记符，相对于比枯燥的机器代码易于读写、易于调试和修改，同时优秀的汇编语言设计者经过巧妙的设计，使得汇编语言汇编后的代码比高级语言执行速度更快，占内存空间少等优点，但汇编语言的运行速度和空间占用是针对高级语言并且需要巧妙设计，而且部分高级语言在编译后代码执行效率同样很高，所以此优点慢慢弱化。而且在编写复杂程序时具有明显的局限性，汇编语言依赖于具体的机型，不能通用，也不能在不同机型之间移植。常说汇编语言是低级语言，并不是说汇编语言要被弃之，相反，汇编语言仍然是计算机（或微机）底层设计程序员必须了解的语言，在某些行业与领域，汇编是必不可少的，非它不可适用。只是，现在计算机最大的领域为IT软件，也是我们常说的计算机应用软件编程，在熟练的程序员手里，使用汇编语言编写的程序，运行效率与性能比其它语言写的程序相对提高，但是代价是需要更长的时间来优化，如果对计算机原理及编程基础不扎实，反而增加其开发难度，实在是得不偿失，对比2010年前后的软件开发，已经是市场化的软件行业，加上高级语言的优秀与跨平台，一个公司不可以让一个团队使用汇编语言来编写所有的东西，花上几倍甚至几十倍的时间，不如使用其它语言来完成，只要最终结果不比汇编语言编写的差太多，就能抢先一步完成，这是市场经济下的必然结果。</p>
<p>但是，迄今为止，还没有程序员敢断定汇编语言是不需要学的，同时，汇编语言(Assembly Language)是面向机器的程序设计语言，设计精湛的汇编程序员，部分已经脱离软件开发，挤身于工业电子编程中。对于功能相对小巧但硬件对语言设计要求苛刻的行业，如4位单片机，由于其容量及运算，此行业的电子工程师一般负责从开发设计电路及软件控制，主要开发语言就是汇编，c语言使用只占极少部分，而电子开发工程师是千金难求，在一些工业公司，一个核心的电子工程师比其它任何职员待遇都高，对比起来，一般电子工程师待遇是程序员的十倍以上。这种情况是因为21世纪以来，学习汇编的人虽然也不少，但是真正能学到精通的却不多，它相对于高级语言难学，难用，适用范围小，虽然简单，但是过于灵活，学习过高级语言的人去学习汇编比一开始学汇编的人难得多，但是学过汇编的人学习高级语言却很容易，简从繁易，繁从简难。对于一个全面了解微机原理的程序员，汇编语言是必修语言。</p>
</p>
<h1>经典教材</h1>
<p>汇编语言教材很多，各种处理器都有涉及，粗略统计不下百种。在这么多的教材里，用得较多的可以分类列举如下：</p>
<h2 id="a-b6d15dfb">x86处理器</h2>
<div></div>
<p>1.《x86汇编语言：从实模式到保护模式》，李忠著，电子工业出版社，2013－1。</p>
<p>基于INTELx86处理器、NASM编译器和BOCHS虚拟机。汇编语言就是处理器的语言，从这个意义上来说，既然学习汇编语言，就必须直接面向硬件编程，而不是使用莫名其妙的DOS中断和API调用。这是一本有趣的书，它没有把篇幅花在计算一些枯燥的数学题上。相反，它教你如何直接控制硬件，在不借助于BIOS、DOS、Windows、Linux或者任何其他软件支持的情况下来显示字符、读取硬盘数据、控制其他硬件等。</p>
<p>我们知道，32位和64位是主流，实模式和DOS操作系统已经成为历史，Linux和Windows都工作在保护模式下。这本书从实模式讲到32位保护模式，尤其以32位保护模式为重点，阅读本书，对理解现代计算机和现代操作系统的工作原理有非常大的帮助作用。</p>
<p>2.《汇编语言》（第2版），王爽著，清华大学出版社，2008-4-1</p>
<p>基于INTEL8086处理器、MASM编译器，以及DOS平台的汇编教材，完全以8086处理器的实模式为主，不涉及常用的32位和64位模式，但因为通俗易懂，读者反映很好。</p>
<p>3.《80X86汇编语言程序设计教程》，杨季文等编著，清华大学出版社，1999-3-1</p>
<p>基于INTELx86处理器、MASM和TASM编译器，包含16位实模式和32位保护模式的内容，而且对后者讲述较为详细。</p>
<p>4.《32位汇编语言程序设计》，钱晓捷编著，机械工业出版社，2011-8-1</p>
<p>基于INTELx86处理器、MASM编译器，以及WINDOWS平台的汇编教材。</p>
<p>5.《16/32位微机原理汇编语言及接口技术》，钱晓捷，陈涛编著，机械工业出版社，2005-2-1</p>
<p>基于INTELx86处理器，论述16位微型计算机的基本原理、汇编语言和接口技术，并引出32位微机系统相关技术。</p>
<p>6.《Intel汇编语言程序设计》（第五版），（美）欧文著，电子工业出版社，2012-7-1</p>
<p>基于INTELx86处理器、MASM编译器，以及DOS/WINDOWS平台的汇编教材，既有16位实模式的内容，也有32位保护模式的内容。</p>
<p>7.《汇编语言的编程艺术》（第2版），（美）海德著，清华大学出版社，2011-12-1</p>
<p>基于INTELx86处理器，使用了作者自制的高级语言汇编器(HighLevelAssembler，HLA)作为教学工具，以部分地获得高级语言的优势和功能。</p>
<p>8.《x86PC汇编语言、设计与接口》（第五版），（美）马兹迪，考西著，电子工业出版社，2011-1-1</p>
<p>基于INTELx86处理器，既讲了16位实模式的内容，也讲了32位保护模式的内容，对64位也有所介绍。</p>
<h2 id="a-c6da3111">ARM及单片机</h2>
<p>1.《汇编语言程序设计&#8211;基于ARM体系结构》(第2版)，文全刚等主编，北京航空航天大学出版社，2010-8-1</p>
<p>基于ARM体系结构的处理器，是学习嵌入式技术的入门教材。</p>
<p>2.《零基础学AVR单片机》，徐益民等编著，机械工业出版社，2011-1-1</p>
<p>单片机概述、avr单片机的开发工具、avr单片机c语言、atmega16单片机基本结构、avr的指令系统与汇编系统等。</p>
<p>3.《基于Multisim10的51单片机仿真实战教程》，聂典，丁伟主编，电子工业出版社，2010-2-1</p>
<p>阐述了NI Multisim10在单片机仿真中的各项主要功能。</p>
<p>4.《PIC18微控制器：体系结构、编程与接口设计》，（美）贝里著，清华大学出版社，2009-4-1</p>
<p>微控制器广泛应用于汽车、家电、工业控制、医疗设备等众多领域。本书以Microchip公司的PIC18系列微控制器为例，全面讲解如何使用C语言和汇编语言对微控制器进行编程。</p>
<p>5.《CASL汇编语言程序设计》，赵立辉编著，中国电力出版社，2002-10-1</p>
<p>CASL汇编语言是中国计算机软件专业技术资格和水平考试高级程序员级的必考内容。本书是讲述CASL汇编语言程序设计的专著。</p>
</article>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.aitaocui.cn/article/328727.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
