当前位置:文档之家› 汇编语言作用

汇编语言作用

汇编语言作用
汇编语言作用

汇编语言

本词条介绍的是汇编语言(面向机器的程序设计语言),更多含义,请参阅“汇编语言(多义词)”。

汇编语言(Assembly Language)是面向机器的程序设计语言。在汇编语言中,用助记符(Memoni)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址,如此就增强了程序的可读性并且降低了编写难度,象这样符号化的程序设计语言就是汇编语言,因此亦称为符号语言。使用汇编语言编写的程序,机器不能直接识别,还要由汇编程序或者叫汇编语言编译器转换成机器指令。汇编程序将符号化的操作代码组装成处理器可以识别的机器指令,这个组装的过程称为组合或者汇编。因此,有时候人们也把汇编语言称为组合语言。

目录

1简介

2优缺点

2.1 优点

2.2 缺点

3应用

4特点

5经典教材

5.1 x86处理器

5.2 ARM及单片机

6编译环境

7x86处理器指令集

7.1 数据传送指令

7.2 整数和逻辑运算指令

7.3 移位指令

7.4 位操作指令

7.5 条件设置指令

7.6 控制转移指令

7.7 串操作指令

7.8 输入输出指令

7.9 高级语言辅助指令

7.10 控制和特权指令

7.11 浮点和多媒体指令

7.12 虚拟机扩展指令

8发展前景

1简介

汇编语言是直接面向处理器(Processor)的程序设计语言。处理器是在指令的控制下工作的,处理器可以识别的每一条指令称为机器指令。每一种处理器都有自己可以识别的一整套指令,称为指令集。处理器执行指令时,根据不同的指令采取不同的动作,完成不同的功能,既可以改变自己内部的工作状态,也能控制其它外围电路的工作状态

如图所示,在电路中,每条机器指令都表现为一组电信号,通过一排导线进入处

[1]

理器。这些电信号有的呈高电平,有的呈低电平,哪些为高,哪些为低,取决于不同的机器指令。如果把高电平记为“1”,低电平记为“0”,那么,不同的机器指令将表现为不同的二进制序列,由于它们的无规律性,这就使得机器指令难以理解、书写和记忆

人类最容易接受自己每天都使用的自然语言。为了使机器指令的书写和理解变得容易,需要借鉴自然语言的优点,为此就引入了汇编语言。汇编语言使用符号来代表不同的机器指令,而这些符号非常接近于自然语言的要素。基本上,汇编语言里的每一条指令,都对应着处理器的一条机器指令。

汇编语言包括两个部分:语法部分和编译器。语法部分提供与机器指令相对应的助记符,方便指令的书写和阅读。当然,汇编语言的符号可以被人类接受,但不能被处理器识别,为此,还要由汇编语言编译器将这些助记符转换成机器指令。

根据应用领域的不同,处理器的种类繁多,比如用于工业控制和嵌入式计算的Z80、MC68000和MCS-51、广泛应用于个人计算机的INTELx86系列,以及基于ARM体系结构的处理器,包括苹果公司在内的大企业都是ARM的客户。事实上,今天的ARM是最受欢迎的32位嵌入式处理器,而且,今天的ARM处理器比INTEL奔腾系列卖得还多,基本上是3:1的比例。

不同的处理器有不同的指令集。正是因为这个原因,每一种处理器都会有自己专属的汇编语言语法规则和编译器。即使是同一种类型的处理器,也可能拥有不同的汇编语言编译器。一个明显的例子是INTEL x86系列的处理器,围绕它就开发出好多种编译器来,如MASM、NASM、FASM、TASM和A T&T等。而且,这每一种编译器,都使用不同的语法。

2优缺点

优点

1、因为用汇编语言设计的程序最终被转换成机器指令,故能够保持机器语言的一致性,直接、简捷,并能像机器指令一样访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等。使用汇编语言,可以访问所有能够被访问的软、硬件资源。

2、目标代码简短,占用内存少,执行速度快,是高效的程序设计语言,经常与高级语言配合使用,以改善程序的执行速度和效率,弥补高级语言在硬件控制方面的不足,应用十分广泛。

缺点

1、汇编语言是面向机器的,处于整个计算机语言层次结构的底层,故被视为一种低级语言,通常是为特定的计算机或系列计算机专门设计的。因此,不同的处理器有不同的汇编语言语法和编译器,编译的程序无法在不同的处理器上执行,缺乏可移植性;

2、难于从汇编语言代码上理解程序设计意图,可维护性差,即使是完成简单的工作也需要大量的汇编语言代码,很容易产生bug,难于调试;

3、使用汇编语言必须对某种处理器非常了解,而且只能针对特定的体系结构和处理器进行优化,开发效率很低,周期长且单调。

3应用

历史上,汇编语言曾经是非常流行的程序设计语言之一。随着软件规模的增长,以及随之而来的对软件开发进度和效率的要求,高级语言逐渐取代了汇编语言。但即便如此,高级语言也不可能完全替代汇编语言的作用。就拿Linux内核来讲,虽然绝大部分代码是用C语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码。由于这部分代码与硬件的关系非常密切,即使是C语言也会显得力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能。

首先,汇编语言的大部分语句直接对应着机器指令,执行速度快,效率高,代码体积小,在那些存储器容量有限,但需要快速和实时响应的场合比较有用,比如仪器仪表和工业控制设备中。

其次,在系统程序的核心部分,以及与系统硬件频繁打交道的部分,可以使用汇编语言。比如操作系统的核心程序段、I/O接口电路的初始化程序、外部设备的低层驱动程序,以及频繁调用的子程序、动态连接库、某些高级绘图程序、视频游戏程序等等。

再次,汇编语言可以用于软件的加密和解密、计算机病毒的分析和防治,以及程序的调试和错误分析等各个方面。

最后,通过学习汇编语言,能够加深对计算机原理和操作系统等课程的理解。通过学习和使用汇编语言,能够感知、体会和理解机器的逻辑功能,向上为理解各种软件系统的原理,打下技术理论基础;向下为掌握硬件系统的原理,打下实践应用基础。

4特点

1.机器相关性。

这是一种面向机器的低级语言,通常是为特定的计算机或系列计算机专门设计的。因为是机器指令的符号化表示,故不同的机器就有不同的汇编语言。使用汇编语言能面向机器并较好地发挥机器的特性,得到质量较高的程序。

2.高速度和高效率。

汇编语言保持了机器语言的优点,具有直接和简捷的特点,可有效地访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等,且占用内存少,执行速度快,是高效的程序设计语言。

3.编写和调试的复杂性。

由于是直接控制硬件,且简单的任务也需要很多汇编语言语句,因此在进行程序设计时必须面面俱到,需要考虑到一切可能的问题,合理调配和使用各种软、硬件资源。这样,就不可避免地加重了程序员的负担。与此相同,在程序调试时,一旦程序的运行出了问题,就很难发现。

5经典教材

汇编语言教材很多,各种处理器都有涉及,粗略统计不下百种。在这么多的教材里,用得较多的可以分类列举如下:

x86处理器

1.《x86汇编语言:从实模式到保护模式》,李忠著,电子工业出版社,2013-1 。

[1]

基于INTEL x86处理器、NASM编译器和BOCHS虚拟机。汇编语言就是处理器的语言,从这个意义上来说,既然学习汇编语言,就必须直接面向硬件编程,而不是使用莫名其妙的DOS中断和API调用。这是一本有趣的书,它没有把篇幅花在计算一些枯燥的数学题上。相反,它教你如何直接控制硬件,在不借助于BIOS、DOS、Windows、Linux或者任何其他软件支持的情况下来显示字符、读取硬盘数据、控制其他硬件等。

我们知道,32位和64位是主流,实模式和DOS操作系统已经成为历史,Linux和Windows 都工作在保护模式下。这本书从实模式讲到32位保护模式,尤其以32位保护模式为重点,阅读本书,对理解现代计算机和现代操作系统的工作原理有非常大的帮助作用。

2.《汇编语言》(第2版),王爽著,清华大学出版社,2008-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.《零基础学A VR单片机》,徐益民等编著,机械工业出版社,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汇编语言程序设计的专著。

6编译环境

用汇编语言等非机器语言书写好的符号程序称为源程序,汇编语言编译器的作用是将源程序翻译成目标程序。目标程序是机器语言程序,当它被安置在内存的预定位

置上后,就能被计算机的CPU处理和执行。

汇编的调试环境总的来说比较少,也很少有非常好的编译器。编译器的选择依赖于目标处理器的类型和具体的系统平台。一般来说,功能良好的编译器用起来应当非常方便,比如,应当可以自动整理格式、语法高亮显示,集编译、链接和调试为一体,方便实用。

对于广泛使用的个人计算机来说,可以自由选择的汇编语言编译器有MASM、NASM、TASM、FASM、RADASM等,但大都不具备调试功能。如果是为了学习汇编语言,轻松汇编因为拥有一个完善的集成环境,是一款非常适合初学者的汇编编译器。

7x86处理器指令集

数据传送指令

这部分指令包括通用数据传送指令MOV、条件传送指令CMOVcc、堆栈操作指令PUSH/PUSHA/PUSHAD/POP/POPA/POPAD、交换指令XCHG/XLAT/BSW AP、地址或段描述符选择子传送指令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、等待指令W AIT/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/VMPTRS

T/VMREAD/VMWRITE/VMXOFF/VMON等。

8发展前景

汇编语言是机器语言的助记符,相对于比枯燥的机器代码易于读写、易于调试和修改,同时优秀的汇编语言设计者经过巧妙的设计,使得汇编语言汇编后的代码比高级语言执行速度更快,占内存空间少等优点,但汇编语言的运行速度和空间占用是针对高级语言并且需要巧妙设计,而且部分高级语言在编译后代码执行效率同样很高,所以此优点慢慢弱化。而且在编写复杂程序时具有明显的局限性,汇编语言依赖于具体的机型,不能通用,也不能在不同机

型之间移植。常说汇编语言是低级语言,并不是说汇编语言要被弃之,相反,汇编语言仍然是计算机(或微机)底层设计程序员必须了解的语言,在某些行业与领域,汇编是必不可少的,非它不可适用。只是,现在计算机最大的领域为IT软件,也是我们常说的计算机应用软件编程,在熟练的程序员手里,使用汇编语言编写的程序,运行效率与性能比其它语言写的程序相对提高,但是代价是需要更长的时间来优化,如果对计算机原理及编程基础不扎实,反而增加其开发难度,实在是得不偿失,对比2010年前后的软件开发,已经是市场化的软件行业,加上高级语言的优秀与跨平台,一个公司不可以让一个团队使用汇编语言来编写所有的东西,花上几倍甚至几十倍的时间,不如使用其它语言来完成,只要最终结果不比汇编语言编写的差太多,就能抢先一步完成,这是市场经济下的必然结果。

但是,迄今为止,还没有程序员敢断定汇编语言是不需要学的,同时,汇编语言(Assembly Language)是面向机器的程序设计语言,设计精湛的汇编程序员,部分已经脱离软件开发,挤身于工业电子编程中。对于功能相对小巧但硬件对语言设计要求苛刻的行业,如4位单片机,由于其容量及运算,此行业的电子工程师一般负责从开发设计电路及软件控制,主要开发语言就是汇编,c语言使用只占极少部分,而电子开发工程师是千金难求,在一些工业公司,一个核心的电子工程师比其它任何职员待遇都高,对比起来,一般电子工程师待遇是程序员的十倍以上。这种情况是因为2012年的现在学习汇编的人虽然也不少,但是真正能学到精通的却不多,它相对于高级语言难学,难用,适用范围小,虽然简单,但是过于灵活,学习过高级语言的人去学习汇编比一开始学汇编的人难得多,但是学过汇编的人学习高级语言却很容易,简从繁易,繁从简难。对于一个全面了解微机原理的程序员,汇编语言是必修语言。

《汇编语言》课程培训心得体会

《汇编语言》课程培训心得体会 各位读友大家好,此文档由网络收集而来,欢迎您下载,谢谢 2011年6月17日至19日,本人参加了教育部全国高校教师网络培训中心举办的汇编语言课程培训,曹老师和毛老师所做的精彩讲解,令本人深有感触,有非常大的收获。 汇编语言是计算机专业的一门重要专业课,是很多其他课程的先导课程,比如数据结构、操作系统、编译原理等,一般来说,开设汇编之前学生们之前一般已经学习了至少一门高级语言,比如C 语言。学好汇编语言,能够指导学生们学习和理解计算机系统以及程序设计思想。汇编语言在计算机专业课程中处于重要的地位。 在学习汇编之前,学生没有一点底层编程经验,汇编语言中的内容,学生们基本上都没有概念,尤其对于二本的

学生来说,理解和掌握汇编语言还是比较困难的。这就需要授课教师不断改进自己的教学思想,提高自己的教学水平,以适应学生的需求。 这里,本人很认同曹教授所说的。可以按照学生的类型分班进行教学,这样,对不同的学生可以有不同的要求,做到因材施教,令所有学生都能在课程中有所收获。而不是很多学生觉得课程过难,听不懂,接受不了;另外一些同学又觉得对课程的学习意犹未尽。当然,在大部分学校,现在时机可能还不成熟,需要学校和授课教师改变思路,付出更多。课程中对学生的考核是很重要的,考试成绩应该说是一个比较客观的衡量方式,但又不足以让老师完全学生的情况。除了期末考试之外,平时上课和上机的考查也非常重要。在课堂上,可以用提问和随堂留题目当堂上交的方法来代替点名,这样,在督促学生上课的同时,也掌握了一些学生的学习情况,及时得到学生的反馈。上机的时候,可以

挑选内容让学生讲解或重做,督促学生学习,同时掌握学习情况,分析教学中的问题,以便解决。而实验报告,个人认为,更应该侧重于学生的收获和遇到问题的总结上面,这样可以为改进教学提供素材,同时掌握学生上机的情况。 另外,对于二本院校的学生来说,个人认为教学中需要注意很多问题,教学中不应过于追求难度和广度,而是应该让学生实实在在学到一些知识,激发学生的兴趣,增强学生的信心。需要老师在备课过程中精心准备,要求学生掌握的基本知识应该用不同方式反复强调,教学中重点要突出。汇编中的有些概念,学生是比较难理解的,所以例题要认真挑选,讲解的PPT要更生动形象,便于帮助学生理解。 以上就是这门课程学习后,我的一点不成熟的想法和体会。 梁琦 各位读友大家好,此文档由网络收集而来,欢迎您下载,谢谢

汇编语言之应用程序设计

第10章应用程序的设计 在前面各章节中,我们侧重介绍了汇编语言程序设计中各组成部分的作用,本章的重点是对前面所学知识的综合运用。希望通过各种不同类型的例子,使读者能够掌握用汇编语言编程的基本技巧。 10.1 字符串的处理程序 字符或字符串是一类重要的非数值计算的处理对象。许多编辑软件都具有字符串查找、替换、大小写的转换、单词的自动识别等功能,网络上的信息搜索也是现在一种常用的功能等,这些功能的实现无疑都要涉及到字符串的处理功能。 为了方便对字符串的处理,各种常用的编程环境也都给予了足够的支持。如:C语言编程环境提供了大量处理字符串的标准函数,象strlen、strcmp和strcpy 等函数;C++、VC或VB等编程环境提供了字符串类String等。这些函数或类大大方便了程序员的编程。 在计算机系统内,为了加快字符串的处理,在其指令系统中设置了多条处理字符串的指令,其详细内容请参阅第5.2.11节中的介绍。 下面我们将通过几个例子来学习汇编语言处理字符串的方法。 例10.1 编写一个求字符串长度的子程序Strlen,要求字符串的首地址为入口参数,且以ASCII码0为结束符,CX为出口参数,其存放该字符串的长度。 解: .MODEL SMALL, C .DATA buff D B "This is a example.", 0 .CODE Strlen P ROC USES AX BX, String:PTR BYTE MOV BX, String XOR CX, CX MOV AL, [BX] .WHILE AL!=0 INC CX INC BX MOV AL, [BX] .ENDW RET Strlen E NDP .STARTUP INVOKE Strlen, ADDR buff

汇编语言知识大全

第一章基础知识: 一.机器码:1.计算机只认识0,1两种状态。而机器码只能由0,1组成。故机器码相当难认,故产生了汇编语言。 2.其中汇编由三类指令形成:汇编指令(有机器码对应),伪指令,其他符号(编译的时候有用)。 每一总CPU都有自己的指令集;注意学习的侧重点。 二.存储器:1.存储单元中数据和指令没任何差别。 2.存储单元:Eg:128个储存单元(0~127)128byte。 线: 1.地址总线:寻址用,参数(宽度)为N根,则可以寻到2^N个内存单元。 据总线:传送数据用,参数为N根,一次可以传送N/8个存储单元。 3.控制总线:cpu对元器件的控制能力。越多控制力越强。 四.内存地址空间:1.由地址总线决定大小。 2.主板:cpu和核心器件(或接口卡)用地址总线,数据总线,控制总 线连接起来。 3.接口卡:由于cpu不能直接控制外设,需通过接口卡间接控制。

4.各类存储器芯片:RAM,BIOS(主板,各芯片)的ROM,接卡槽的 RAM CPU在操控他们的时候,把他们都当作内存来对待,把他们总的看作一个由 若干个存储单元组成的逻辑存储器,即我们所说的内存地址空间。 自己的一点理解:CPU对内存的操作是一样的,但是在cpu,内存,芯片之间的硬件本身所牵扯的线是不同的。所以一些地址的功能是对应一些芯片的。 第二章寄存器 引入:CPU中含有运算器,寄存器,控制器(由内部总线连接)。而寄存器是可以用来指令读写的部件。8086有14个寄存器(都是16位,2个存储空间)。 一.通用寄存器(ax,bx,cx,dx),16位,可以分为高低位 注意1.范围:16位的2^16-1,8位的2^8-1 2.进行数据传送或运算时要注意位数对应,否则会报错 二.字:1. 1个字==2个字节。 2. 在寄存器中的存储:0x高位字节低位字节;单元认定的是低单元 数制,16进制h,2进制b

C语言与汇编语言互相调用

浅谈C程序中调用汇编模块的方法 C语言是目前非常流行的一种编程语言,除具有高级语言使用方便灵活、数据处理能力强、编程简单等优点外,还可实现汇编语言的大部分功能,如可直接对硬件进行操作、生成的目标代码质量较高且执行的速度较快等。所以在工程上对硬件处理速度要求不很高的情况下,基本可以用C代替汇编语言,编写接口电路的控制软件。但C也不能完全取代汇编语言,如在一些对速度要求很高的实时控制系统中,以及对硬件的特殊控制方面,C有时也不能完全很好胜任,还需要汇编语言来编写。因为汇编语言目标代码更精练,对硬件直接控制能力更强和执行速度更快,但汇编语言编程烦难、表达能力差也显而易见。比较好的解决办法是C与汇编语言混合编程,即用C编写软件的调度程序、用户界面以及速度要求不高的控制部分,而用汇编语言对速度敏感部分提供最高速度的处理模块,供C调用。这种方法提供了最佳的软件设计方案,做到了兼顾速度效率高和灵活方便。由于本人的毕业设计需要C 程序中调用汇编模块的方法来提高ARM定点指令的执行速度,故对这方面进行了学习。学习心得如下: 对于C和汇编语言的接口主要有两个问题需要解决。 一、调用者与被调用者的参数传递 这种数据传递通过堆栈完成,在执行调用时从调用程序参数表中的最后一个参数开始,自动依次压入堆栈;将所有参数压入堆栈后,再自动将被调用程序执行结束后的返回地址(断点)压入堆栈,以使被调程序结束后能返回主调程序的正确位置而继续执行。例如一调用名为add汇编程序模块的主函数:main( ){...... add(dest,op1,op2,flages);......}。在此例中对主函数进行反汇编,主函数在调用add函数前自动组织的堆栈。 . . . lea 0xfffffffe8(%ebp),%eax #flages数组的首地址入栈 push %eax pushl 0xfffffff8(%ebp) #OP2入栈 pushl 0xfffffffc(%ebp) #OP1 入栈 pushl 0xfffffff0(%ebp) #dest地址入栈 call 0x80483f0 #调用add函数 . . 执行完add调用语句后,栈内数据结果如图一所示。 进入汇编子程序后,为了能正确获取主调程序并存入堆栈中的数据,被调的汇编子程序先后要做如下一些工作: 1、保存esp的副本 进入汇编子程序后,子程序中免不了要有压栈和出栈的操作,故ESP时刻在变化。为了能用ESP访问堆栈中的参数,安全办法是一进入子程序后,先为ESP制副本,以后对传递参数的访问都用副本进行。一般可用EBP保存ESP,如: push %ebp mov %ebp,%esp

《汇编语言》段总结

《汇编语言》段总结 我们可以可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元。这完全是我们自己的安排。 “段地址”这个名称中包含着“段”的概念。这种那个说法可能对一些学习者产生了误导【呵呵,曾经有一段时间真的误导了我,有时我禁不住在想为什么会被误导,那是因为我没有真懂。】,使人误以为内存被划分了一个一个的段,每一个段有一个段地址。如果我们在一开始形成了这种认识,将影响以后对汇编语言的深入理解和灵活应用。 其实,内存并没有分段,段的划分来自于CPU,由于8086CPU用“基础地址(段地址x16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。 这就好比水杯,水杯并没有给自己刻度,刻度的划分来自于人类。 我们为什么进行这样的安排?因为这可使得我们可以用分段的方式来管理内存,即为了方便、有序的管理内存。 这就是人类的伟大之处,一个没有生命的东西,如果我们给它一个设定,并对这个设定赋予思想,这个被我们设定的没有生命的东西就会以生命的形式存在。 我们可以用一个段存放数据,将它定义为“数据段”; 我们可以用一个段存放代码,将它定义为“代码段”; 我们可以用一个段当作栈,将它定义为“栈段”; 我们可以这样安排。但若要让CPU按照我们的安排来访问这些段,就要: 对于数据段,将它的段地址放在DS中,用mov、add、sub等访问内存单元的指令时,CPU就将我们定义的数据段中的内容当作数据来访问; 对于代码段,将它的段地址放在CS中,将段中第一条指令的偏移地址放在IP中,这样CPU就将执行我们定义的代码段中的指令; 对于栈段,将它的段地址放在SS中,将栈顶单元的偏移地址放在SP中,这样CPU在需要进行栈操作的时候,比如执行push、pop指令等,就将我们定义的栈段当作栈空间来使用。 其实,CS相当于一个指挥部,负责勘探,作战计划的制定、部署等。即任意时刻,CPU将CS:IP指向的内容当作指令执行。 而DS就相当于一个中转部,负责将CS制定出的计划传达,比如作战人员、物质等。 SS就相当于最终的实际的执行者,因为战场在内存中,SS接收到DS传送的CS制定出的计划,及作战人员、物质等开始作战。 总结:CPU相当于一个作战机构,而内存相当于战地。CS、DS及SS用的是望远镜原理,但这个望远镜带有照相功能,其实质是数字记位法。 可见,不管我们如何安排,CPU将内存中的某段内容当作代码,是因CS:IP指向了那里;CPU将某段内存当作栈,是因为SS:SP指向了那里。 我们一定要清楚,什么是我们的安排,以及如何让CPU按我们的安排行事。要非常清楚CPU的工作机理,才能控制CPU按照我们的安排运行的时候做到游刃有余。

关于汇编语言的问题

简要回答一下关于汇编语言的问题: (1)在汇编语言行格式中,symbol在指令前通常称为什么?在某些指示符前通常称为什么? 答:行格式中symbol通常是标号,在指令或伪指令前它总是标号,在某些指示符前它是表示变量或常量的符号。 (2)对某些伪指令,如何区分是ARM伪指令还是Thumb伪指令?答:相同的伪指令出现在程序中Thumb代码区,汇编器识别为Thumb 伪指令;出现在ARM代码区汇编器识别为ARM伪指令。 (3)符号与标号、标号与局部标号有哪些区别? 答:标号是一种符号,代表存储器中指令或数据的地址,在汇编期间通过计算,得到标号的地址。局部标号用在指令中,指出分支的目标处。它们不能用于数据。 (4)变量有哪几种类型? 答:数值;逻辑;串。 (5)举例说明如何从ARM指令分支到Thumb指令,如何从Thumb 指令分支到ARM指令,写一个完整的汇编程序。 答:ADR R1,Goto_THEMB+1 ADR R2,Back_ARM BX R1 BX R2 . . . . . . CODE16 ALIGN

Goto_THUMB CODE32 . Back_ARM . . . . (6)编写一个完整的程序,说明程序的结构。 答:AREA example,CODE,READONLY ENTRY Run1 MOV r1,#20 MOV r2,#15 SUB r1,r1,r2 ; Stop MOV r0,#0x18 LDR r1,=0x20026 SWI 0x123456 END 结构:定义区域的AREA指示符;声明汇编程序入口点的ENTRY指示符;应用程序执行;应用程序终止;源程序结束的END指示符。(7)可以在代码区域定义数据吗?如果可以,举例说明如何定义,要注意些什么。 答:可以定义。 举例说明: AREA test,CODE

32位80x86汇编语言ptr指令学习笔记

阅读反汇编后的汇编程序挺麻烦,尤其是在c语言程序的子函数参数中有数组参数,同时当子函数里有循环操作时,反汇编后的代码中频繁出现ptr指令操作。该指令的用法十分灵活,有时候读入(或写入)的是某内存地址,有时候读入(写入)的是某内存地址中存储的值,初学时总感觉很迷惑,分不清什么时候读内存地址,什么时候读内存地址中值,参考相关文献和书籍后作如下总结。 例如一段简单的C语言程序: int mywork(int a[9], int b[9], int c[9]) { int i; for ( i=0; i<9; i++) c[i] =a[i] +b[i]; } 这段代码debug版反汇编后代码很简单,但是里面有许多小细节值得推敲。 int mywork(int a[9], int b[9], int c[9]) ;原c代码 … … ;这里为开始调用函数时当前寄存器数据保存 for ( i = 0 ; i < 9 ; i ++) mov dword ptr [i], 0;这里为i初始化,值为0 jmp mywork+xx1h ;进入循环体内部 mov eax, dword ptr [i]; add eax, 1 mov dword ptr [i], eax mywork+xx1h:cmp dword ptr [i], 9 jge mywork+xx2h ;如果i等于或大于9,跳出循环 c[i] =a[i] +b[i]; mov eax, dowrd ptr [i] ;读入参数i mov ecx, dword ptr [a] ;这里是读入参数数组a的首地址 mov edx, dword ptr [b] ;这里是读入参数数组b的首地址 mov eax, dword ptr [ecx + eax*4] ;读入a add eax, dword ptr [edx +eax*4] ; eax = a[i]+b[i] mov edi, dword ptr [c] ;这里是读入参数数组c的首地址 mov dword ptr [edi+ eax*4], eax ;这里保存计算结果,c[i]= a[i]+b[i] inc eax jmp mywork+xx1h mywork+xx2h: … … ;一些数据恢复操作,主要是出栈等 ret 文中用红色标记处两处涉及ptr指令的地方。 第一处为mov eax, dword ptr [i] 本条mov指令的结果是将变量i的值读入到eax寄存器中,至于从i变量存储地址处读取几个字节,由dword修饰符指定(4个字节)。 第二处为mov ecx, dword ptr [a] 这里表示将参数数组a的首地址读入到ecx寄存器中。 同样两个mov 寄存器, dword ptr [变量]操作,为何第一个寄存器eax读入数值,而第二个ecx寄存器读入的为地址呢?

浅谈计算机编程语言的发展

浅谈计算机编程语言的发展 信息学院103班潘红10263210 摘要:一九九三年美国的克林顿政府提出了“信息高速公路”计划,从而在这十多年间在全球范围内引发了一场信息风暴,信息技术几乎触及了现代生活的方方面面,毫不夸张的说没有了信息技术,现代文明的生活将无从谈起;作为信息技术中最重要的部分,计算机技术无疑是其发展的核心问题,而我们知道计算机只是一台机器,它只能按照计算机语言编好的程序执行,那么正确认识计算机语言的过去和未来,就是关系到计算机发展的重中之重。1.引言 在计算机科学中,编程语言是用来编写可被计算机运行的一系列指令(计算机程序)的人工语言,于英语等自然语言相类似,编程语言具有词汇、语法和句法。然而,自然语言不适合计算机编程,因为它们能引起歧义,也就是说它们的词汇和语法结构可以用多种方式进行解释。用于计算编程的语言必须具有简单的逻辑结构,而且它们的语法、拼写和标点符号的规则必须精确。 2.计算机编程语言的发展历史 二十世纪四十年代当计算机刚刚问世的时候,程序员必须手动控制计算机。当时的计算机十分昂贵,唯一想到利用程序设计语言来解决问题的人是德国工程师楚泽(konrad zuse)。几十年后,计算机的价格大幅度下跌,而计算机程序也越来越复杂。也就是说,开发时间已经远比运行时间来得宝贵。于是,新的集成、可视的开发环境越来越流行。它们减少了所付出的时间、金钱(以及脑细胞)。只要轻敲几个键,一整段代码就可以使用了。这也得益于可以重用的程序代码库。随着c,pascal,fortran,等结构化高级语言的诞生,使程序员可以离开机器层次,在更抽象的层次上表达意图。由此诞生的三种重要控制结构,以及一些基本数据类型都能够很好的开始让程序员以接近问题本质的方式去思考和描述问题。随着程序规模的不断扩大,在60年代末期出现了软件危机,在当时的程序设计模型中都无法克服错误随着代码的扩大而级数般的扩大,以至到了无法控制的地步,这个时候就出现了一种新的思考程序设计方式和程序设计模型-----面向对象程 序设计,由此也诞生了一批支持此技术的程序设计语言,比如eiffel,c++,java,这些语言都以新的观点去看待问题,即问题就是由各种不同属性的对象以及对象之间的消息传递构成。面向对象语言由此必须支持新的程序设计技术,例如:数据隐藏,数据抽象,用户定义类型,继承,多态等等。 3.计算机编程语言的发展现 目前通用的编程语言有两种形式:汇编语言和高级语言。 2.1汇编语言 汇编语言的实质和机器语言是相同的,都是直接对硬件操作,只不过指令采用了英文缩写的标识符,更容易识别和记忆。计算机编程人员用汇编语言使机器语言程序编写起来更简单一些。在汇编语言中,每条语句大致对应一条机器语言指令。汇编语言的语句是借助易于记忆的命令编写的。在典型的汇编语言

《汇编语言程序设计》学习心得自主学习报告.doc

自主学习报告书 题目:学习汇编语言程序设计报告学习课程:《汇编语言程序设计》姓名: 专业: 学号: 福建工程学院国脉信息学院教务处制 二○一二年六月

学习汇编语言程序设计报告书 由于实际工作中对汇编语言程序设计应用较多,在业余时间我自主学习了北京大学出版社出版的《汇编语言程序设计》一书。这一本书介绍了80x86汇编语言程序设计的方法和技术,共分为两个部分:第一部分介绍80x86cpu的编程结构,汇编语言程序的格式和伪指令,80x86cpu的寻址方式和指令系统;第二部分深入讨论分支程序、循环程序、子程序基本程序设计方法,以及以中断为主的i/o程序设计,其中包括宏指令、多模块连接技术、汇编语言与高级语言的混合编程、dos和bios提供的常用中断调用,以及文件系统等内容。 通过本书,我深入的掌握了汇编语言的编程方法、思路和技巧,并对计算机的底层编程有一定认识;还对计算机底层运行程序的机制及计算机的工作原理有了深入的了解。 在学汇编的过程中,最重要的就是要掌握汇编语言中的指令的一些基本用法。当然要能够真正的了解其中的内涵,这样在实际的编程中也能够像运用高级语言一样灵活的变通。汇编语言作为一种低级程序设计语言,既然是低级所以应该是最底层的,与计算机内部的结构联系应该联系很密切,而且我在学习中也深刻的了解到了这一点。比如说后来学到的寄存器、中断、还要各种寻址方式以及进栈出栈,好多的就是设计到计算机硬件。前面几章都是对计算机内部结构和一些常用的指令以及寻址方式的寻址方式。到后面学到子程序以及宏的作用才真正发现到其实跟高级语言差别不大。以C语言为例,C语言也

是由一个一个的函数组成的。没想到想汇编这样的低级语言也可以这样。在汇编语言的子程序和宏中,我个人更感觉宏的运用更像我们高级语言的子函数,通过定义好的宏,我们在后面直接调用就可以了。尤其是宏带参数的宏跟C语言中带参数的函数真的很像,根据参数的不同调用宏就能得到不同的结果。而汇编中的子程序没有这个传递参数这个功能。在调用子程序的时候要注意各寄存器中的内容。子程序是在程序执行期间由主程序调用的,它只占有它自身大小的一个空间,他不仅是源程序级别简化,形成的目标代码较短;而宏调用则是在汇编期间展开的,每调用依次进把宏定义体展开一次,它是源程序级的简化。因而它占有的存储空间与调用次数有关,调用次数越多则占有的存储空间越大。如果宏调用次数较多的话,则其空间上的开销也是应该考虑的因素 汇编程序给人感觉最烦的就是好多程序的结果不能直接通过运行EXE文件显示出来,而更多的是经过DEBUG单步调试才能看到其内在变化,看是否正确。汇编程序不像其他的高级语言一样需要编译器,而是直接的就能在记事本上编写,然后进行汇编和连接就可以了。学习汇编调试,关键就是要掌握DEBUG的运用。汇编程序把汇编语言翻译成机器语言的过程称为汇编。是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。比机器语言易于读写、调试和修改,同时具有机器语言全部优点。但在编写复杂程序时,相对高级语言代码量较大,而且汇编语言依赖于具体的处理器体系结构,不能通用,因此不能直接在不同处理器体系结构之间移植。

第四章MCS-51汇编语言程序设计

第四章MCS-51汇编语言程序设计 重点及难点: 单片机汇编语言程序设计的基本概念、伪指令、单片机汇编语言程序的三种基本结构形式、常用汇编语言程序设计。 教学基本要求: 1、掌握汇编语言程序设计的基本概念; 2、掌握伪指令的格式、功能和使用方法; 3、掌握顺序结构、分支结构和循环结构程序设计的步骤和方法; 4、掌握常用汇编语言程序设计步骤和方法。 教学内容 §4.1汇编语言程序设计概述 一、汇编语言的特点 (1)助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用存储空间小,运行速度快,因此汇编语言能编写出最优化的程序。 (2)使用汇编语言编程比使用高级语言困难,因为汇编语言是面向计算机的,汇编语言的程序设计人员必须对计算机硬件有相当深入的了解。 (3)汇编语言能直接访问存储器及接口电路,也能处理中断,因此汇编语言程序能够直接管理和控制硬件设备。 (4)汇编语言缺乏通用性,程序不易移植,各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用;但是掌握了一种计算机系统的汇编语言后,学习其他的汇编语言就不太困难了。 二、汇编语言的语句格式 [<标号>]:<操作码> [<操作数>];[<注释>] 三、汇编语言程序设计的步骤与特点 (1)建立数学模型 (2)确定算法 (3)制定程序流程图 (4)确定数据结构 (5)写出源程序 (6)上机调试程序 §4.2伪指令 伪指令是程序员发给汇编程序的命令,也称为汇编命令或汇编程序控制指令。 MCS- 51常见汇编语言程序中常用的伪指令:

第四章MCS-51汇编语言程序设计91 1.ORG (ORiGin)汇编起始地址命令 [<标号:>] ORG <地址> 2.END (END of assembly)汇编终止命令 [<标号:>] END [<表达式>] 3.EQU (EQUate)赋值命令 <字符名称> EQU <赋值项> 4.DB (Define Byte)定义字节命令 [<标号:>] DB <8位数表> 5.DW (Define Word)定义数据字命令 [<标号:>] DW <16位数表> 6.DS (Define Stonage )定义存储区命令 [<标号:>] DW <16位数表> 7.BIT位定义命令 <字符名称> BIT <位地址> 8.DA TA数据地址赋值命令 <字符名称> DATA <表达式> §4.3单片机汇编语言程序的基本结构形式 一、顺序程序 [例4-1]三字节无符号数相加,其中被加数在内部RAM的50H、51H和52H单元中;加数在内部RAM的53H、5414和55H单元中;要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区的00H位中。 MOV R0 ,# 52H ;被加数的低字节地址 MOV R1 ,# 55H ;加数的低字节地址 MOV A ,@ R0 ADD A ,@ R1 ;低字节相加 MOV @ R0 , A ;存低字节相加结果 DEC R0 DEC R1 MOV A ,@ R0 ADDC A ,@ R1 ;中间字节带进位相加 MOV @ R0 , A ;存中间字节相加结果 DEC R0 DEC R1 MOV A ,@ R0 ADDC A ,@ R1 ;高字节带进位相加 MOV @ R0 , A ;存高字节相加结果 CLR A

汇编语言程序代码详细版

1.1 DATAS SEGMENT x db 6 y db 7 z db ? ;此处输入数据段代码 DATAS ENDS STACKS SEGMENT dw 100 dup(0);此处输入堆栈段代码STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: push ds mov ax,0 push ax mov ax,datas mov ds,ax mov dl,x add dl,y mov cl,3 sal dl,cl sub dl,x sar dl,1 mov z , dl ;此处输入代码段代码 MOV AH,4CH INT 21H CODES ENDS END START 1.2DATAS SEGMENT x db 4 dup (0) y db 4 dup (0)

z db 4 dup (0) ;此处输入数据段代码 DATAS ENDS STACKS SEGMENT dw 100 dup(0);此处输入堆栈段代码STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: mov x,12h mov [x+1],34h mov [x+2],56h mov [x+3],78h mov bl,78h mov y,34h mov [y+1],56h mov [y+2],87h mov [y+3],64h add bl,64h mov [z+3],bl mov bl,56h adc bl,87h mov [z+2],bl mov bl,34h adc bl,56h mov [z+1],bl mov bl,12h adc bl,34h mov z,bl

ARM中C语言调用汇编语言方法浅析

ARM中C语言调用汇编语言方法浅析在嵌入式系统开发中,目前使用的主要编程语言是C 和ARM指令汇编。在一些对性能非常敏感的代码块,基于汇编与机器码一一对应的关系,这时不能依靠C编译器的生成代码,而要手工编写汇编,从而达到优化的目的。 一、在C语言中内嵌汇编 在C中内嵌的汇编指令包含大部分的ARM和Thumb指令,不过使用与单纯的汇编程序使用的指令略有不同,存在一些限制,主要有下面几个方面: ①不能直接向PC 寄存器赋值,程序跳转要使用B或者BL指令; ②在使用物理寄存器时,不要使用过于复杂的C表达式,避免物理寄存器冲突; ③R12和R13可能被编译器用来存放中间编译结果,计算表达式值时可能把R0-R3、R12及R14用于子程序调用,因此避免直接使用这些物理寄存器; d 一般不要直接指定物理寄存器; ④让编译器进行分配内嵌汇编使用的标记是__asm或asm关键字,用法如下:__asm{instruction [; instruction]}或asm("instruction [; instruction]")。 下面是一个例子来说明如何在C中内嵌汇编语言: //C语言文件*.c #include void my_strcpy(const char *src, char *dest){ char ch; __asm{ loop: ldrb ch, [src], #1 strb ch, [dest], #1 cmp ch, #0 bne loop } } int main(){ char *a="forget it and move on!"; char b[64]; my_strcpy(a, b); printf("original: %s", a); printf("copyed: %s", b); return 0; } 在此例子中C语言和汇编之间的值传递是用C语言的指针来实现的,因为指针对应的是地址,所以汇编中也可以访问。

汇编语言学习心得

汇编学习心得 08网工(一)班李锐 0804031002 在大三接触汇编语言之前,我们在计算机组成原理课程中就已经有所了解了,但也只是略微明白一些如jmp,mov这样的指令,极度缺乏系统性的学习。 在接触这门课程后,感到汇编语言并不是很容易就可以弄懂的。相比较以前学过的高级语言如C、C++等,电脑等于在迁就人的思维方式,但学汇编,人却必须要去迁就电脑的思维方式,要设身处地地用电脑的角度去思考问题,这就是我们学习汇编语言时遇到的最大的障碍。 另外,在C语言中不到10个语句构成的程序,用汇编语言却要好几十行甚至上百行。这不得不让我们对汇编产生一种恐惧感。事实上,这是完全不必要的。一旦对它的原理掌握后,编写程序就容易多了。另外,学习汇编语言能让我们更加了解计算机内部的组织结构,对我们计算机专业的学生来说,学习汇编也是提升综合能力的关键环节。 汇编的学习不仅仅是学习其语法,而更多的是学习计算机基本的体系结构。其中遇到很多新的概念,名字。如寄存器、中断、寻址方式等。这些概念在刚接触汇编这门课的时候难以理解,但在之后的学习中通过老师的讲解,自己亲手编程的方式也就渐渐清晰明了。 我们在学习之前都需要明确什么是汇编语言。计算机能够直接识别的数据是由二进制数0和1组成的代码。机器指令就是用二进制代码组成的指令,一条机器指令控制计算机完成一个基本操作。为了克服机器语言的缺点,人们采用助记符表示机器指令的操作码,用变量代替操作数的存放地址等,这样就形成了汇编语言。 经过一个学期的学习,我也慢慢摸出了汇编学习的规律。 首先,学习这门语言时如果能联系上以前学过的其他高级语言的知识,则会起到良好的效果。例如C语言程序的运行逻辑结构有顺序(按语句依次执行)、分支结构(IF...THEN...ELSE...),循环结构(FOR...NEXT)三种结构,也通过C 语言了解并掌握了什么是子程序,什么是调用。事实上,汇编语言中有关程序结构,子程序等等的知识都是跟C语言十分相似的,只是在编程时用到的语言不同:汇编语言完全面向机器,需要指明数据在寄存器、内存中的流向。 第二,学习汇编语言,首要问题是学习80X86指令系统。如果能将指令系统中的各个助记符、格式等都能完全掌握并灵活运用,大部分工作就已经完成了。指令系统确定了CPU所能完成的功能,是用汇编语言进行程序设计的最基本部分。如果不熟悉汇编指令的功能及其有关规定,那肯定不能灵活使用汇编语言。 指令的种类十分繁杂,但其格式却是统一的。 其中方括号中的内容为可选项。指令助记符决定了指令的功能,对应一条二进制编码的机器指令。指令的操作数个数由该指令确定,可以没有操作数,也可以有

汇编语言程序设计

汇编语言程序设计 实验报告 实验名称上机过程及顺序结构与分支结构程序设计实验班级 学号 姓名 日期2017年10月26号 成绩 评阅人 软件学院

一、实验目的与意义 理解并熟练掌握汇编语言程序设计过程中的编辑、汇编、链接和调试等各个步骤,提高对汇编课程内容的理解和汇编语言的掌握,通过上机练习加深对课程内容的理解和掌握。通过汇编语言编制的程序上机调试、运行检验程序设计是否正确。熟悉和掌握编辑、汇编、连接和调试四个实用程序的使用方法,掌握调试程序中的几个常用命令的使用方法。熟悉其基本的指令操作,debug调试操作命令以及分支结构、顺序结构和循环结构的程序设计。 二、实验环境 操作系统:Microsoft Windows8 集成环境:Masm for Windows 上机地点:信息楼B405教室 三、实验的预习内容 预习的主要内容: 1. 使用DEBUG命令的方法; 2. 熟悉掌握从理论上定义数据的类型(即DB,DW,DD,); 3. 分支结构和顺序结构的步骤以及相关的指令; 4. 常用的标志位状态及相应的作用; 实验思路: 在对题目进行分析后,分析出解题方法,并做出与实验思路相对应的程序框图。依照程序框图的内容输入相对应的代码,最终在调试代码后,发现并解决一系列的汇编语言错误。进一步优化算法。实验之前必须了解十进制、十六进制和ASCII码之间的转换。预习查表法相关命令,掌握顺序程序的结构,从键盘输入数据的命令及显示到屏幕上的命令。 实验一: 题目1:将程序编辑、汇编、连接并通过集成环境中的debug调试,观察运行结果;用E命令修改指定地址的数据,再用G命令执行程序查看变化,用A 命令将加法指令修改成减法指令,再将其编译运行,查看寄存器值变化的异同。 题目2:分别用DB、DW和DD数据段9H,0FAH,41H,27H,编译链接之后生成exe文件,再用debug的r命令找到数据段地址,用d命令指定数据段地址,观察汇编后在机器内部对应的存储情况。 实验二: 先设置数据段地址和堆栈段地址;设置堆栈段指针;读取一个字符然后存储在AL中;用BX来存储AL中字符对应的数值;将BX中的值作为偏移地址;并在数据段中查找对应字符串;最终输出结果结束程序。 实验三: 先初始化数据段地址与堆栈段地址;设置堆栈段指针;然后将数据段中的data1放入AL中;读取数据段中的data2并判断data2是否大于0;然后读取数

汇编语言小程序

16进制转化为10进制STACK SEGMENT STACK'STACK' DW100H DUP(?) TOP LABEL WORD STACK ENDS DATA SEGMENT KEYBUFFER DB100 ;DB ? ;DB 100 DUP(?) DECIMAL DB 5 DUP(?) STRING1 DB'PLEASE INPUT DECIMAL DATA:$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,CS:STACK START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV SS,AX LEA SP,TOP LEA DX,STRING1 MOV AH,09H INT 21H MOV AH,0AH LEA DX,KEYBUFFER ;MOV AX,23456 INT 21H ;LEA SI,KEYBUFFER MOV AX,DX LEA DI,DECIMAL CALL DISPAX MOV AH,4CH MOV AL,0 INT 21H DISPAX PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI LEA DI,DECIMAL

CALL TRANS16TO10 MOV CX,5 LEA DI,DECIMAL+4 MOV AH,2 DISPAXD: MOV DL,[DI] ADD DL,30H DEC DI INT 21H LOOP DISPAXD POP DI POP DX POP CX POP BX POP AX RET DISPAX ENDP TRANS16TO10 PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV BX,10 MOV CX,5 LOOP1: XOR DX,DX DIV BX MOV[DI],DX INC DI LOOP LOOP1 LEA DX,DECIMAL MOV AH,09H INT 21H POP DI POP DX POP CX POP BX POP AX RET TRANS16TO10 ENDP

汇编语言复习题

汇编语言复习题 第2章8086CPU寄存器的结构及使用 1.8086CPU由指令执行部件EU和总线接口部件BIU两部分组成。其中EU的功能是控制和执行指令,主要由算术逻辑部件ALU、EU控制部件、8个16位寄存器和一个标志寄存器FLAGS组成。BIU的功能是从存储器预取指令和数据,以及所有EU需要的总线操作,实现CPU与存储器和外设间信息传递。BIU由指令队列、指令指针寄存器、段寄存器、地址加器组成。 2.Intel 8086CPU共有14个16位寄存器,它们分别是通用寄存器8个即AX、BX、CX、DX、SP、BP、SI、DI,其中能用作寄存器间接寻址的寄存有BX、BP、SI和DI,控制寄存器2个即IP、PSW,段寄存器4个即DS、SS、CS和ES它们的含义分别是: 其中在编程过程中程序的段基值由汇编程序装入的段寄存器是SS和CS ,由编程者用汇编指令将段基值装入的段寄存器是DS和ES,其具体指令是MOV AX,数据段段/附加数据段名,MOV DS/ES,AX,编程人员不能用指令去取其值或给其设置给定值的寄存器是 IP ,但是可以通过某些指令的执行而自动修改其内容,如JMP NEXT指令的功能是将目的地址的偏移量送入IP。 3.PSW是程序状态字寄存器又称为标志寄存器,用来反映微处理器在程序运行时的某些状态,其中的6个状态标志位分别是OF、SF、ZF、AF、PF和CF,反映了刚执行完算术或逻辑运算指令后的某些特征。三个控制标志位是DF即方向标志、IF即中断标志位和TF陷阱标志。如两个8位的二进制数相加其状态标志位中各标志的值是多少?10110101+10011011。 4.8086CPU数据总线16根地址总线是20根能访问的最大存储空间是1MB。 第3章存储器的分段 1.在8086CPU中存储器的编址原则是按字节编址即每一个字节单元是一个存储器地址,在源程序中用常用十六进制数或符号来表示一个存储单元的地址。任何相邻的两个字节地址可以构成一个字地址,约定用较小的那个地址来表示字地址。程序员在编程时所用的地址称为逻辑地址,CPU访问的地址称为物理地址。物理地址与逻辑地址的关系是:物理地址=段基值*16+偏移地址。如有下列存储器的结构请按要求回答问题: ① 0002H的字节地址的内容是多少? ② 0002H的字地址的内容是多少? ③若该存储地址所在的数据段的段基值是0F3BH,则逻辑地址 为0004H的物理地址是多少?该物理地址的字单元内容是多少? ④物理地址是0F3B1H的字节单元内容是多少?

浅谈对C语言的认识

浅谈对C语言的认识 摘要:C语言作为一种通用的命令式计算机编程语言,提供了有效利用汇编语言的途径,使低级的机器指令能以简易的方式进行编译。随着C语言的国际标准化,它已经成为有史以来使用最广泛的编程语言之一,对计算机编程领域产生了不可估量的影响。计算机编程爱好者和专业人士都应当学习C语言,为学习高级编程语言奠定坚实的编程基础。本文从C语言的语法特点、数据结构、应用以及衍生等方面进行简要介绍,旨在提供入门知识的浅显参考。 关键字:C语言;语法特点;数据结构 一、C语言的语法特点 1. 字符集 C语言的基本字符集包括基本拉丁字母小写和大写字母(a-z,A-Z)、十进制数字(0-9)、特殊图形字符(!@#$%^&*()[]{};:’”,<.>/?`~\|)以及空白字符(空格、水平制表符、垂直制表符、换页符、换行符)。虽然换行符只是表示文本行的结尾,实际并不需要与某个字符对应,但是为了方便,C语言中它仍然被认为是一个字符。字符串文字使得C语言可以进行多字节字符编码,并且C标准库中自带字符串操作函数。C语言的可执行字符集包含相同的字符,以及警报、退格和回车等。随着C语言标准的不断修订,对扩展字符集的支持逐渐在增加。

2. 关键字 C语言中定义了一些特殊的关键字,只能用于C语言编译本身使用,而不能用于如命名之类的操作。在C语言标准C89中有32个常见关键字,如double、int、Char等数据型关键字,以及if、else、break、Continue等控制型关键字。后来的C99和C11标准又分别提出了5个和7个关键字,如_Bool、_Alignas等。大多数最新的关键字都是以下划线开头,后面跟着一个大写字母。当C开始支持这些扩展关键字时,以前留存的C程序代码没有使用过这些关键字,因此不会受到任何影响,在无需任何改动的情况下仍可继续使用。 3. 运算符 运算符是语句表达式中,用于指定执行该表达式时要执行的具体操作。C语言支持相当多的运算符,如加(+)、减(-)、乘(*)、除(/)、余(%)等算术符,赋值符(=)、大于(>)、小于(<)、不大于(<=)、不小于(>=)等关系符。C语言遵循Fortran和PL/I的语言习惯,用等于号(=)来表示赋值,但与ALGOL 等语言不同,C使用(==)来检验是否相等。如果混淆这两个运算符(=和==),很容易导致意外的错误,并且在很多情况下不会产生错误信息,例如条件表达式if (a==b+1)和if (a=b+1)都可以编译通过,但运行结果是截然不同的。 二、C语言的数据结构 C语言中的数据是静态的,有各种大小的整数类型(有符号和无符号)、浮点数和枚举类型,以及派生类型,包括数组、指针等。 1. 指针 C语言支持使用指针,这是一种在内存中记录对象或函数的地址或地址引用的数据类型。指针可以被间接用于访问存储在指向地址的数据,或调用指向函数,通过赋值或指针算术即可操作指针。指针在C语言中用途繁多,例如文本字符串通常使用指针指向字符数组,动态内存分配使用指针执行,许多如树这样的数据类型通常采用指针链接在一起的方式进行动态分配结构对象。指针的使用需格外小心,因为它们通常是未选中的,可以使指针变量指向任意位置,这可能会导致意外的错误。所幸的是,C语言允许指针类型之间进行操作和转换,能够有效地将指针指向安全的地方。 2. 数组

汇编学习心得体会

《汇编语言程序设计》学习心得和体会 在接触这门课程初始,就感到汇编语言并不是很容易就可以弄懂的。相比较以前学过的程序语言如C、C++等,电脑等于在迁就人的思维方式,但汇编却是接近机器语言的一门语言,我们学习和编写程序时必须要去迁就电脑的思维方式,要设身处地地用电脑的角度去思考问题,这就是我学习汇编语言时感受最深的地方,想起来很简单,写起来相当的不易。 汇编的学习不仅仅是学习其语法,而更多的是学习计算机基本的体系结构。其中遇到很多新的概念,名字。如寄存器、中断、寻址方式等。这些概念在刚接触汇编这门课的时候难以理解,但在之后的学习中通过老师的讲解,自己亲手编程的方式也就渐渐清晰明了。 我们在学习之前都需要明确什么是汇编语言。计算机能够直接识别的数据是由二进制数0和1组成的代码。机器指令就是用二进制代码组成的指令,一条机器指令控制计算机完成一个基本操作。为了克服机器语言的缺点,人们采用助记符表示机器指令的操作码,用变量代替操作数的存放地址等,这样就形成了汇编语言。 经过一个学期的学习,我也慢慢摸出了汇编学习的规律。 首先,学习这门语言时如果能联系上以前学过的其他高级语言的知识,最重要的是一些思考问题,实现功能的逻辑的思考,会帮助我们很快的找到编写程序的思路和方向。例如C语言程序的运行逻辑结构有顺序(按语句依次执行)、分支结构(IF...THEN...ELSE...),循环结构(FOR...NEXT)三种结构,也通过C 语言了解并掌握了什么是子程序,什么是调用。事实上,汇编语言中有关程序结构,子程序等等的知识都是跟C语言十分相似的,只是在编程时用到的语言不同:汇编语言完全面向机器,需要指明数据在寄存器、内存中的流向。 第二,学习汇编语言,首要问题是学习80X86指令系统。如果能将指令系统中的各个助记符、格式等都能完全掌握并灵活运用,大部分工作就已经完成了。指令系统确定了CPU所能完成的功能,是用汇编语言进行程序设计的最基本部分。如果不熟悉汇编指令的功能及其有关规定,那肯定不能灵活使用汇编语言。 指令的种类十分繁杂,但其格式却是统一的。 其中方括号中的内容为可选项。指令助记符决定了指令的功能,对应一条二进制编码的机器指令。指令的操作数个数由该指令确定,可以没有操作数,也可以有一个或多个操作数,大多数指令要显示写出来,还有些操作数是隐含的。当指令包含操作数的时候,书写时必须遵守:1、指令助记符和操作数之间有分隔符,比如几个空格;2、如果含有多个操作数,操作数之间用逗号分隔。 现在简单总结汇编语言指令的分类:1、数据传送指令;2、标志位操作指令; 3 、算术运算指令;4、逻辑运算指令;5、移位运算指令;6、位操作指令;7、

相关主题
文本预览
相关文档 最新文档