每日一贴,明天的内容关键字为汇编语言处理器
面向机器的编程语言 : 汇编语言:如果自己要发明一种编程语言,那么需要做些什么事情呢?
先要实现对于一门编程语言的各个要素:比如定义你自己的语法、数据类型、语言结构等等,其次你要写一个支撑这些语法的解释器或编译器。 就我的懂得,当你编写实现一个编译器或解释器,基本上你的代码就能够用了。
汇编语言是从机器语言转换过去的.最早的计算机系统没有可用的高级语言,是直接用0101这样的二进制编码来编程的,这样对绝大多数用户就很不方便,因为这要求对计算机系统的软件和硬件资源要非常了解才可以.记忆量也很大.到后来,大家就用一些符号来代替一些二进制代码,方便识别,比如本来代码1011意思是加法,当初就不写1011了,写成ADD,用ADD这个大家都轻易识别的符号来编程,可以晋升一些效率.但计算机的执行仍然只识别二进制代码,所以需要把汇编语言写的代码再转换成机器语言.
汇编语言是一种低级语言,好处是可以直接控制计算机的软硬件资源.坏处就是对编程人员的要求非常高.计算机执行的时候,用汇编语言编写的代码的执行效率是最高的.和机器语言代码的效率一样高.
1.面向机器的程序设计语言
汇编语言(Assembly Language)是面向机器的程序设计语言。在汇编语言中,用助记符(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和AT&T等。而且,这每一种编译器,都使用不同的语法。
优缺陷
优点
1、因为用汇编语言设计的程序终究被转换成机器指令,故能够坚持机器语言的一致性,直接、简捷,并能象机器指令一样拜访、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等。使用汇编语言,可以拜访全部能够被拜访的软、硬件资源。
2、目标代码冗长,占用内存少,执行速度快,是高效的程序设计语言,经常与高级语言配合使用,以改善程序的执行速度和效率,弥补高级语言在硬件控制方面的不足,应用十分普遍。
缺陷
1、汇编语言是面向机器的,处于整个计算机语言层次结构的底层,故被视为一种低级语言,通常是为特定的计算机或系列计算机专门设计的。因此,不同的处理器有不同的汇编语言语法和编译器,编译的程序无法在不同的处理器上执行,缺乏可移植性;
2、难于从汇编语言代码上懂得程序设计意图,可维护性差,即使是实现简略的工作也需要大量的汇编语言代码,很轻易产生bug,难于调试;
3、使用汇编语言必须对某种处理器非常了解,而且只能针对特定的体系结构和处理器进行优化,开辟效率很低,周期长且单调。
应用
历史上,汇编语言曾经是非常风行的程序设计语言之一。随着软件规模的增长,以及随之而来的对软件开辟进度和效率的要求,高级语言逐渐代替了汇编语言。但即便如此,高级语言也不可能完全替代汇编语言的作用。就拿Linux内核来讲,虽然绝大部份代码是用C语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码。由于这部份代码与硬件的关系非常亲密,即使是C语言也会显得力不从心,而汇编语言则能够很好取长补短,最大限制地发挥硬件的性能。
首先,汇编语言的大部份语句直接对应着机器指令,执行速度快,效率高,代码体积小,在那些存储器容量有限,但需要快速和实时响应的场所比较有效,比如仪器仪表和产业控制设备中。
其次,在系统程序的核心部份,以及与系统硬件频繁打交道的部份,可以使用汇编语言。比如操纵系统的核心程序段、I/O接口电路的初始化程序、外部设备的低层驱动程序,以及频繁调用的子程序、动态连接库、某些高级绘图程序、视频游戏程序等等。
再次,汇编语言可以用于软件的加密和解密、计算机病毒的分析和防治,以及程序的调试和错误分析等各个方面。
最后,通过学习汇编语言,能够加深对计算机原理和操纵系统等课程的懂得。通过学习和使用汇编语言,能够感知、体会和懂得机器的逻辑功能,向上为懂得各种软件系统的原理,打下技巧理论基本;向下为掌握硬件系统的原理,打下实际应用基本。
特点
1.机器相关性。
这是一种面向机器的低级语言,通常是为特定的计算机或系列计算机专门设计的。因为是机器指令的符号化表现,故不同的机器就有不同的汇编语言。使用汇编语言能面向机器并较好地发挥机器的特性,得到质量较高的程序。
2.高速度和高效率。
汇编语言坚持了机器语言的优点,具有直接和简捷的特点,可有效地拜访、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等,且占用内存少,执行速度快,是高效的程序设计语言。
3.编写和调试的复杂性。
由于是直接控制硬件,且简略的任务也需要很多汇编语言语句,因此在进行程序设计时必须四平八稳,需要考虑到一切可能的问题,合理调配和使用各种软、硬件资源。这样,就不可避免地减轻了程序员的累赘。与此雷同,在程序调试时,一旦程序的运行出了问题,就很难发明。
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、中断指令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等。
对于一个全面了解微机原理的程序员,汇编语言是?语言。
文章结束给大家分享下程序员的一些笑话语录:
自行车
一个程序员骑着一个很漂亮的自行车到了公司,另一个程序员看到了他,问 到,“你是从哪搞到的这么漂亮的车的?”
骑车的那个程序员说, “我刚从那边过来, 有一个漂亮的姑娘骑着这个车过来, 并停在我跟前,把衣服全脱了,然后对我说,‘你想要什么都可以’”。
另一个程序员马上说到, “你绝对做了一个正确的选择, 因为那姑娘的衣服你 并不一定穿得了”。