汇编语言(面向机器的程式设计语言)详细资料大全

汇编语言(面向机器的程式设计语言)详细资料大全,第1张

汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可程式器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的 *** 作码,用地址符号(Symbol)或标号(Label)代替指令或运算元的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。

许多汇编程式为程式开发、汇编控制、辅助调试提供了额外的支持机制。有的汇编语言编程工具经常会提供宏,它们也被称为宏汇编器。

汇编语言不像其他大多数的程式设计语言一样被广泛用于程式设计。在今天的实际套用中,它通常被套用在底层,硬体 *** 作和高要求的程式最佳化的场合。驱动程式、嵌入式作业系统和实时运行程式都需要汇编语言。

基本介绍 中文名 :汇编语言 外文名 :Assembly Language 学科 :软体工程 产生年代 :20世纪50年代 编译方式 :汇编 发展历程,语言特点,总体特点,优点,缺点,语言组成,数据传送指令,整数和逻辑运算指令,移位指令,位 *** 作指令,条件设定指令,控制转移指令,串 *** 作指令,输入输出指令,相关技术,汇编器,编译环境,发展前景,实际套用,经典教材,x86处理器,ARM及单片机, 发展历程 说到汇编语言的产生,首先要讲一下机器语言。机器语言是机器指令的集合。机器指令展开来讲就是一台机器可以正确执行的命令。电子计算机的机器指令是一列二进制数字。计算机将之转变为一列高低电平,以使计算机的电子器件受到驱动,进行运算。 上面所说的计算机指的是可以执行机器指令,进行运算的机器。这是早期计算机的概念。在我们常用的PC机中,有一个晶片来完成上面所说的计算机的功能。这个晶片就是我们常说的CPU(Central Processing Unit,中央处理单元)。每一种微处理器,由于硬体设计和内部结构的不同,就需要用不同的电平脉冲来控制,使它工作。所以每一种微处理器都有自己的机器指令集,也就是机器语言。 早期的程式设计均使用机器语言。程式设计师们将用0, 1数字编成的程式代码打在纸带或卡片上,1打孔,0不打孔,再将程式通过纸带机或卡片机输入计算机,进行运算。这样的机器语言由纯粹的0和1构成,十分复杂,不方便阅读和修改,也容易产生错误。程式设计师们很快就发现了使用机器语言带来的麻烦,它们难于辨别和记忆,给整个产业的发展带来了障碍,于是汇编语言产生了。 汇编语言的主体是汇编指令。汇编指令和机器指令的差别在于指令的表示方法上。汇编指令是机器指令便于记忆的书写格式。 *** 作:暂存器BX的内容送到AX中1000100111011000              机器指令mov ax,bx                    汇编指令 此后,程式设计师们就用汇编指令编写源程式。可是,计算机能读懂的只有机器指令,那么如何让计算机执行程式设计师用汇编指令编写的程式呢?这时,就需要有一个能够将汇编指令转换成机器指令的翻译程式,这样的程式我们称其为编译器。程式设计师用汇编语言写出源程式,再用汇编编译器将其编译为机器码,由计算机最终执行。 工作过程 语言特点 汇编语言是直接面向处理器(Processor)的程式设计语言。处理器是在指令的控制下工作的,处理器可以识别的每一条指令称为机器指令。每一种处理器都有自己可以识别的一整套指令,称为指令集。处理器执行指令时,根据不同的指令采取不同的动作,完成不同的功能,既可以改变自己内部的工作状态,也能控制其它外围电路的工作状态。 汇编语言的另一个特点就是它所 *** 作的对象不是具体的数据,而是暂存器或者存储器,也就是说它是直接和暂存器和存储器打交道,这也是为什么汇编语言的执行速度要比其它语言快,但同时这也使编程更加复杂,因为既然数据是存放在暂存器或存储器中,那么必然就存在着定址方式,也就是用什么方法找到所需要的数据。例如上面的例子,我们就不能像高级语言一样直接使用数据,而是先要从相应的暂存器AX、BX 中把数据取出。这也就增加了编程的复杂性,因为在高级语言中定址这部分工作是由编译系统来完成的,而在汇编语言中是由程式设计师自己来完成的,这无异增加了编程的复杂程度,降低了程式的可读性。 再者,汇编语言指令是机器指令的一种符号表示,而不同类型的CPU 有不同的机器指令系统,也就有不同的汇编语言,所以,汇编语言程式与机器有着密切的关系。所以,除了同系列、不同型号CPU 之间的汇编语言程式有一定程度的可移植性之外,其它不同类型(如:小型机和微机等)CPU 之间的汇编语言程式是无法移植的,也就是说,汇编语言程式的通用性和可移植性要比高级语言程式低。 正因为汇编语言有“与机器相关性”的特性,程式设计师用汇编语言编写程式时,可充分对机器内部的各种资源进行合理的安排,让它们始终处于最佳的使用状态。这样编写出来的程式执行代码短、执行速度快。汇编语言是各种程式语言中与硬体关系最密切、最直接的一种,在时间和空间的效率上也最高的一种,它是高等院校计算机套用技术必修的专业课程之一,对于训练学生掌握程式设计技术,熟悉上机 *** 作和程式调试技术有重要作用 总体特点 1.机器相关性 这是一种面向机器的低级语言,通常是为特定的计算机或系列计算机专门设计的。因为是机器指令的符号化表示,故不同的机器就有不同的汇编语言。使用汇编语言能面向机器并较好地发挥机器的特性,得到质量较高的程式。 2.高速度和高效率 汇编语言保持了机器语言的优点,具有直接和简捷的特点,可有效地访问、控制计算机的各种硬体设备,如磁碟、存储器、CPU、I/O连线埠等,且占用记忆体少,执行速度快,是高效的程式设计语言。 3.编写和调试的复杂性 由于是直接控制硬体,且简单的任务也需要很多汇编语言语句,因此在进行程式设计时必须面面俱到,需要考虑到一切可能的问题,合理调配和使用各种软、硬体资源。这样,就不可避免地加重了程式设计师的负担。与此相同,在程式调试时,一旦程式的运行出了问题,就很难发现。 优点 1、因为用汇编语言设计的程式最终被转换成机器指令,故能够保持机器语言的一致性,直接、简捷,并能像机器指令一样访问、控制计算机的各种硬体设备,如磁碟、存储器、CPU、I/O连线埠等。使用汇编语言,可以访问所有能够被访问的软、硬体资源。 2、目标代码简短,占用记忆体少,执行速度快,是高效的程式设计语言,经常与高级语言配合使用,以改善程式的执行速度和效率,弥补高级语言在硬体控制方面的不足,套用十分广泛。 缺点 1、汇编语言是面向机器的,处于整个计算机语言层次结构的底层,故被视为一种低级语言,通常是为特定的计算机或系列计算机专门设计的。不同的处理器有不同的汇编语言语法和编译器,编译的程式无法在不同的处理器上执行,缺乏可移植性; 2、难于从汇编语言代码上理解程式设计意图,可维护性差,即使是完成简单的工作也需要大量的汇编语言代码,很容易产生bug,难于调试; 3、使用汇编语言必须对某种处理器非常了解,而且只能针对特定的体系结构和处理器进行最佳化,开发效率很低,周期长且单调。 语言组成 数据传送指令 这部分指令包括通用数据传送指令MOV、条件传送指令CMOV 、堆叠 *** 作指令PUSH/PUSHA/PUSHAD/POP/POPA/POPAD、交换指令XCHG/XLAT/BSWAP、地址或段描述符选择子传送指令LEA/LDS/LES/LFS/LGS/LSS等。注意,CMOV不是一条具体的指令,而是一个指令簇,包括大量的指令,用于根据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、条件转移指令J /JCXZ、循环指令LOOP/LOOPE/LOOPNE、过程调用指令CALL、子过程返回指令RET、中断指令INTn、INT3、INTO、IRET等。注意,J 是一个指令簇,包含了很多指令,用于根据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等。 相关技术 汇编器 典型的现代 汇编器 (assembler)建造目标代码,由解译组语指令集的易记码(mnemonics)到 *** 作码(OpCode),并解析符号名称(symbolic names)成为存储器地址以及其它的实体。使用符号参考是汇编器的一个重要特征,它可以节省修改程式后人工转址的乏味耗时计算。基本就是把机器码变成一些字母而已,编译的时候再把输入的指令字母替换成为晦涩难懂机器码。 编译环境 用汇编语言等非机器语言书写好的符号程式称为源程式,汇编语言编译器的作用是将源程式翻译成目标程式。目标程式是机器语言程式,当它被安置在记忆体的预定位置上后,就能被计算机的CPU处理和执行。 汇编的调试环境总的来说比较少,也很少有非常好的编译器。编译器的选择依赖于目标处理器的类型和具体的系统平台。一般来说,功能良好的编译器用起来应当非常方便,比如,应当可以自动整理格式、语法高亮显示,集编译、连结和调试为一体,方便实用。 对于广泛使用的个人计算机来说,可以自由选择的汇编语言编译器有MASM、NASM、TASM、GAS、FASM、RADASM等,但大都不具备调试功能。如果是为了学习汇编语言,轻松汇编因为拥有一个完善的集成环境,是一款非常适合初学者的汇编编译器。 发展前景 汇编语言是机器语言的助记符,相对于比枯燥的机器代码易于读写、易于调试和修改,同时优秀的汇编语言设计者经过巧妙的设计,使得汇编语言汇编后的代码比高级语言执行速度更快,占记忆体空间少等优点,但汇编语言的运行速度和空间占用是针对高级语言并且需要巧妙设计,而且部分高级语言在编译后代码执行效率同样很高,所以此优点慢慢弱化。而且在编写复杂程式时具有明显的局限性,汇编语言依赖于具体的机型,不能通用,也不能在不同机型之间移植。常说汇编语言是低级语言,并不是说汇编语言要被弃之,相反,汇编语言仍然是计算机(或微机)底层设计程式设计师必须了解的语言,在某些行业与领域,汇编是必不可少的,非它不可适用。只是,现在计算机最大的领域为IT软体,也是我们常说的计算机套用软体编程,在熟练的程式设计师手里,使用汇编语言编写的程式,运行效率与性能比其它语言写的程式相对提高,但是代价是需要更长的时间来最佳化,如果对计算机原理及编程基础不扎实,反而增加其开发难度,实在是得不偿失,对比2010年前后的软体开发,已经是市场化的软体行业,加上高级语言的优秀与跨平台,一个公司不可以让一个团队使用汇编语言来编写所有的东西,花上几倍甚至几十倍的时间,不如使用其它语言来完成,只要最终结果不比汇编语言编写的差太多,就能抢先一步完成,这是市场经济下的必然结果。 但是,迄今为止,还没有程式设计师敢断定汇编语言是不需要学的,同时,汇编语言(Assembly Language)是面向机器的程式设计语言,设计精湛的汇编程式设计师,部分已经脱离软体开发,挤身于工业电子编程中。对于功能相对小巧但硬体对语言设计要求苛刻的行业,如4位单片机,由于其容量及运算,此行业的电子工程师一般负责从开发设计电路及软体控制,主要开发语言就是汇编,c语言使用只占极少部分,而电子开发工程师是千金难求,在一些工业公司,一个核心的电子工程师比其它任何职员待遇都高,对比起来,一般电子工程师待遇是程式设计师的十倍以上。这种情况是因为21世纪以来,学习汇编的人虽然也不少,但是真正能学到精通的却不多,它相对于高级语言难学,难用,适用范围小,虽然简单,但是过于灵活,学习过高级语言的人去学习汇编比一开始学汇编的人难得多,但是学过汇编的人学习高级语言却很容易,简从繁易,繁从简难。对于一个全面了解微机原理的程式设计师,汇编语言是必修语言。 实际套用 随着现代软体系统越来越庞大复杂,大量经过了封装的高级语言如C/C++,Pascal/Object Pascal也应运而生。这些新的语言使得程式设计师在开发过程中能够更简单,更有效率,使软体开发人员得以应付快速的软体开发的要求。而汇编语言由于其复杂性使得其适用领域逐步减小。但这并不意味着汇编已无用武之地。由于汇编更接近机器语言,能够直接对硬体进行 *** 作,生成的程式与其他的语言相比具有更高的运行速度,占用更小的记忆体,因此在一些对于时效性要求很高的程式、许多大型程式的核心模组以及工业控制方面大量套用。 此外,虽然有众多程式语言可供选择,但汇编依然是各大学计算机科学类专业学生的必修课,以让学生深入了解计算机的运行原理。 历史上,汇编语言曾经是非常流行的程式设计语言之一。随着软体规模的增长,以及随之而来的对软体开发进度和效率的要求,高级语言逐渐取代了汇编语言。但即便如此,高级语言也不可能完全替代汇编语言的作用。就拿Linux核心来讲,虽然绝大部分代码是用C语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码。由于这部分代码与硬体的关系非常密切,即使是C语言也会显得力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬体的性能。 首先,汇编语言的大部分语句直接对应着机器指令,执行速度快,效率高,代码体积小,在那些存储器容量有限,但需要快速和实时回响的场合比较有用,比如仪器仪表和工业控制设备中。 其次,在系统程式的核心部分,以及与系统硬体频繁打交道的部分,可以使用汇编语言。比如作业系统的核心程式段、I/O接口电路的初始化程式、外部设备的低层驱动程式,以及频繁调用的子程式、动态连线库、某些高级绘图程式、视频游戏程式等等。 再次,汇编语言可以用于软体的加密和解密、计算机病毒的分析和防治,以及程式的调试和错误分析等各个方面。 最后,通过学习汇编语言,能够加深对计算机原理和作业系统等课程的理解。通过学习和使用汇编语言,能够感知、体会和理解机器的逻辑功能,向上为理解各种软体系统的原理,打下技术理论基础;向下为掌握硬体系统的原理,打下实践套用基础。 经典教材 汇编语言教材很多,各种处理器都有涉及,粗略统计不下百种。在这么多的教材里,用得较多的可以分类列举如下: x86处理器 1《x86汇编语言:从实模式到保护模式》,李忠著,电子工业出版社,2013-1 。 基于INTEL x86处理器、NASM编译器和BOCHS虚拟机。汇编语言就是处理器的语言,从这个意义上来说,既然学习汇编语言,就必须直接面向硬体编程,而不是使用莫名其妙的DOS中断和API调用。这是一本有趣的书,它没有把篇幅花在计算一些枯燥的数学题上。相反,它教你如何直接控制硬体,在不借助于BIOS、DOS、Windows、Linux或者任何其他软体支持的情况下来显示字元、读取硬碟数据、控制其他硬体等。 我们知道,32位和64位是主流,实模式和DOS作业系统已经成为历史,Linux和Windows都工作在保护模式下。这本书从实模式讲到32位保护模式,尤其以32位保护模式为重点,阅读本书,对理解现代计算机和现代作业系统的工作原理有非常大的帮助作用。 2《汇编语言》(第2版),王爽 著,清华大学出版社,2013-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汇编语言程式设计的专著。

你所说的ATMEGA16不是因为它倍频,而是因为51单片机进行了12分频来稳定整个系统,也就是需要12个时钟周期,系统才会去执行一次程序,而ATMGEA16就没有进行分频,一个时钟周期就执行一条指令,所以要快很多

跟51的一样,具体可以根据软件调试修改时间。

WinAVR20081205 延时函数 :

void

_delay_loop_1(uint8_t __count)

{

__asm__ volatile (

"1: dec %0" "\n\t"

"brne 1b"

: "=r" (__count)

: "0" (__count)

);

}

准确延时是3__count个时钟周期 (0<__count<256)

void

_delay_loop_2(uint16_t __count)

{

__asm__ volatile (

"1: sbiw %0,1" "\n\t"

"brne 1b"

: "=w" (__count)

: "0" (__count)

);

}

准确延时是4__count+1个时钟周期 (0<__count<256256-1)

_delay_loop_1() 最小延时是3个时钟周期,最大延时是2563个时钟周期

_delay_loop_2() 最小延时是4+1个时钟周期,最大延时是2562564+1个时钟周期

void

_delay_us(double __us)

{

uint8_t __ticks;

double __tmp = ((F_CPU) / 3e6) __us;

if (__tmp < 10)

__ticks = 1;

else if (__tmp > 255)

{

_delay_ms(__us / 10000);

return;

}

else

__ticks = (uint8_t)__tmp;

_delay_loop_1(__ticks);

}

void

_delay_ms(double __ms)

{

uint16_t __ticks;

double __tmp = ((F_CPU) / 4e3) __ms;

if (__tmp < 10)

__ticks = 1;

else if (__tmp > 65535)

{

// __ticks = requested delay in 1/10 ms

__ticks = (uint16_t) (__ms 100);

while(__ticks)

{

// wait 1/10 ms

_delay_loop_2(((F_CPU) / 4e3) / 10);

__ticks --;

}

return;

}

else

__ticks = (uint16_t)__tmp;

_delay_loop_2(__ticks);

}

_dealy_us()最小延时 与 _delay_loop_1()相同,是3个时钟周期,

_delay_us(0)就是最小延时,相当于_delay_loop_1(1),

在8M时钟下,_delay_us(0375)也是最小延时(0375us是3个时钟周期)

_delay_us(07499999)仍然是最小延时,相当于_delay_loop_1(1),

而_delay_us(074999999)则相当于_delay_loop_1(2)了。

_dealy_ms() 最小延时与 _delay_loop_2()相同,是4+1个时钟周期。

_delay_ms(0)就是最小延时,相当于_delay_loop_2(1),

在8M时钟下,_delay_ms(00005)也是最小延时(00005ms相当于是4个时钟周期)

_delay_ms(00009999999)仍然是最小延时,相当于_delay_loop_2(1),

而_delay_ms(000099999999)则相当于_delay_loop_2(2)了。

_dealy_us(__us)延时精度范围:

(0 , 3个时钟周期),误差(0,3)个时钟周期

(3个时钟周期 , 768us/(F_CPU/1000000)),误差(-2,0)个时钟周期

(768us/(F_CPU/1000000) , 26214ms/(F_CPU/1000000)),误差(-2,+1)个时钟周期,

(26214ms/(F_CPU/1000000)) , 65535ms),误差8M时钟下(约+018ms,约+57ms)

_dealy_ms(__ms)延时精度范围:

(0 , 4个时钟周期),误差(1,5)个时钟周期

(4个时钟周期 , 26214ms/(F_CPU/1000000)),误差(-2,+1)个时钟周期,

(26214ms/(F_CPU/1000000)) , 65535ms),误差8M时钟下(约+018ms,约+57ms)

_dealy_us(__us)最大延时65535ms,即_delay_us(6553500);

_delay_ms(__ms)最大延时65535ms,即_delay_ms(65535);

本人水平有限,如果错漏之处,多谢指正。

补充:

1WinAVR延时库函数看起来,又是double,又是if、else,难道不耗时间?

不耗时间。WinAVR延时库函数,double都可以优化成常量,而整型常量,浮点常量运算,结果仍然仍然是常量。

编译器只要开优化,不会编译出额外的代码出来。if,else也一样。if判断条件是一个常量,也就是说某个分支一定为真,

另外的分支一定为假,编译器优化时,不会编译出额外代码。需要注意,如果要调用WinAVR延时库函数,则必须要开优化。

2怎么没有计算函数调用,返回时间?

WinAVR延时库函数全部都是内联函数,没有函数调用和返回开销。当然,这也有一个副作用,每处延时函数都会编译出一段代码,

占据更多的代码空间。

3旧版WinAVR _delay_us()最大延时768us/(F_CPU/1000000),delay_ms()最大延时是26214ms/(F_CPU/1000000)。

新版WinAVR_delay_us()和_delay_ms()最大延时都是65535ms,不过误差也相对较大,每01ms多7个时钟周期,8M时钟下,误差约为+088%。

----------------------------------

附IARAVR延时函数:

#ifndef __IAR_DELAY_H__

#define __IAR_DELAY_H__

#include <intrinsicsh>

#include "hal_typeh"

#define _delay_loop_1(A) __delay_cycles(3(A))

#define _delay_loop_2(A) __delay_cycles(4(A)+1)

#define _delay_us(A)\

__delay_cycles( (uint32) ( (double)(F_CPU) ((A)/10000000) + 05))

#define _delay_ms(A)\

__delay_cycles( (uint32) ( (double)(F_CPU)((A)/10000) + 05))

#define _delay_s(A)\

__delay_cycles( (uint32) ( (double)(F_CPU)((A)/10) + 05))

#endif

(1)用数字逻辑集成块实现;

(2)时间以24小时为一个周期,显示时、分、秒;

(3)计时过程具有报时功能,当时间到达整点前5秒进行蜂鸣报时;

(4)为了保证计时的稳定及准确须由晶体振荡器提供表针时间基准信号。

c51单片机 晶振为110592MHz

#include<reg52h>

#define HOUR1 1

#define HOUR0 0

#define MIN1 2

#define MIN0 8

#define SEC1 2

#define SEC0 0

#define uint unsigned int

#define ulint unsigned long int

#define uchar unsigned char

sbit dula=P2^6;

sbit wela=P2^7;

sbit beep=P2^3;

int i;

ulint

sharp,second,count=0,sec0=SEC0,sec1=SEC1,min0=MIN0,min1=MIN1,hour0=HOUR0,hour1=HOUR1;//秒计数全局变量

uchar code segment[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

uchar code time[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f};

void delay(uint);//程序毫秒延时

void beeper(uchar);//开蜂鸣器毫秒

void init();//初始化函数

void display();//从数码管上显示

void counter();//计算进行过程中的时、分、秒值

void scan();//扫描键盘

void main()

{

init();

while(1)

{

scan();//扫描键盘看是否有键按下

for(i=6;i>0;i--)//动态扫描6位数码管

{

display();//显示时、分、秒

}

}

}

void init()

{

second=hour136000+hour03600+min1600+min060+sec110+sec0;

TMOD=0x01;

TH0=(65536-46080)/256;

TL0=(65536-46080)%256;

EA=1;

ET0=1;

TR0=1;

}

void delay(uint z)//程序毫秒延时

{

uint x=0,y=0;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void timer0() interrupt 1

{

TH0=(65536-46080)/256;

TL0=(65536-46080)%256;

count++;

if(count==20)//判断是否到1秒

{

counter();//计算进行过程中的时、分、秒值

if(sharp!=hour0) beeper(1000);//判断小时的值是否改变,变则启动蜂鸣器

}

}

void beeper(uchar tt)

{

uchar t=tt;

count=0;

beep=0;//开蜂鸣器

delay(t);

beep=1;//关蜂鸣器

}

void display()

{

P0=0xff;//位消影(低电平选择位)

//送位选信号

wela=1;

P0=segment[i-1];

wela=0;

P0=0x00;//段消影(高电平选择段)

//送段选信号

dula=1;

switch(i)

{

case 6 : P0=time[sec0]; break;

case 5 : P0=time[sec1]; break;

case 4 : P0=time[min0]; break;

case 3 : P0=time[min1]; break;

case 2 : P0=time[hour0]; break;

case 1 : P0=time[hour1]; break;

}

delay(1);

P0=0x00; //配合上面用于消隐

dula=0;

}

void counter()

{

second++;

if(second==86400) second=0;

count=0;

sharp=hour0;//设置报时检测KEY

sec0=second%10;

sec1=(second%60-sec0)/10;

min0=((second%3600-sec110-sec0)/60)%10;

min1=((second%3600-sec110-sec0)/60-min0)/10;

hour0=(second%36000-min1600-min060-sec110-sec0)/3600;

hour1=second/36000;

}

void scan()

{

}

我给你推荐一款,是我自己用的这款,比较好,开发时自己的机子要有并口,价格是168rmb,免邮

2008-7-7--------2008-9-1 为暑期促销特价期 原价168元 现特价150元!! 配置不变 锐志电子单片机普及计划 让学习者花最少的钱 学到最多的知识

此款是有并口电脑所用的配置利用并口ISP线烧写程序

(没有并口的电脑 但是有串口的可以采用STC89C52芯片 利用串口下载程序 购买时请说明 我们会配STC89C52芯片)

本实验板是锐志电子开发的一款多功能51综合学习实验板。 是经过研究和分析市面上的多种实验板后, 取其所长,弊其所短短 研发而成。 所以对于学习者来说, 性价比是很高的。 花最少的钱, 学到最多的知识, 这就是锐志电子单片机普及计划的宗旨。

本实验板是集单片机编程、 仿真(须配仿真芯片)、 实验、下载线 多种功能为一体, 该51单片机学习实验板除了支持ATmel公司的AT89S所有系列之外,还支持STC的所有系列增强型51单片机和SST系列的增强型51单片机的实验、编程与仿真功能,支持的被编程芯片数量达100之多;是一款真正具有物超所值的51单片机多功能板。

功能特点

编程器、仿真器、实验板、ISP下载线四合一

直接支持Atmel 89系列,AVR AT90S8515,Atmega8515系列单片机的烧写,

提供丰富的实验例程,附带C源代码和少量汇编源码,并且附带详细的注解说明(C语言是未来的趋势 所以我们提倡使用C开发 附带汇编源码较少)

编程与实验共享唯一的锁紧插座,串行下载与仿真共享同一串口, *** 作方便

内置完善的过载、短路保护功能

直接使用计算机USB接口供电,也可以接电源适配器供电板载7805稳压IC 保证其他电源供电时 实验板工作的稳定。

带有电源开关实验更加方便 再也不用频繁拔实验板电源线了 轻轻一按 即可通断。

直接将器件放在开发系统锁紧座上进行编程,可单独作编程器使用

直接在锁紧座上放上仿真芯片连上串口 稍作设置 即可进行仿真。

板载丰富的实验硬件资源,P0 P1 P2 P3 四个IO口 全部可扩展设计 真正的满足学习者的需要通过自己连接IO口线路 可以完成任何复杂的51单片机实验

配有ISP下载口 配合本实验板标配的89S52单片机 就可不用任何编程器 也不用将芯片取下就可直接完成烧写编程工作 十分方便, 烧写完毕即可自动演示。实验过程中无需拔插任何电缆和芯片,也无需切换电源,可轻松地将编绎好的代码下载到实验板上进行验证或演示,整个过程只需利用鼠标 *** 作即可,方便快捷。

实验板资源配置如下:

1、此款采用并口ISP下载线,配AT89S52单片机,可以很方便的下载程序到单片机。下载后不用插拔线缆, 下载好后自动直接运行程序。

2、USB供电系统,直接插接到电脑USB口即可提供电源,不需另接直流电源。

3、8位数码管(可做数码管的静态扫描以及动态扫描显示实验 不如 0-999 计数器实验 18B20温度检测实验 遥控解码实验等都可以用数码管显

示)。

4、8位LED发光二极管(做 跑马灯实验 交通灯实验 )。

5、一路继电器控制(通过继电器可以控制其他电器设备的工作低压控制高压等实验 不过为了安全 建议不要控制电压超过30V的设备)

6、蜂鸣器(做单片机发声实验 播放音乐实验 报警实验等声响实验)

7、DS18B20温度传感器,(初步掌握单片机 *** 作后即可亲自编写程序获知当时的温度 可以配合本站原创的PC与单片机双向温度控制程序 将温

度实时显示在电脑上)

8、AT24C08外部EEPROM存储芯片(IIC总线元件实验)

9、SPI串行实时时钟 DS1302(熟悉SPI总线 用DS1302可以做一个万年历电子时钟 比定时器做的精确很多哦)

10、 板上集成一体化红外接收头(方便学习红外遥控接收 解码实验 还可以通过遥控控制电脑 本站原创的红外遥控解码控制电脑音乐播放实例可以让学习者 学习 体验用遥控器控制电脑的乐趣)

11、MAX232芯片RS232通讯接口(可以做为与计算机通迅的接口同时也可做为STC单片机下载程序的接口及仿真调试的接口)

12、字符液晶1602LCD接口 采用接插件方式方便插拔(可显示两行 每行16个 共计32任意 ASCII码字符 它的功能应用比数码管丰富很多 显示

的信息量更大 我们已经随板附赠了1602LCD 方便学习者开发1602LCD显示的程序)

13、图形点阵液晶12864接口 采用接插件方式方便插拔(可显示任意汉字和图形 是目前单片机 图文显示最常用的显示器件 我们实验板支持带字库的12864液晶 开发程序更方便 12864液晶不随板附赠 需单独购买 我们成本价70元提供带字库的支持对比度调节12864液晶)

14、44矩阵键盘(熟悉矩阵键盘编码、解码扫描原理 可作为人机输入接口 编写按键输入程序)

15、4个独立键盘(可做普通独立按键检测试验 本实验板4个独立按键采用跳线设计 考虑周全 可以通过跳线连接任意P口 方便学习者做 外中

断INT0 INT1 外定时器T0 T1 实验)。

16、单片机32个IO口全部引出 端口扩展设计采用双排跳线帽设置,如果跳线帽拔掉,完全可以做最小系统,真正发挥你的开发才能 便于你今后的开发。

17、为方便大家更换晶体振荡器(单片机“超频”)特别采用了镀金晶体插座,做实验时需要不同晶振频率时 可很方便的插拔更换(我们随板赠送三个不同频率的晶振 110592MHZ、12MHZ、24MHZ各一个 最大程度上满足了学习者的需要)

18、本实验板带有51单片机 和AVR单片机的切换开关通过开关轻轻波动一下直接就可以使用ATMEGA8515等AVR系列单片机做AVR实验,真正做到物尽其用。为51学习者将来学习AVR单片机节省了再次购买AVR实验板的成本,所以我们的实验板非常超值。

19、ISP下载接口(用并口ISP下载线或者其他的兼容ISP下载线 可以对AT89S51 S52 ATMEGA8515 AT90S8515单片机直接编程。)

20、本实验板采用40PIN锁紧座安放单片机芯片,非常方便单片机芯片的取放。

21、本实验板 板上带有外接电源接口 方便使用外接电源为单片机供电。

22、实验板 带有 +5V 和地线扩展口 方便用户扩展其他外围电路时取电

本实验板附带的试验程序:

产品规格:长X宽X高 = 120x100x20(mm)

产品装箱清单:

RZ-51/AVR实验板一台

USB取电线一条

串口通讯电缆一条

AT89S52单片机一片

1602LCD字符液晶模块一块

并口ISP下载线一条

12M 110592M 24M 晶振各一个

10根杜邦连接线

10个备用跳线帽

700MB的51学习资料光盘一张(光盘中含本实验板所有例程 每个例程里都有实验指导文档,方便学习者做实验。实验板PDF格式原理图,实验板使用说明文件、STC单片机程序下载软件,ISP下载线软件 大量KEIL51学习资料及教程 串口调试软件 还有本站原创的串口控制单片机 双向通讯的智能温控报警系统 上位机程序源码 和单片机程序源码)

我们所有器件都采用防静电袋包装 外包装采用泡沫防震包装 邮政标准7#箱 包装专业 避免运输过程出现损坏

发货前每项功能均已严格测试 保证质量 请放心购买。

我们长期从事单片机程序开发 和PC程序开发 可为客户提供很好的技术支持。

每天早上8:00到晚上12:00都会在线 随时为客户提供专业的技术支持。

部分实验:

本站原创 单片机温控+VB上位机温度检测实验VB上位机

(可设定报警温度 并有实时温度曲线图 附赠全部源码。有很大的应用价值)

本站原创 单片机S52 控制上位机VB 制作成的 VB红外遥控电脑播放器 上位机

(可自定义遥控器的键值 支持市面上大部分遥控器 可进行 磁盘选择 目录选择 歌曲选择 音量调节 播放/暂停 静音 还有播放视频时全屏等 *** 作 可以说是一个完整的功能强大的红外遥控播放器 和遥控DVD 没什么区别 非常实用。全部源码 均在光盘中赠送。。)

自定义遥控键值

近一个月销售记录 众多买家的选择证明 我们的实验板非常超值。。

使用单片机专用的编译器,比如AVR单片机要用ICC for AVR、AVR Studio 等。然后在选项中选择单片机型号,比如ATmega16、ATmega128。最后要查询单片机所对应的库,也就是头文件。包含对应的头文件,头文件中有定义好的单片机的变量名和函数,写程序要用到,比如引脚可能定义为PORTA,这些要记住,不可以写其他的变量名。具体写程序,和普通的C程序没有什么区别。

以上就是关于汇编语言(面向机器的程式设计语言)详细资料大全全部的内容,包括:汇编语言(面向机器的程式设计语言)详细资料大全、ATmega16单片机如何c语言倍频让单步执行速度提高,本来应该和51一样,都是1M,怎么提高、AVR单片机(atmega16)的us级延时程序,用于DS18B20等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9347691.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存