汇编语⾔(AssemblyLanguage)——⾯向机器的程序设计语⾔
概述
汇编语⾔(assembly language),产⽣于20世纪50年代,是⼀种⽤于电⼦计算机、微处理器、微控制器或其他可编程器件的低级语⾔,亦称为符号语⾔。
在汇编语⾔中,⽤助记符(Mnemonics)代替机器指令的操作码,⽤地址符号(Symbol)或标号(Label)代替指令或操作数的地址。 在不同的设备中,汇编语⾔对应着不同的机器语⾔指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语⾔和特定的机器语⾔指令集是⼀⼀对应的,不同平台之间不可直接移植。
许多汇编程序为程序开发、汇编控制、辅助调试提供了额外的⽀持机制。有的汇编语⾔编程⼯具经常会提供宏,它们也被称为宏汇编器。
汇编语⾔不像其他⼤多数的程序设计语⾔⼀样被⼴泛⽤于程序设计。在今天的实际应⽤中,它通常被应⽤在底层,硬件操作和⾼要求的程序优化的场合。驱动程序、嵌⼊式操作系统和实时运⾏程序都需要汇编语⾔。
语⾔特点
汇编语⾔是直接⾯向处理器(Processor)的程序设计语⾔。处理器是在指令的控制下⼯作的,处理器可以识别的每⼀条指令称为机器指令。每⼀种处理器都有⾃⼰可以识别的⼀整套指令,称为指令集。处理器执⾏指令时,根据不同的指令采取不同的动作,完成不同的功能,既可以改变⾃⼰内部的⼯作状态,也能控制其它外围电路的⼯作状态。
汇编语⾔的另⼀个特点就是它所操作的对象不是具体的数据,⽽是寄存器或者存储器,也就是说它是直接和寄存器和存储器打交道,这也是为什么汇编语⾔的执⾏速度要⽐其它语⾔快,但同时这也使编程更加复杂,因为既然数据是存放在寄存器或存储器中,那么必然就存在着寻址⽅式,也就是⽤什么⽅法到所需要的数据。
例如上⾯的例⼦,我们就不能像⾼级语⾔⼀样直接使⽤数据,⽽是先要从相应的寄存器AX、BX 中把数据取出。这也就增加了编程的复杂性,因为在⾼级语⾔中寻址这部分⼯作是由编译系统来完成的,⽽在汇编语⾔中是由程序员⾃⼰来完成的,这⽆异增加了编程的复杂程度和程序的可读性。
再者,汇编语⾔指令是机器指令的⼀种符号表⽰,⽽不同类型的CPU 有不同的机器指令系统,也就有不同的汇编语⾔,所以,汇编语⾔程序与机器有着密切的关系。所以,除了同系列、不同型号CPU 之间的汇编语⾔程序有⼀定程度的可移植性之外,其它不同类型(如:⼩型机和微机等)CPU 之间的汇编语⾔程序是⽆法移植的,也就是说,汇编语⾔程序的通⽤性和可移植性要⽐⾼级语⾔程序低。
正因为汇编语⾔有“与机器相关性”的特性,程序员⽤汇编语⾔编写程序时,可充分对机器内部的各种资源进⾏合理的安排,让它们始终处于最佳的使⽤状态。这样编写出来的程序执⾏代码短、执⾏速度快。汇编语⾔是各种编程语⾔中与硬件关系最密切、最直接的⼀种,在时间和空间的效率上也最⾼的⼀种,它是⾼等院校计算机应⽤技术必修的专业课程之⼀,对于训练学⽣掌握程序设计技术,熟悉上机操作和程序调试技术有重要作⽤。
总体特点
1.机器相关性
这是⼀种⾯向机器的低级语⾔,通常是为特定的计算机或 系列计算机专门设计的。因为是机器指令的符号化表⽰,故不同的机器就有不同的汇编语⾔。使⽤汇编语⾔能⾯向机器并较好地发挥机器的特性,得到质量较⾼的程序。
2.⾼速度和⾼效率
汇编语⾔保持了机器语⾔的优点,具有直接和简捷的特点,可有效地访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O 端⼝等,且占⽤内存少,执⾏速度快,是⾼效的程序设计语⾔。
3.编写和调试的复杂性
由于是直接控制硬件,且简单的任务也需要很多汇编语⾔语句,因此在进⾏程序设计时必须⾯⾯俱到,需要考虑到⼀切可能的问题,合理调配和使⽤各种软、硬件资源。这样,就不可避免地加重了程序员的负担。与此相同,在程序调试时,⼀旦程序的运⾏出了问题,就很难发现。
优点
1、因为⽤汇编语⾔设计的程序最终被转换成机器指令,故能够保持机器语⾔的⼀致性,直接、简捷,并能像机器指令⼀样访问、控制
计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端⼝等。使⽤汇编语⾔,可以访问所有能够被访问的软、硬件资源。
2、⽬标代码简短,占⽤内存少,执⾏速度快,是⾼效的程序设计语⾔,经常与⾼级语⾔配合使⽤,以改善程序的执⾏速度和效率,弥
补⾼级语⾔在硬件控制⽅⾯的不⾜,应⽤⼗分⼴泛。
缺点
1、汇编语⾔是⾯向机器的,处于整个计算机语⾔层次结构的底层,故被视为⼀种低级语⾔,通常是为特定的计算机或系列计算机专门
设计的。不同的处理器有不同的汇编语⾔语法和编译器,编译的程序⽆法在不同的处理器上执⾏,缺乏可移植性;
2、难于从汇编语⾔代码上理解程序设计意图,可维护性差,即使是完成简单的⼯作也需要⼤量的汇编语⾔代码,很容易产⽣bug,难
于调试;
3、使⽤汇编语⾔必须对某种处理器⾮常了解,⽽且只能针对特定的体系结构和处理器进⾏优化,开发效率很低,周期长且单调。
语⾔组成(12类 =_=!)
数据传送指令
这部分指令包括通⽤数据传送指令MOV、
堆栈操作指令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
Jcc是⼀个指令簇,包含了很多指令,⽤于根据EFLAGS寄存器的某些位状态来决定是否转移。
循环指令LOOP/LOOPE/LOOPNE
过程调⽤指令CALL
⼦过程返回指令RET
中断指令INTn、INT3、INTO、IRET等。
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/VM ON等。
相关技术
汇编器
典型的现代汇编器(assembler)建造⽬标代码,由解译组语指令集的易记码(mnemonics)到操作码(OpCode),并解析符号名称(symbolic names)成为存储器地址以及其它的实体。
使⽤符号参考是汇编器的⼀个重要特征,它可以节省修改程序后⼈⼯转址的乏味耗时计算。基本就是把机器码变成⼀些字母⽽已,编译的时候再把输⼊的指令字母替换成为晦涩难懂机器码。
编译环境
⽤汇编语⾔等⾮机器语⾔书写好的符号程序称为源程序,汇编语⾔编译器的作⽤是将源程序翻译成⽬标程序。
⽬标程序是机器语⾔程序,当它被安置在内存的预定位
置上后,就能被计算机的CPU处理和执⾏。
汇编的调试环境总的来说⽐较少,也很少有⾮常好的编译器。编译器的选择依赖于⽬标处理器的类型和具体的系统平台。⼀般来说,功能良好的编译器⽤起来应当⾮常⽅便。
⽐如,应当可以⾃动整理格式、语法⾼亮显⽰,集编译、链接和调试为⼀体,⽅便实⽤。
对于⼴泛使⽤的个⼈计算机来说,可以⾃由选择的汇编语⾔编译器有MASM、NASM、TASM、GAS、FASM、RADASM等,但⼤都不具备调试功能。如果是为了学习汇编语⾔,轻松汇编因为拥有⼀个完善的集成环境,是⼀款⾮常适合初学者的汇编编译器。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论