汇编语言是一种
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/14 21:42:41 体裁作文
篇一:汇编语言基础知识
第1章 汇编语言基础知识
汇编语言是直接在硬件之上工作的编程语言,首先要了解硬件系统的结构,才能有效地应用汇编语言对其编程,因此,本章对硬件系统结构的问题进行部分探讨,首先介绍了计算机的基本结构、Intel公司微处理器的发展、计算机的语言以及汇编语言的特点,在此基础上重点介绍寄存器、内存组织等汇编语言所涉及到的基本知识。
汇编语言是直接在硬件之上工作的编程语言,首先要了解硬件系统的结构,才能有效地应用汇编语言对其编程,因此,本章对硬件系统结构的问题进行部分探讨,首先介绍了计算机的基本结构、Intel公司微处理器的发展、计算机的语言以及汇编语言的特点,在此基础上重点介绍寄存器、内存组织等汇编语言所涉及到的基本知识。
1.1 微型计算机概述
微型计算机由中央处理器(Central Processing Unit,CPU)、存储器、输入输出接口电路和总线构成。CPU如同微型计算机的心脏,它的性能决定了整个微型计算机的各项关键指标。存储器包括随机存储器(Random Access Memory,RAM)和只读存储器(Read Only Memory,ROM)。输入输出接口电路用来连接外部设备和微型计算机。总线为CPU和其他部件之间提供数据、地址和控制信息的传输通道。如图1.1所示为微型计算机的基本 结构。
图1.1 微型计算机基本结构
特别要提到的是微型计算机的总线结构,它使系统中各功能部件之间的相互关系变为各个部件面向总线的单一关系。一个部件只要符合总线结构标准,就可以连接到采用这
汇编语言程序设计
CPU与内存或其他部件之间进行数据传送。它是双向的,数据总线的8位数据总线一次可传送一个8位二进制数据和外界的数据传送速度,(即
数据总线上传送的不一定是真正的数据,而可能是指令代码、状态量或控制量。
地址总线专门用来传送地址信息,它是单向的,地址总线的位数决定了CPU可以直接
N寻址的内存范围。如CPU的地址总线的宽度为N,则CPU最多可以寻找2个内存单元。
控制总线用来传输控制信号,其中包括CPU送往存储器和输入输出接口电路的控制信号,如读信号、写信号和中断响应信号等;也包括其他部件送到CPU的信号,如时钟信号、中断请求信号和准备就绪信号等。
1.2 Intel公司微处理器简介
自20世纪70年代开始出现微型计算机以来,CPU经历了飞速的发展。1971年,Intel设计成功了第一片4位微处理器Intel 4004;随之又设计生产了8位微处理器8008;1973年推出了8080;1974年基于8080的个人计算机(Personal Computer,PC)问世,Microsoft公司的创始人Bill Gates为PC开发了BASIC语言解释程序;1977年Intel推出了8085。自此之后,Intel又陆续推出了8086、80386、Pentium等80x86系列微处理器。各种微处理器的主要区别在于处理速度、寄存器位数、数据总线宽度和地址总线宽度。下面简要介 绍不同时期Intel公司制造的几种主要型号的微处理器,这些微处理器都曾经或正在广为 流行。
1.80x86系列微处理器
1)8088微处理器
具有多个16位的寄存器、8位数据总线和20位地址总线,可以寻址1MB的内存。虽然这些寄存器一次可以处理2个字节,但数据总线一次只能传送1个字节。该处理器只能工作在实模式。
2)8086微处理器
指令系统与8088完全相同,具有多个16位的寄存器、16位数据总线和20位地址总线,可以寻址1MB的内存,一次可以传送2个字节。该处理器只能工作在实模式。
3)80286微处理器
比8086运行更快,具有多个16位的寄存器、16位数据总线和24位地址总线,可以寻址16MB内存。它既可以工作在实模式,也可以工作在保护模式。
4)80386微处理器
具有多个32位的寄存器、32位数据总线和32位地址总线,可以寻址4GB内存。它提供了较高的时钟速度,增加了存储器管理和相应的硬件电路,减少了软件开销,提高了效率。它既可以工作在实模式,也可以工作在保护模式。
5)80486微处理器
具有多个32位的寄存器、32位数据总线和32位地址总线。它比80386增加了数字协处理器和8KB的高速缓存,提高了处理速度。它既可以工作在实模式,也可以工作在保
护模式。
6)Pentium(奔腾)
具有多个32位的寄存器、64位数据总线和36位地址总线。因为它采用了超标量体系结构,所以每个时钟周期允许同时执行两条指令,处理速度得到了进一步提高,性能比80486优越得多。它既可以工作在实模式,也可以工作在保护模式。
以上介绍了Intel80x86系列的一些主要微处理器,表1.1给出了该系列部分微处理器的数据总线和地址总线宽度。实际上80x86系列的功能还在不断改进和增强,它们的速度将会更快,性能将会更优越。但无论怎样变化,它们总会被设计成是完全向下兼容的,就像在8086上设计和运行的软件可以不加任何改变地在Pentium 4机上运行一样。对于汇编语言编程人员来讲,掌握16位计算机的编程十分重要,它是学习高档计算机及保护模式编程的基础,也是掌握实模式程序设计的唯一方法。
2.CPU的主要性能指标
1)机器字长
机器字长和CPU内部寄存器、运算器、内部数据总线的位宽相一致。如8086CPU,它的内部寄存器是16位的、运算器能完成两个16位二进制数的并行运算、数据总线的位宽为16位,则它的机器字长为16位,也称其为16位计算机。通常,机器字长越长,计算机的运算能力越强,其运算精度也越高。
2)速度
CPU的速度是指单位时间内能够执行指令的条数。速度的计算单位不一,若以单字长定点指令的平均执行时间计算,用每秒百万条指令(Million Istructions Per Second,MIPS)作为单位;若以单字长浮点指令的平均执行时间计算,则用每秒百万条浮点运算指令(Million Floating-point Operations Per Second,MFLOPS)表示。现在,采用计算机中各种指令的平均执行时间和相应的指令运行权重的加权平均法求出等效速度作为计算机运算 速度。
3)主频
主频又称为主时钟频率,是指CPU在单位时间内产生的时钟脉冲数,以MHz/s(兆赫兹每秒)为单位。由于计算机中的一切操作都是在时钟控制下完成的,因此,对于机器结构相同或相近的计算机,CPU的时钟频率越高,运算速度越快。
表1.1 Inte l80x86系列微处理器总线宽度
汇编语言程序设计
1.3 计算机语言及汇编语言特点
计算机语言的发展经历了由机器语言、汇编语言到高级语言这样一个由低级到高级的发展过程。
1.机器语言
机器语言是计算机唯一能直接识别和执行的计算机语言。由于计算机硬件本身只能识别二进制代码,在计算机发展的初期,人们使用二进制代码构成机器指令来编写程序,这种二进制编码的计算机语言就是机器语言。机器语言描述的程序称为目标程序,只有目标程序才能被CPU直接执行。指令用于指出计算机所进行的操作和操作对象的代码,一条指令通常由操作码和操作数两部分组成。其中,操作码指出计算机所进行的具体操作,如加法、减法等;操作数说明操作的对象。操作码比较简单,只需对每一种操作指定确定的二进制代码就可以了;操作数比较复杂,首先它可以有一个、两个或三个,分别称为单操作数、双操作数或三操作数,其次,操作数可能存放在不同的地方,既可以存放在寄存器中,也可以存放在存储器中,甚至直接存放在指令中,通常要用寻址方式来说明。
一台计算机全部指令的集合构成该计算机的指令系统。指令系统是计算机基本功能的体现,不同的机器指令对应的二进制代码序列各不相同。机器语言是面向机器的,不同机器之间的语言是不通用的,这也是机器语言是“低级”语言的含义所在。用二进制代码编写程序相当麻烦,写出的程序也难以阅读和调试。
2.汇编语言
早期的程序员们很快就发现了使用机器语言带来的麻烦,它是如此难于辨别和记 忆,给整个产业的发展带来了障碍,于是产生了汇编语言。汇编语言是一种采用指令助记符、符号地址、标号等符号书写程序的语言,它便于人们书写、阅读和检查。汇编语言指令与计算机指令基本上是一一对应的,汇编语言与计算机有着密不可分的关系,处理器不同,汇编语言就不同,因此它是一种低级语言,同时它也是唯一能够充分利用计算机硬件特性并直接控制硬件设备的语言。利用汇编语言进行程序设计体现了计算机硬件和软件的结合。
用汇编语言编写的程序称为汇编源程序(或称汇编语言程序),计算机不能直接识别,必须将其翻译成由计算机指令组成的程序后,CPU才能执行,这一过程称为“汇编”。用于将汇编源程序翻译成计算机语言的程序称为汇编程序,这种由源程序经过计算机翻译转换成的计算机语言程序也称为目标程序。目标程序还不能直接交给CPU执行,它还需要通过连接程序装配成可执行程序才能被执行。连接程序具有将多个目标程序装配在一起的功能,它也可以将目标程序与预先编写好的一些放在子程序库中的子程序连接在一起,构成较大的可执行程序。它们之间的关系如图1.2所示。
图1.2 汇编程序与目标程序、可执行程序之间的关系
3.高级语言
高级语言是一种与具体的计算机硬件无关,独立于计算机类型的通用语言,比较接近人类自然语言的语法,用高级语言编程不必了解和熟悉计算机的指令系统,更容易掌握和使用。高级语言采用接近自然语言的词汇,其程序的通用性强,易学易用,这些语言面向求解问题的过程,不依赖具体计算机。高级语言也要翻译成机器语言才能在计算机上执行。其翻译有两种方式,一种是把高级语言程序翻译成机器语言程序,然后经过连接程序连接成可执行文件,再在计算机上执行,这种翻译方式称为编译方式,大多数高级语言如PASCAL语言、C语言等都是采用这种方式;另一种是直接把高级语言程序在计算机上运行,一边解释一边执行,这种翻译方式称为解释方式,如BASIC语言就采用这种方式。
高级语言源程序是在未考虑计算机结构特点情况下编写的,经过翻译后的目标程序往往不够精练,过于冗长,加大了目标程序的长度,占用较大存储空间,执行时间较长。
1.3.2 汇编语言的特点
汇编语言使用助记符和符号地址,所以它要比机器语言易于掌握,与高级语言相比较,汇编语言有以下特点。
1)汇编语言与计算机关系密切
汇编语言中的指令是机器指令的符号表示,与机器指令是一一对应的,因此它与计算机有着密切的关系,不同类型的CPU有不同的汇编语言,也就有各种不同的汇编程序。汇编语言源程序与高级语言源程序相比,其通用性和可移植性要差得多。
2)汇编语言程序效率高
由于构成汇编语言主体的指令是用机器指令的符号表示的,每一条指令都对应一条机器指令,且汇编语言程序能直接利用计算机硬件系统的许多特性,如它允许程序员利用寄存器、标志位等编程。用汇编语言编写的源程序在编译后得到的目标程序效率高,主要体现在空间效率和时间效率上,即目标程序短、运行速度快这两个方面,在采用相同算法的前提下,任何高级语言程序在这两个方面的效率与汇编语言相比都望尘莫及。
3)特殊的使用场合
汇编语言可以实现高级语言难以胜任甚至不能完成的任务。汇编语言具有直接和简捷的特点,用它编制程序能精确地描述算法,充分发挥计算机硬件的功能。在过程控制、多
篇二:汇编语言基础知识
第1章 汇编语言基础知识
汇编语言是直接在硬件之上工作的编程语言,首先要了解硬件系统的结构,才能有效
地应用汇编语言对其编程,因此,本章对硬件系统结构的问题进行部分探讨,首先介绍了
计算机的基本结构、Intel公司微处理器的发展、计算机的语言以及汇编语言的特点,在此
基础上重点介绍寄存器、内存组织等汇编语言所涉及到的基本知识。
1.1 微型计算机概述
微型计算机由中央处理器(Central Processing Unit,CPU)、存储器、输入输出接口电
路和总线构成。CPU如同微型计算机的心脏,它的性能决定了整个微型计算机的各项关键
指标。存储器包括随机存储器(Random Access Memory,RAM)和只读存储器(Read Only Memory,ROM)。输入输出接口电路用来连接外部设备和微型计算机。总线为CPU和其
他部件之间提供数据、地址和控制信息的传输通道。如图1.1所示为微型计算机的基本 结构。
图1.1 微型计算机基本结构
特别要提到的是微型计算机的总线结构,它使系统中各功能部件之间的相互关系变为
各个部件面向总线的单一关系。一个部件只要符合总线结构标准,就可以连接到采用这种
总线结构的系统中,使系统功能得到扩展。
数据总线用来在CPU与内存或其他部件之间进行数据传送。它是双向的,数据总线的
位宽决定了CPU和外界的数据传送速度,8位数据总线一次可传送一个8位二进制数据(即
一个字节),16位数据总线一次可传送两个字节。在微型计算机中,数据的含义是广义的,数据总线上传送的不一定是真正的数据,而可能是指令代码、状态量或控制量。
汇编语言程序设计
它是单向的,地址总线的位数决定了CPU可以直接
CPU的地址总线的宽度为N,则CPU最多可以寻找2N个内存单元。
其中包括CPU送往存储器和输入输出接口电路的控制信
也包括其他部件送到CPU的信号,如时钟信号、
中断请求信号和准备就绪信号等。
1.2 Intel公司微处理器简介
自20世纪70年代开始出现微型计算机以来,CPU经历了飞速的发展。1971年,Intel
设计成功了第一片4位微处理器Intel 4004;随之又设计生产了8位微处理器8008;1973年推出了8080;1974年基于8080的个人计算机(Personal Computer,PC)问世,Microsoft公司的创始人Bill Gates为PC开发了BASIC语言解释程序;1977年Intel推出了8085。自此之后,Intel又陆续推出了8086、80386、Pentium等80x86系列微处理器。各种微处理
器的主要区别在于处理速度、寄存器位数、数据总线宽度和地址总线宽度。下面简要介 绍不同时期Intel公司制造的几种主要型号的微处理器,这些微处理器都曾经或正在广为 流行。
1.80x86系列微处理器
1)8088微处理器
具有多个16位的寄存器、8位数据总线和20位地址总线,可以寻址1MB的内存。虽
然这些寄存器一次可以处理2个字节,但数据总线一次只能传送1个字节。该处理器只能工作在实模式。
2)8086微处理器
指令系统与8088完全相同,具有多个16位的寄存器、16位数据总线和20位地址总
线,可以寻址1MB的内存,一次可以传送2个字节。该处理器只能工作在实模式。
3)80286微处理器
比8086运行更快,具有多个16位的寄存器、16位数据总线和24位地址总线,可以
寻址16MB内存。它既可以工作在实模式,也可以工作在保护模式。
4)80386微处理器
具有多个32位的寄存器、32位数据总线和32位地址总线,可以寻址4GB内存。它
提供了较高的时钟速度,增加了存储器管理和相应的硬件电路,减少了软件开销,提高了效率。它既可以工作在实模式,也可以工作在保护模式。
5)80486微处理器
具有多个32位的寄存器、32位数据总线和32位地址总线。它比80386增加了数字协
处理器和8KB的高速缓存,提高了处理速度。它既可以工作在实模式,也可以工作在保护模式。
6)Pentium(奔腾)
具有多个32位的寄存器、64位数据总线和36位地址总线。因为它采用了超标量体系
结构,所以每个时钟周期允许同时执行两条指令,处理速度得到了进一步提高,性能比80486优越得多。它既可以工作在实模式,也可以工作在保护模式。
以上介绍了Intel80x86系列的一些主要微处理器,表1.1给出了该系列部分微处理器
的数据总线和地址总线宽度。实际上80x86系列的功能还在不断改进和增强,它们的速度将会更快,性能将会更优越。但无论怎样变化,它们总会被设计成是完全向下兼容的,就像在8086上设计和运行的软件可以不加任何改变地在Pentium 4机上运行一样。对于汇编语言编程人员来讲,掌握16位计算机的编程十分重要,它是学习高档计算机及保护模式编程的基础,也是掌握实模式程序设计的唯一方法。
2.CPU的主要性能指标
1)机器字长
机器字长和CPU内部寄存器、运算器、内部数据总线的位宽相一致。如8086CPU,
它的内部寄存器是16位的、运算器能完成两个16位二进制数的并行运算、数据总线的位宽为16位,则它的机器字长为16位,也称其为16位计算机。通常,机器字长越长,计算机的运算能力越强,其运算精度也越高。
2)速度
CPU的速度是指单位时间内能够执行指令的条数。速度的计算单位不一,若以单字长
定点指令的平均执行时间计算,用每秒百万条指令(Million Istructions Per Second,MIPS)作为单位;若以单字长浮点指令的平均执行时间计算,则用每秒百万条浮点运算指令(Million Floating-point Operations Per Second,MFLOPS)表示。现在,采用计算机中各种
指令的平均执行时间和相应的指令运行权重的加权平均法求出等效速度作为计算机运算 速度。
3)主频
主频又称为主时钟频率,是指CPU在单位时间内产生的时钟脉冲数,以MHz/s(兆赫
兹每秒)为单位。由于计算机中的一切操作都是在时钟控制下完成的,因此,对于机器结构相同或相近的计算机,CPU的时钟频率越高,运算速度越快。
表1.1 Inte l80x86系列微处理器总线宽度
1.3 计算机语言及汇编语言特点
汇编语言程序设计
程序才能被CPU直接执行。指令用于指出计算机所进行的操作和操作对象的代码,一条指令通常由操作码和操作数两部分组成。其中,操作码指出计算机所进行的具体操作,如加法、减法等;操作数说明操作的对象。操作码比较简单,只需对每一种操作指定确定的二进制代码就可以了;操作数比较复杂,首先它可以有一个、两个或三个,分别称为单操作数、双操作数或三操作数,其次,操作数可能存放在不同的地方,既可以存放在寄存器中,也可以存放在存储器中,甚至直接存放在指令中,通常要用寻址方式来说明。
一台计算机全部指令的集合构成该计算机的指令系统。指令系统是计算机基本功能的体现,不同的机器指令对应的二进制代码序列各不相同。机器语言是面向机器的,不同机器之间的语言是不通用的,这也是机器语言是“低级”语言的含义所在。用二进制代码编写程序相当麻烦,写出的程序也难以阅读和调试。
2.汇编语言
早期的程序员们很快就发现了使用机器语言带来的麻烦,它是如此难于辨别和记 忆,给整个产业的发展带来了障碍,于是产生了汇编语言。汇编语言是一种采用指令助记符、符号地址、标号等符号书写程序的语言,它便于人们书写、阅读和检查。汇编语言指令与计算机指令基本上是一一对应的,汇编语言与计算机有着密不可分的关系,处理器不同,汇编语言就不同,因此它是一种低级语言,同时它也是唯一能够充分利用计算机硬件特性并直接控制硬件设备的语言。利用汇编语言进行程序设计体现了计算机硬件和软件的结合。
用汇编语言编写的程序称为汇编源程序(或称汇编语言程序),计算机不能直接识别,必须将其翻译成由计算机指令组成的程序后,CPU才能执行,这一过程称为“汇编”。用于将汇编源程序翻译成计算机语言的程序称为汇编程序,这种由源程序经过计算机翻译转换成的计算机语言程序也称为目标程序。目标程序还不能直接交给CPU执行,它还需要通过连接程序装配成可执行程序才能被执行。连接程序具有将多个目标程序装配在一起的功能,它也可以将目标程序与预先编写好的一些放在子程序库中的子程序连接在一起,构成较大的可执行程序。它们之间的关系如图1.2所示。
图1.2 汇编程序与目标程序、可执行程序之间的关系
3.高级语言
高级语言是一种与具体的计算机硬件无关,独立于计算机类型的通用语言,比较接近
人类自然语言的语法,用高级语言编程不必了解和熟悉计算机的指令系统,更容易掌握和使用。高级语言采用接近自然语言的词汇,其程序的通用性强,易学易用,这些语言面向求解问题的过程,不依赖具体计算机。高级语言也要翻译成机器语言才能在计算机上执行。其翻译有两种方式,一种是把高级语言程序翻译成机器语言程序,然后经过连接程序连接成可执行文件,再在计算机上执行,这种翻译方式称为编译方式,大多数高级语言如PASCAL语言、C语言等都是采用这种方式;另一种是直接把高级语言程序在计算机上运行,一边解释一边执行,这种翻译方式称为解释方式,如BASIC语言就采用这种方式。
高级语言源程序是在未考虑计算机结构特点情况下编写的,经过翻译后的目标程序往往不够精练,过于冗长,加大了目标程序的长度,占用较大存储空间,执行时间较长。
1.3.2 汇编语言的特点
汇编语言使用助记符和符号地址,所以它要比机器语言易于掌握,与高级语言相比较,汇编语言有以下特点。
1)汇编语言与计算机关系密切
汇编语言中的指令是机器指令的符号表示,与机器指令是一一对应的,因此它与计算机有着密切的关系,不同类型的CPU有不同的汇编语言,也就有各种不同的汇编程序。汇编语言源程序与高级语言源程序相比,其通用性和可移植性要差得多。
2)汇编语言程序效率高
由于构成汇编语言主体的指令是用机器指令的符号表示的,每一条指令都对应一条机器指令,且汇编语言程序能直接利用计算机硬件系统的许多特性,如它允许程序员利用寄存器、标志位等编程。用汇编语言编写的源程序在编译后得到的目标程序效率高,主要体现在空间效率和时间效率上,即目标程序短、运行速度快这两个方面,在采用相同算法的前提下,任何高级语言程序在这两个方面的效率与汇编语言相比都望尘莫及。
3)特殊的使用场合
汇编语言可以实现高级语言难以胜任甚至不能完成的任务。汇编语言具有直接和简捷的特点,用它编制程序能精确地描述算法,充分发挥计算机硬件的功能。在过程控制、多媒体接口、设备通信、内存管理、硬件控制等方面的程序设计中,用汇编语言直接方便,执行速度快,效率高。
汇编语言提供了一些模块间相互连接的方法,一个大的任务可以分解成若干模块,将其中执行频率高的模块用汇编语言编写,可以大大提高大型软件的性能。
1.4 程序可见寄存器组
80386(含80386)以上型号的CPU能够处理32位数据,其寄存器长度是32位的,但为了与早期的8086等16位机CPU保持良好的兼容性,80386以上型号的CPU中程序
篇三:汇编语言简介
汇编语言简介 汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。
许多汇编程序为程序开发、汇编控制、辅助调试提供了额外的支持机制。有的汇编语言编程工具经常会提供宏,它们也被称为宏汇编器。
汇编语言不像其他大多数的程序设计语言一样被广泛用于程序设计。在今天的实际应用中,它通常被应用在底层,硬件操作和高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言。
汇编语言特点:
汇编语言是直接面向处理器(Processor)的程序设计语言。处理器是在指令的控制下工作的,处理器可以识别的每一条指令称为机器指令。每一种处理器都有自己可以识别的一整套指令,称为指令集。处理器执行指令时,根据不同的指令采取不同的动作,完成不同的功能,既可以改变自己内部的工作状态,也能控制其它外围电路的工作状态。
汇编语言的另一个特点就是它所操作的对象不是具体的数据,而是寄存器或者存储器,也就是说它是直接和寄存器和存储器打交道,这也是为什么汇编语言的执行速度要比其它语言快,但同时这也使编程更加复杂,因为既然数据是存放在寄存器或存储器中,那么必然就存在着寻址方式,也就是用什么方法找到所需要的数据。例如上面的例子,我们就不能像高级语言一样直接使用数据,而是先要从相应的寄存器AX、BX 中把数据取出。这也就增加了编程的复杂性,因为在高级语言中寻址这部分工作是由编译系统来完成的,而在汇编语言中是由程序员自己来完成的,这无异增加了编程的复杂程度和程序的可读性。
再者,汇编语言指令是机器指令的一种符号表示,而不同类型的CPU 有不同的机器指令系统,也就有不同的汇编语言,所以,汇编语言程序与机器有着密切的关系。所以,除了同系列、不同型号CPU 之间的汇编语言程序有一定程度的可移植性之外,其它不同类型(如:小型机和微机等)CPU 之间的汇编语言程序是无法移植的,也就是说,汇编语言程序的通用性和可移植性要比高级语言程序低。
正因为汇编语言有“与机器相关性”的特性,程序员用汇编语言编写程序时,可充分对机器内部的各种资源进行合理的安排,让它们始终处于最佳的使用状态。这样编写出来的程序执行代码短、执行速度快。汇编语言是各种编程语言中与硬件关系最密切、最直接的一种,在时间和空间的效率上也最高的一种,它是高等院校计算机应用技术必修的专业课程之一,对于训练学生掌握程序设计技术,熟悉上机操作和程序调试技术有重要作用
汇编语言组成:
数据传送指令
这部分指令包括通用数据传送指令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、中断指令INTn、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等。
篇四:[电脑书籍]汇编语言简介与入门
我不想夸大或者贬低汇编语言。但我想说,汇编语言改变了20世纪的历史。与前辈相比,我们这一代编程人员足够的幸福,因为我们有各式各样的编程语言,我们可以操作键盘、坐在显示器面前,甚至使用鼠标、语音识别。我们可以使用键盘、鼠标来驾驭“个人计算机”,而不是和一群人共享一台使用笨重的继电器、开关去操作的巨型机。相比之下,我们的前辈不得不使用机器语言编写程序,他们甚至没有最简单的汇编程序来把助记符翻译成机器语言,而我们可以从上千种计算机语言中选择我们喜欢的一种,而汇编,虽然不是一种“常用”的具有“快速原型开发”能力的语言,却也是我们可以选择的语言中的一种。
每种计算机都有自己的汇编语言——没必要指望汇编语言的可移植性,选择汇编,意味着选择性能而不是可移植或便于调试。这份文档中讲述的是x86汇编语言,此后的“汇编语言”一词,如果不明示则表示ia32上的x86汇编语言。
汇编语言是一种易学,却很难精通的语言。回想当年,我从初学汇编到写出第一个可运行的程序,只用了不到4个小时;然而直到今天,我仍然不敢说自己精通它。编写快速、高效、并且能够让处理器“很舒服地执行”的程序是一件很困难的事情,如果利用业余时间学习,通常需要2-3年的时间才能做到。这份教材并不期待能够教给你大量的汇编语言技巧。对于读者来说,x86汇编语言"就在这里"。然而,不要僵化地局限于这份教材讲述的内容,因为它只能告诉你汇编语言是“这样一回事”。学好汇编语言,更多的要靠一个人的创造力于悟性,我可以告诉你我所知道的技巧,但肯定这是不够的。一位对我的编程生涯产生过重要影响的人曾经对我说过这么一句话:
写汇编语言程序不是汇编语言最难的部分,创新才是。
我想,愿意看这份文档的人恐怕不会问我“为什么要学习汇编语言”这样的问题;不过,我还是想说几句:首先,汇编语言非常有用,我个人主张把它作为C语言的先修课程,因为通过学习汇编语言,你可以了解到如何有效地设计数据结构,让计算机处理得更快,并使用更少的存储空间;同时,学习汇编语言可以让你熟悉计算机内部运行机制,并且,有效地提高调试能力。就我个人的经验而言,调试一个非结构化的程序的困难程度,要比调试一个结构化的程序的难度高很多,因为“结构化”是以牺牲运行效率来提高可读性与可调试性,这对于完成一般软件工程的编码阶段是非常必要的。然而,在一些地方,比如,硬件驱动程序、操作系统底层,或者程序中经常需要执行的代码,结构化程序设计的这些优点有时就会被它的低效率所抹煞。另外,如果你想真正地控制自己的程序,只知道源代码级的调试是远远不够的。
浮躁的人喜欢说,用C++写程序足够了,甚至说,他不仅仅掌握C++,而且精通STL、MFC。我不赞成这个观点,掌握上面的那些是每一个编程人员都应该做到的,然而C++只是我们"常用"的一种语言,它不是编程的全部。低层次的开发者喜欢说,嘿,C++是多么的强大,它可以做任何事情——这不是事实。便于维护、调试,这些确实是我们的追求目标,但是,写程序不能仅仅追求这个目标,因为我们最终的目的是满足设计需求,而不是个人非理性的理想。 这份教材适合已经学习过某种结构化程序设计语言的读者。其内容基于我在1995年给别人讲述汇编语言时所写的讲义。当然,如大家所希望的,它包含了最新的处理器所支持的特性,以及相应的内容。我假定读者已经知道了程序设计的一些基本概念,因为没有这些是无法理解汇编语言程序设计的;此外,我希望读者已经有了比较良好的程序设计基础,因为如果你缺乏对于结构化程序设计的认识,编写汇编语言程序很可能很快就破坏了你的结构化编程习惯,大大降低程序的可读性、可维护性,最终让你的程序陷于不得不废弃的代码堆之中。 基本上,这份文档撰写的目标是尽可能地便于自学。不过,它对你也有一些要求,尽管不是很高,但我还是强调一下。
学习汇编语言,你需要
胆量。不要害怕去接触那些计算机的内部工作机制。
知识。了解计算机常用的数制,特别是二进制、十六进制、八进制,以及计算机保存数据的方法。
开放。接受汇编语言与高级语言的差异,而不是去指责它如何的不好读。
经验。要求你拥有任意其他编程语言的一点点编程经验。
头脑。
祝您编程愉快!
先说一点和实际编程关系不太大的东西。当然,如果你迫切的想看到更实质的内容,完全可以先跳过这一章。
那么,我想可能有一个问题对于初学汇编的人来说非常重要,那就是:
汇编语言到底是什么?
汇编语言是一种最接近计算机核心的编码语言。不同于任何高级语言,汇编语言几乎可以完全和机器语言一一对应。不错,我们可以用机器语言写程序,但现在除了没有汇编程序的那些电脑之外,直接用机器语言写超过1000条以上指令的人大概只能算作那些被我们成为“圣人”的牺牲者一类了。毕竟,记忆一些短小的助记符、由机器去考虑那些琐碎的配位过程和检查错误,比记忆大量的随计算机而改变的十六进制代码、可能弄错而没有任何提示要强的多。熟练的汇编语言编码员甚至可以直接从十六进制代码中读出汇编语言的大致意思。当然,我们有更好的工具——汇编器和反汇编器。
简单地说,汇编语言就是机器语言的一种可以被人读懂的形式,只不过它更容易记忆。至于宏汇编,则是包含了宏支持的汇编语言,这可以让你编程的时候更专注于程序本身,而不是忙于计算和重写代码。
汇编语言除了机器语言之外最接近计算机硬件的编程语言。由于它如此的接近计算机硬件,因此,它可以最大限度地发挥计算机硬件的性能。用汇编语言编写的程序的速度通常要比高级语言和C/C++快很多--几倍,几十倍,甚至成百上千倍。当然,解释语言,如解释型LISP,没有采用JIT技术的Java虚机中运行的Java等等,其程序速度更无法与汇编语言程序同日而语 。
永远不要忽视汇编语言的高速。实际的应用系统中,我们往往会用汇编彻底重写某些经常调用的部分以期获得更高的性能。应用汇编也许不能提高你的程序的稳定性,但至少,如果你非常小心的话,它也不会降低稳定性;与此同时,它可以大大地提高程序的运行速度。我强烈建议所有的软件产品在最后Release之前对整个代码进行Profile,并适当地用汇编取代部分高级语言代码。至少,汇编语言的知识可以告诉你一些有用的东西,比如,你有多少个寄存器可以用。有时,手工的优化比编译器的优化更为有效,而且,你可以完全控制程序的实际行为。
我想我在罗嗦了。总之,在我们结束这一章之前,我想说,不要在优化的时候把希望完全寄托在编译器上——现实一些,再好的编译器也不可能总是产生最优的代码。
当时我学过BASIC, Fortran和Pascal,写的是一个
对一个包含100个32bit整数的数组进行快速排序,并且输出出来的小程序。实际上用汇编器写出的机器码与在调试器中用它附带的汇编程序写出的机器码还是有一些细微差别的,前者更大,然而却可能更高效,因为汇编器能够将代码放置到适合处理器的地方这句话假定两个程序进行了同等程度的优化,一个写的不好的汇编程序和一个写的很好的C程序相比,汇编程序不一定更快。
中央处理器(CPU)在微机系统处于“领导核心”的地位。汇编语言被编译成机器语言之后,将由处理器来执行。那么,首先让我们来了解一下处理器的主要作用,这将帮助你更好地驾驭它。
典型的处理器的主要任务包括
从内存中获取机器语言指令,译码,执行
根据指令代码管理它自己的寄存器
根据指令或自己的的需要修改内存的内容
响应其他硬件的中断请求
一般说来,处理器拥有对整个系统的所有总线的控制权。对于Intel平台而言,处理器拥有对数据、内存和控制总线的控制权,根据指令控制整个计算机的运行。在以后的章节中,我们还将讨论系统中同时存在多个处理器的情况。
处理器中有一些寄存器,这些寄存器可以保存特定长度的数据。某些寄存器中保存的数据对于系统的运行有特殊的意义。
新的处理器往往拥有更多、具有更大字长的寄存器,提供更灵活的取指、寻址方式。 寄存器
如前所述,处理器中有一些可以保存数据的地方被称作寄存器。
寄存器可以被装入数据,你也可以在不同的寄存器之间移动这些数据,或者做类似的事情。基本上,像四则运算、位运算等这些计算操作,都主要是针对寄存器进行的。
首先让我来介绍一下80386上最常用的4个通用寄存器。先瞧瞧下面的图形,试着理解一下: 上图中,数字表示的是位。我们可以看出,EAX是一个32-bit寄存器。同时,它的低16-bit又可以通过AX这个名字来访问;AX又被分为高、低8bit两部分,分别由AH和AL来表示。 对于EAX、AX、AH、AL的改变同时也会影响与被修改的那些寄存器的值。从而事实上只存在一个32-bit的寄存器EAX,而它可以通过4种不同的途径访问。
也许通过名字能够更容易地理解这些寄存器之间的关系。EAX中的E的意思是“扩展的”,整个EAX的意思是扩展的AX。X的意思Intel没有明示,我个人认为表示它是一个可变的量 。而AH、AL中的H和L分别代表高和低 。
为什么要这么做呢?主要由于历史原因。早期的计算机是8位的,8086是第一个16位处理器,其通用寄存器的名字是AX,BX等等;80386是Intel推出的第一款IA-32系列处理器,所有的寄存器都被扩充为32位。为了能够兼容以前的16位应用程序,80386不能将这些寄存器依旧命名为AX、BX,并且简单地将他们扩充为32位——这将增加处理器在处理指令方面的成本。
Intel微处理器的寄存器列表(在本章先只介绍80386的寄存器,MMX寄存器以及其他新一代处理器的新寄存器将在以后的章节介绍)
通用寄存器
下面介绍通用寄存器及其习惯用法。顾名思义,通用寄存器是那些你可以根据自己的意愿使用的寄存器,修改他们的值通常不会对计算机的运行造成很大的影响。通用寄存器最多的用途是计算。
EAX
32-bit宽
通用寄存器。相对其他寄存器,在进行运算方面比
较常用。在保护模式中,也可以作为内存偏移指针(此时,DS作为段 寄存器或选择器)EBX
32-bit宽
通用寄存器。通常作为内存偏移指针使用(相对于EAX、ECX、EDX),DS是默认的段寄存器或选择器。在保护模式中,同样可以起这个作用。
ECX
32-bit宽
通用寄存器。通常用于特定指令的计数。在保护模式中,也可以作为内存偏移指针(此时,
DS作为 寄存器或段选择器)。
EDX
32-bit宽
通用寄存器。在某些运算中作为EAX的溢出寄存器(例如乘、除)。在保护模式中,也可以作为内存偏移指针(此时,DS作为段 寄存器或选择器)。
上述寄存器同EAX一样包括对应的16-bit和8-bit分组。
用作内存指针的特殊寄存器
ESI
32-bit宽
通常在内存操作指令中作为“源地址指针”使用。当然,ESI可以被装入任意的数值,但通常没有人把它当作通用寄存器来用。DS是默认段寄存器或选择器。
EDI
32-bit宽
通常在内存操作指令中作为“目的地址指针”使用。当然,EDI也可以被装入任意的数值,但通常没有人把它当作通用寄存器来用。DS是默认段寄存器或选择器。
EBP
32-bit宽
这也是一个作为指针的寄存器。通常,它被高级语言编译器用以建造‘堆栈帧’来保存函数或过程的局部变量,不过,还是那句话,你可以在其中保存你希望的任何数据。SS是它的默认段寄存器或选择器。
注意,这三个寄存器没有对应的8-bit分组。换言之,你可以通过SI、DI、BP作为别名访问他们的低16位,却没有办法直接访问他们的低8位。
段寄存器和选择器
实模式下的段寄存器到保护模式下摇身一变就成了选择器。不同的是,实模式下的“段寄存器”是16-bit的,而保护模式下的选择器是32-bit的。
CS 代码段,或代码选择器。同IP寄存器(稍后介绍)一同指向当前正在执行的那个地址。处理器执行时从这个寄存器指向的段(实模式)或内存(保护模式)中获取指令。除了跳转或其他分支指令之外,你无法修改这个寄存器的内容。
DS 数据段,或数据选择器。这个寄存器的低16 bit连同ESI一同指向的指令将要处理的内存。同时,所有的内存操作指令 默认情况下都用它指定操作段(实模式)或内存(作为选择器,在保护模式。这个寄存器可以被装入任意数值,然而在这么做的时候需要小心一些。方法是,首先把数据送给AX,然后再把它从AX传送给DS(当然,也可以通过堆栈来做).
ES 附加段,或附加选择器。这个寄存器的低16 bit连同EDI一同指向的指令将要处理的内存。同样的,这个寄存器可以被装入任意数值,方法和DS类似。
FS F段或F选择器(推测F可能是Free?)。可以用这个寄存器作为默认段寄存器或选择器的一个替代品。它可以被装入任何数值,方法和DS类似。
GS G段或G选择器(G的意义和F一样,没有在Intel的文档中解释)。它和FS几乎完全一样。 SS 堆栈段或堆栈选择器。这个寄存器的低16 bit连同ESP一同指向下一次堆栈操作(push和pop)所要使用的堆栈地址。这个寄存器也可以被装入任意数值,你可以通过入栈和出栈操作来给他赋值,不过由于堆栈对于很多操作有很重要的意义,因此,不正确的修改有可能造成对堆栈的破坏。
* 注意 一定不要在初学汇编的阶段把这些寄存器弄混。他们非常重要,而一旦你掌握了他们,你就可以对他们做任意的操作了。段寄存器,或选择器,在没有指定的情况下都是使用默认的那个。这句话在现在看来可能有点稀里糊涂,不过你很快就会在后面知道如何去做。
特殊寄存器(指向到特定段或内存的偏移量):
EIP 这个寄存器非常的重要。这是一个32位宽的寄存器 ,同CS一同指向即将执行的那条指令的地址。不能够直接修改这个寄存器的值,修改它的唯一方法是跳转或分支指令。(CS是默认的段或选择器)
ESP 这个32位寄存器指向堆栈中即将被操作的那个地址。尽管可以修改它的值,然而并不提倡这样做,因为如果你不是非常明白自己在做什么,那么你可能造成堆栈的破坏。对于绝大多数情况而言,这对程序是致命的。(SS是默认的段或选择器)
IP: Instruction Pointer, 指令指针
SP: Stack Pointer, 堆栈指针
好了,上面是最基本的寄存器。下面是一些其他的寄存器,你甚至可能没有听说过它们。(都是32位宽):
CR0, CR2, CR3(控制寄存器)。举一个例子,CR0的作用是切换实模式和保护模式。
还有其他一些寄存器,D0, D1, D2, D3, D6和D7(调试寄存器)。他们可以作为调试器的硬件支持来设置条件断点。
TR3, TR4, TR5, TR6 和 TR? 寄存器(测试寄存器)用于某些条件测试。
最后我们要说的是一个在程序设计中起着非常关键的作用的寄存器:标志寄存器。
本节中部份表格来自David Jurgens的HelpPC 2.10快速参考手册。在此谨表谢意。先说一点和实际编程关系不太大的东西。当然,如果你迫切的想看到更实质的内容,完全可以先跳过这一章。
那么,我想可能有一个问题对于初学汇编的人来说非常重要,那就是:
汇编语言到底是什么?
汇编语言是一种最接近计算机核心的编码语言。不同于任何高级语言,汇编语言几乎可以完全和机器语言一一对应。不错,我们可以用机器语言写程序,但现在除了没有汇编程序的那些电脑之外,直接用机器语言写超过1000条以上指令的人大概只能算作那些被我们成为“圣人”的牺牲者一类了。毕竟,记忆一些短小的助记符、由机器去考虑那些琐碎的配位过程和检查错误,比记忆大量的随计算机而改变的十六进制代码、可能弄错而没有任何提示要强的多。熟练的汇编语言编码员甚至可以直接从十六进制代码中读出汇编语言的大致意思。当然,我们有更好的工具——汇编器和反汇编器。
简单地说,汇编语言就是机器语言的一种可以被人读懂的形式,只不过它更容易记忆。至于宏汇编,则是包含了宏支持的汇编语言,这可以让你编程的时候更专注于程序本身,而不是忙于计算和重写代码。
汇编语言除了机器语言之外最接近计算机硬件的编程语言。由于它如此的接近计算机硬件,因此,它可以最大限度地发挥计算机硬件的性能。用汇编语言编写的程序的速度通常要比高级语言和C/C++快很多--几倍,几十倍,甚至成百上千倍。当然,解释语言,如解释型LISP,没有采用JIT技术的Java虚机中运行的Java等等,其程序速度更无法与汇编语言程序同日而语 。
永远不要忽视汇编语言的高速。实际的应用系统中,我们往往会用汇编彻底重写某些经常调用的部分以期获得更高的性能。应用汇编也许不能提高你的程序的稳定性,但至少,如果你非常小心的话,它也不会降低稳定性;与此同时,它可以大大地提高程序的运行速度。我强烈建议所有的软件产品在最后Release之前对整个代码进行Profile,并适当地用汇编取代部分高级语言代码。至少,汇编语言的知识可以告诉你一些有用的东西,比如,你有多少个寄存器可以用。有时,手工的优化比编译器的优化更为有效,而且,你可以完全控制程序的实际行为。
我想我在罗嗦了。总之,在我们结束这一章之前,我想说,不要在优化的时候把希望完全寄
篇五:汇编语言 计算机
汇编语言图册
汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。汇编语言,作为一门语言,对应于高级语言的编译器,需要一个“汇编器”来把汇编语言原文件汇编成机器可执行的代码。高级的汇编器如MASM,TASM等等为我们写汇编程序提供了很多类似于高级语言的特征,比如结构化、抽象等。在这样的环境中编写的汇编程序,有很大一部分是面向汇编器的伪指令,已经类同于高级语言。现在的汇编环境已经如此高级,即使全部用汇编语言来编写windows的应用程序也是可行的,但这不是汇编语言的长处。汇编语言的长处在于编写高效且需要对机器硬件精确控制的程序。[1] 符号语言
在汇编语言中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。因此汇编语言亦称为符号语言。
汇编
使用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理系统软件。汇编语言编译器把汇编程序翻译成机器语言的过程称为汇编。
不能通用
汇编语言比机器语言易于读写、调试和修改,同时具有机器语言全部优点。但在编写复杂程序时,相对高级语言代码量较大,而且汇编语言依赖于具体的处理器体系结构,不能通用,因此不能直接在不同处理器体系结构之间移植。
汇编语言是直接面向处理器(Processor)的程序设计语言。处理器是在指令的控制下工作的,处理器可以识别的每一条指令称为机器指令。每一种处理器都有自己可以识别的一整套指令,称为指令集。处理器执行指令时,根据不同的指令采取不同的动作,完成不同的功能,既可以改变自己内部的工作状态,也能控制其它外围电路的工作状态。
在电路中,每条机器指令都表现为一组电信号,通过一排导线进入处理器。这些电信号有的呈高电平,有的呈低电平,哪些为高,哪些为低,取决于不同的机器指令。如果把高电平记为“1”,低电平记为“0”,那么,不同的机器指令将表现为不同的二进制序列,由于它们的无规律性,这就使得机器指令难以理解、书写和记忆。
人类最容易接受自己每天都使用的自然语言。为了使机器指令的书写和理解变得容易,需要借鉴自然语言的优点,为此就引入了汇编语言。汇编语言使用符号来代表不同的机器指令,而这些符号非常接近于自然语言的要素。基本上,汇编语言里的每一条指令,都对应着处理器的一条机器指令。
汇编语言包括两个部分:语法部分和汇编器。语法部分提供与机器指令相对应的助记符,方便指令的书写和阅读。当然,汇编语言的符号可以被人类接受,但不能被处理器识别,为此,还要由汇编语言编译器将这些助记符转换成机器指令。
根据应用领域的不同,处理器的种类繁多,比如用于工业控制和嵌入式计算的Z80、MC68000和MCS-51、广泛应用于个人计算机的INTELx86系列,以及基于ARM体系结构的处理器,包括苹果公司在内的大企业都是ARM的客户。事实上,今天的ARM是最受欢迎的32位嵌入式处理器,而且,今天的ARM处理器比INTEL奔腾系列卖得还多,基本上是3:1的比例。 不同的处理器有不同的指令集。正是因为这个原因,每一种处理器都会有自己专属的汇编语言语法规则和编译器。即使是同一种类型的处理器,也可能拥有不同的汇编语言编译器。一个明显的例子是INTEL x86系列的处理器,围绕它就开发出好多种编译器来,如MASM、NASM、FASM、TASM、GAS和AT&T等。而且,每一种编译器,都使用不同的语法。
优点
汇编语言直接同计算机的底层软件甚至硬件进行交互,它具有如下一些优点:
(1)能够直接访问与硬件相关的存储器或I/O端口;
(
2)能够不受编译器的限制,对生成的二进制代码进行完全的控制;
(3)能够对关键代码进行更准确的控制,避免因线程共同访问或者硬件设备共享引起的死锁;
(4)能够根据特定的应用对代码做最佳的优化,提高运行速度;
(5)能够最大限度地发挥硬件的功能。
(6)汇编语言用来编制系统软件和过程控制软件,其目标程序占用内存空间少,运行速度快,有着高级语言不可替代的用途。
缺点 同时还应该认识到,汇编语言是一种层次非常低的语言,它仅仅高于直接手工编写二进制的机器指令码,因此不可避免地存在一些缺点:
(1)编写的代码非常难懂,不好维护;
(2)很容易产生bug,难于调试;
(3)只能针对特定的体系结构和处理器进行优化;
(4)开发效率很低,时间长且单调。
(5)汇编语言像机器指令一样,是硬件操作的控制信息,因而仍然是面向机器的语言,使用起来还是比较繁琐费时,通用性也差。
历史上,汇编语言曾经是非常流行的程序设计语言之一。随着软件规模的增长,以及随之而来的对软件开发进度和效率的要求,高级语言逐渐取代了汇编语言。但即便如此,高级语言也不可能完全替代汇编语言的作用。就拿Linux内核来讲,虽然绝大部分代码是用C语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码。由于这部分代码与硬件的关系非常密切,即使是C语言也会显得力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能。
首先,汇编语言的大部分语句直接对应着机器指令,执行速度快,效率高,代码体积小,在
那些存储器容量有限,但需要快速和实时响应的场合比较有用,比如仪器仪表和工业控制设备中。
其次,
在系统程序的核心部分,以及与系统硬件频繁打交道的部分,可以使用汇编语言。比如操作系统的核心程序段、I/O接口电路的初始化程序、外部设备的低层驱动程序,以及频繁调用的子程序、动态连接库、某些高级绘图程序、视频游戏程序等等。
再次,汇编语言可以用于软件的加密和解密、计算机病毒的分析和防治,以及程序的调试和错误分析等各个方面。
最后,通过学习汇编语言,能够加深对计算机原理和操作系统等课程的理解。通过学习和使用汇编语言,能够感知、体会和理解机器的逻辑功能,向上为理解各种软件系统的原理,打下技术理论基础;向下为掌握硬件系统的原理,打下实践应用基础。
汇编代码
作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但重要性却勿庸置疑,因为它能够完成许多其它语言所无法完成的功能。就拿 Linux 内核来讲,虽然绝大部分代码是用 C 语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中主要是在 Linux 的启动部分。由于这部分代码与硬件的关系非常密切,即使是 C 语言也会有些力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能。
Linux程序员
大多数情况下 Linux 程序员不需要使用汇编语言,因为即便是硬件驱动这样的底层程序在 Linux 操作系统中也可以用完全用 C 语言来实现,再加上 GCC 这一优秀的编译器目前已经能够对最终生成的代码进行很好的优化,的确有足够的理由让我们可以暂时将汇编语言抛在一边了。但实现情况是 Linux 程序员有时还是需要使用汇编,或者不得不使用汇编,理由很简单:精简、高效和 libc 无关性。假设要移植 Linux 到某一特定的嵌入式硬件环境下,首先必然面临如何减少系统大小、提高执行效率等问题,此时或许只有汇编语言能帮上忙了。
优点
汇编语言直接同计算机的底层软件甚至硬件进行交互,它具有如下一些优点: 能够直接访问与硬件相关的存储器或 I/O 端口;
能够不受编译器的限制,对生成的二进制代码进行完全的控制;
能够对关键代码进行更准确的控制,避免因线程共同访问或者硬件设备共享引起的死锁; 能够根据特定的应用对代码做最佳的优化,提高运行速度;
能够最大限度地发挥硬件的功能。
缺点
同时还应该认识到,汇编语言是一种层次非常低的语言,
它仅仅高于直接手工编写二进制的机器指令码,因此不可避免地存在一些缺点:
?编写的代码非常难懂,不好维护;
?很容易产生 bug,难于调试;
?只能针对特定的体系结构和处理器进行优化;
?开发效率很低,时间长且单调。
两种不同的形式
Linux 下用汇编语言编写的代码具有两种不同的形式。第一种是完全的汇编代码,指的是整个程序全部用汇编语言编写。尽管是完全的汇编代码,Linux 平台下的汇编工具也吸收了 C 语言的长处,使得程序员可以使用 #include、#ifdef 等预处理指令,并能够通过宏定义来简化代码。第二种是内嵌的汇编代码,指的是可以嵌入到C语言程序中的汇编代码片段。虽然 ANSI 的 C 语言标准中没有关于内嵌汇编代码的相应规定,但各种实际使用的 C 编译器都做了这方面的扩充,这其中当然就包括 Linux 平台下的 GCC。[2] 用汇编语言实现RESET启动和热启动
程序名: RESET.ASM/BOOT.ASM 程序类别: 完整的汇编语言程序
功能: 用程序完成RESET启动和热启动
使用说明: 汇编连接以后转换为com文件运行
程序说明:
在日常用机过程中,如果出现了异常情况常常需要重新启动系统。对于IBM PC 以及其兼容机,除了开机冷启动外,还有热启动和R ESET开关复位启动,他们的共同特点是转入BIOS的入口点(即ROM 的起始单元FFFF:0处),执行该处的跳转指令,转向启动程序,该启动程序在
体裁作文