汇编程序篇1
引言
“汇编语言与微机原理”是计算机科学与技术专业的必修基础课程。该课程融合了汇编语言程序设计和微机原理与接口技术两门课程的内容,要求学生重点掌握汇编语言程序设计的方法和微型计算机系统各个部件的工作原理。掌握汇编语言是掌握微机原理的基础,因为实现和验证微机系统各个部件的工作过程需要用到汇编语言,并且更高层次的综合系统设计也离不开汇编语言。
汇编语言与微机原理课程中,汇编语言子程序设计这部分内容的知识掌握起到承上启下的作用。其“承上”的作用体现在:作为一个***的模块,子程序设计涵盖之前所学的汇编语言的指令系统、伪指令、数据类型及三种基本控制结构(顺序结构、分支结构和循环结构)。其“启下”的作用体现在:①后续接口芯片的功能应用基本上都是以子程序的形式实现;②中断系统中的中断服务程序就是一种子程序,中断系统是微机系统中非常重要的组成部分,可以说不理解中断系统就不能理解计算机的工作原理[1],而掌握子程序设计是本文由收集整理理解和应用中断系统的基础之一;③子程序设计是开发大型程序的基础,对于培养编程能力十分重要[1]。因此,汇编语言子程序设计这部分内容无论在教学上还是在实验中都必须给予足够的重视。但目前鲜有文献涉及这方面的问题,本文针对目前汇编语言与微机原理课程中汇编语言子程序实验设计中普遍存在的问题给出相应的对策,并给出一个实验设计实例。lw881
1 实验设计存在的问题及对策
⑴ 实验学时安排不够。据粗略调查,大多数院校汇编语言与微机原理课程的实验学时为18个学时[1],有一些院校还附加一个课程设计。对于这18个实验学时普遍的分配方式如表1所示。
表1 汇编语言与微机原理实验项目及学时安排表
[类别\&项目\&学时\&汇编语言程序设计部分
(12学时)\&汇编语言上机过程及debug的使用\&2\&dos系统功能调用\&2\&三种基本程序结构\&6\&子程序\&2\&接口芯片部分
(6学时)\&可编程中断控制器8259\&2\&并行接口芯片8255\&2\&可编程定时/计数器8253\&2\&]
从表1可以看出,子程序实验仅安排了2个学时,学时太少,难以取得良好的训练效果,可以考虑将实验“dos系统功能调用”融合到“三种基本程序结构”中,腾出2个学时给子程序实验,有助于学生深刻全面的理解子程序的相关知识。
⑵ 实验内容“片面”。对于汇编语言子程序实验,大多数院校的实验内容只涉及到两方面的知识:①子程序的类型(近子程序和远子程序);②三种参数传递方式(寄存器传递、内存单元传递、堆栈传递)[2]。这并不全面,与子程序密切相关的知识应该还包含宏和中断服务程序,所以有必要在实验中安排相应的内容让学生理解子程序与宏的区别,以及如何把一个子程序“注册”为中断服务程序,然后通过软中断指令(int n)调用该程序的过程,这样做有助于后面对中断系统的学习。中断是学习汇编语言的重点、难点部分,能否真正掌握汇编语言对中断的理解和掌握至关重要,中断也是汇编语言的魅力所在[3]。
2 实验设计的一个实例
针对前面提到的问题,在此给出一个汇编语言子程序实验设计实例,主要内容如下:
⑴ 实验学时:4学时。
⑵ 实验目的:
① 掌握子程序的编写及调用方法;
② 掌握近子程序和远子程序的区别;
③ 掌握三种参数传递方式的差别;
④ 掌握子程序与宏的区别;
⑤ 掌握编写中断服务程序的方法以及通过软中断指令。
⑶ 实验内容:
① 编写一个近子程序实现将一个字节的数据以十六进制的形式输出,采用寄存器参数传递方式;
② 编写一个远子程序,功能与①相同,采用堆栈参数传递方式;
③ 变量str中存有一个以’$’作为结束符的字符串,编写一个子程序实现将str中所有的大写字母全部改为小写字母,采用内存单元参数传递方式;
④ 用宏实现①中的功能;
⑤ 编写一中断服务程序实现①中功能。提示:利用dos系统功能调用的35h号功能和25h号功能提取和设置中断向量,具体如表2所示。
表2 dos系统功能调用的35h号和25h号功能说明[4]
[功能号\&功能\&入口参数\&出口参数\&25h\&设置中断向量\&ds:dx=所设置中断向量的段基址:偏移量al=欲设置中断向量所对应的中断号\&无\&35h\&取中断向量\&al=欲取中断向量所对应的中断类型号\&es:bx=取得的中断向量的段基址:偏移量\&]
该实验设计实例特点鲜明,首先实验所要求完成的功能都是汇编语言中简单而又常用的功能,这一方面可以使学生不必花太多功夫在算法实现上,而把主要精力集中在子程序本身的语法上,另一方面实验中所完成的程序在后续的实验中可以直接调用,减轻了学生在后续实验中的负担,同时加强了各实验之间的有机联系。我们的实验内容涵盖了与子程序相关的各种知识,特别是子程序与中断服务程序的关系,这也是本实验设计的创新之处。
汇编程序篇2
1 课程的地位与现状
“汇编程序设计”是计算机及相关专业的专业基础必修课,学生通过本课程的学习,首先,可以更加深入的理解计算机硬件系统的组成结构和原理,可以更好的理解寄存器,中断,寻址方式等概念;其次,可以促进对高级编程语言相关概念的理解,高级语言在编译时通常会先生成汇编语言代码,然后再转换为最终的机器码,学习汇编语言程序设计可以充分理解程序的编译执行过程,同时学生对于堆栈的使用、子程序调用等过程会更清晰;利用汇编语言还可以设计出效率极高的核心底层程序,如设备驱动程序,汇编语言程序能够直接有效地利用机器硬件资源,因此用汇编语言编写的程序一般比用高级语言编写的程序执行的快,且所占内存较少,在一些实时控制系统中,这点更不可缺少和替代[1]。因此本课程一直是计算机专业的核心课程之一,在整个计算机专业课教学中起着承上启下的作用,为后续课程的学习打下重要的基础。而目前以ARM为核心的嵌入式技术逐渐成为各个高校教学的主流,基于ARM架构的汇编语言程序设计是学习嵌入式技术的基础。
但是在实际教学过程中,往往教学效果并不好,学生学习的积极性不高。笔者认为主要包括以下一些问题:(1)指令多而且复杂,难以记忆;(2)课程的内容比较抽象,与高级语言程序设计有较大的差别;(3)课程内容滞后于当前计算机技术的发展;(4)课程内容连贯性强,如果有一部分内容掌握不好就会造成知识脱节;(5)实践教学环节薄弱。对“ARM汇编语言程序设计”课程教学进行改革,从而提高课程的教学质量,达到预期的教学效果是我们急需解决的问题。笔者经过教改探索,认为应从以下几点进行改革。
2 合理安排教学内容
在“ARM汇编语言程序设计”课程中主要包括三个部分,第一部分主要介绍汇编语言程序设计的基础知识和ARM系列微处理器,第二部分是ARM指令系统,第三部分是ARM汇编语言程序设计。目前授课时都是先讲完所有的指令(包括数据处理指令,Load/Store指令,分支指令,程序状态寄存器指令,协处理器指令和软件中断指令)以及伪指令后,再开始讲授如何编写汇编程序。学生需要记忆大量的指令、伪指令的格式和功能,却不知如何用来编写程序,导致无法理解消化所学内容,容易感到枯燥,学习兴趣不高[2]。
笔者认为可以将课程内容进行调整。比如讲完数据传送指令、运算类指令之后就可以讲一些顺序程序设计的实例并让学生完成一些简单的题目,在实际做题过程中更好的学习指令的功能和用法。同样在讲述指令的条件执行时与分支和循环程序设计结合起来,讲述分支指令BL时与子程序设计结合起来,将编程环节提前,通过实际的例子让学生建立起感性认识,对指令的掌握会更好,在此过程中学生会建立成就感,学习兴趣也自然产生了。
另一方面,“ARM汇编语言程序设计”课程与其它一些专业课程密切相关,在安排教学内容时要尽量注意课程之间的衔接与融合。“ARM汇编语言程序设计”与“嵌入式系统接口原理与应用”,“嵌入式软件设计与应用”等课程都密切相关,是学习嵌入式系统设计不可缺少的一部分。还有一部分同学认为汇编语言已经“过时”了,在今后的工作中不会用到,教师讲授时可以通过一个嵌入式系统应用的实例说明汇编语言程序设计在系统引导程序,接口驱动程序中的重要作用,以及具有高级语言无法比拟的优势。
3 采用比较教学法
所谓比较教学法是指将陌生的东西与熟悉的东西做比较,找出相同和不同的地方,然后进行差异化学习[3]。比如可以将ARM指令系统与我们熟悉的x86指令类比,来提速学生的理解记忆过程。ARM指令与x86指令编程操作有明显的共性,甚至很多指令助记符都是相同的。如MOV,ADD,SUB等,学生很容易接受。所以要特别突出ARM指令体系的不同之处,比如:ARM绝大部分指令可以根据状态寄存器的状态决定是否执行;ARM指令集中设置专门的Load/Store指令用于存储器的访问;ARM不设专门的移位指令,各指令中均直接可进行移位操作等等,而这些不同之处更突出体现了ARM处理器的RISC特性,所以学生很容易记忆。同样在硬件上也可以做类比,比如ARM与x86处理器的中断处理过程的区别。
还可以将汇编语言与学生比较熟悉的高级语言做类比。汇编语言也好,高级语言也好,都只不过是程序设计的工具,因此对于程序的基本功能和程序设计的基本问题都有相通的实现机制,特别是在程序设计的基本思想上。但是汇编语言和高级语言毕竟是不同级别的语言类别,高级语言语句功能更强,编程时更灵活方便,而且即便是同样的问题,如数据安排、数据处理、程序流程控制、子程序调用等,实现起来也有不同的方法。比如高级语言子程序调用时需要同时提供参数,一般格式是:函数名(参数);而在汇编语言中,子程序在定义时不需要有关参数的说明,在调用时也无需同时提供参数,子程序的调用格式为:BL子程序名。也就是说,高级语言中函数的参数传递是显式进行的,而汇编语言中的参数传递是隐式的。在汇编语言中参数传递可以利用寄存器实现,也可以利用存储单元实现,还可以用堆栈实现。在实际应用中通常综合以上方法来达到最佳效果。
4 采用多媒体与板书相结合的教学手段
充分采用多媒体的手段来授课是必要的,在汇编语言的教学中,大量采用多媒体课件,对于一些抽象难懂的知识,借助于***表、动画等进行讲解,可以给学生一个感性、直观的认识,使大家集中注意力,加深对内容的理解。比如在讲解寻址方式时,通过工作流程动画的演示,学生很容易理解各种寻址方式的不同之处。但是教师并不能完全依赖于多媒体手段,如果把所讲的程序直接做到课件中,讲解时会出现朗读课件的情况,与学生的交互不足,影响授课效果。因此最好将多媒体与板书相结合,在多媒体课件中展示程序的流程***,而将程序以板书形式展现给学生,写板书时可以与学生充分交流,让他们有足够的时间来理解编程的思路和过程,同时也大大活跃了课堂气氛。
5 实验教学注重实用性
汇编语言是一门实践性很强的语言,实验环节在整个教学活动中占据了举足轻重的地位,是提高学生动手能力的重要环节。因此,教师一方面要耐心讲解让学生熟悉汇编语言从汇编、链接到调试执行的整个过程,另一方面要让学生多进行上机实践。还可以要求学生将一些c语言的程序段的功能通过汇编语言实现。通过集成开发环境的帮助,学生可以更好的掌握两种语言编程的异同点,达到更好的学习效果。对于一些复杂的题目,可以让学生课外分组来进行设计,题目的类型可以是研讨型的让学生从更多的角度去思考编写程序。
汇编程序篇3
一、序言
近年来,随着C语言的进一步推广使用,绝大多数的工程师都倾向于使用C语言进行单片机系统开发,汇编语言由于可读性、通用性、可移植性差的原因,很难满足产品开发的需求。但是汇编语言具有执行效率高、占用内存空间小等特点,在某些应用领域还是具有无可替代的作用。
本文结合Keil μVision2程序开发流程,描述了51单片机汇编程序多文件编译的实现方法。通过多文件编译的使用,大大提高了汇编程序代码的可读性、可扩展性,同时也很大程度地提高程序代码的执行效率以及内存空间的使用率,避免内存空间的浪费。
二、Keil μVision2程序开发流程简介
Keil μVision2是美国Keil Software公司出品的51系列兼容单片机软件集成开发环境,该软件提供宏汇编器、链接/定位器、库管理器、调试器以及目标文件转换器等工具,是51单片机系统开发的首选工具。
Keil μVision2集成开发环境的编译流程如下:首先宏汇编器对汇编源程序文件进行编译,生成扩展名为.OBJ的目标文件和扩展名为.LST的列表文件,紧接着链接/定位器将所有的.OBJ文件进行绝对地址分配,链接生成包含绝对地址的目标文件和扩展名为.M51的地址文件,最后由目标文件转换器生成可用于编程器烧写、扩展名为.HEX的可执行文件。
三、汇编程序多文件编译实现
在Keil μVision2集成开发环境下,我们可以根据不同的硬件模块、功能模块分开编写应用子程序,进行模块化管理,实现多文件编译,这样就可以大大提高汇编程序代码的可读性、可扩展性。以下首先对段和模块的概念进行描述。
一个段可以是一块程序代码或者是一个数据块。根据其地址空间是否可以被链接/定位器更改,段可以分为可定位段和绝对地址段。在定义可重定位段的时候需要对其段名、类型及其属性进行定义。一个段可以分在不同的程序模块中,只要具有相同的段名,在编译过程中链接/定位器会把它们合并到一起。在定义绝对地址段的时候直接人为分配绝对地址,链接/定位器不能对改地址进行更改。绝对地址段没有段名,也不能给其他段结合。
模块是一个可以被单独编译的代码单元,可以包含一个或多个段或者部分段,一个模块既可以是单个文本文件,也可以通过INCLUDE指令把几个文本文件合并在一起。在程序编译过程中,汇编器会把一个模块编译为一个目标文件,也就是一个模块对应一个.OBJ文件。
根据以上对段和模块的描述,汇编程序的多文件编译可以通过以下三个方法来实现:
1、通过INCLUDE指令合并源文件
在代码编写时,通过INCLUDE指令可以将一个源文件插入到当前源文件中,这样汇编器在编译的时候就会将INCLUDE指令之后的文件合并到当前文件进行编译,生成一个扩展名为.OBJ的目标文件。INCLUDE指令的格式如下:
$ INCLUDE (文件名)
通过该方式实现多文件编译时,插入的源文件既可以是扩展名为.A***的汇编源程序文件,也可以是扩展名为.INC的包含文件。注意在被包含的源文件结尾不能有END指令,否则编译会停止运行。
2、通过绝对地址段实现多文件编译
Keil μVision2中提供以下定义绝对地址段的指令,通过这些指令可以定义代码段和各种数据段,并指定其绝对地址。
由于绝对地址段在定义的时候对地址进行了分配,链接/定位器不能够对其地址进行更改,因此很容易造成地址重叠或者内存空间浪费,而且在后续对程序进行维护、升级的时候很有可能需要重新对地址进行分配,非常不利于程序的扩展和维护。因此绝对地址段通常是用在某些特定的场合,例如确定中断向量的入口地址、数据存储空间等。
3、通过可重定位段实现多文件编译
在Keil μVision2中,通过SEGMENT指令即可定义可重定位段。定义可重定位段时必须指定段的名称和存储类型,其格式如下:
四、总结
通过以上三种方式,均可以实现多文件编译,但是在实际使用过程中,INCLUDE指令通常用于包含特殊功能寄存器的定义等;绝对地址段则通常用于确定中断向量的入口地址、数据存储空间;而可重定位段的方式则广泛地用于各种代码段或数据段的定义。
通过多文件编译的方式,解决了单文件编译会导致程序文件过于臃肿、可读性差、不便于维护等缺点,大大提高汇编程序代码的可读性以及可维护性。
参考文献
[1] Keil Software. A51/AX51/A251 Macro Assembler and Utilities.2001.
汇编程序篇4
为了实现创新人才培养的目标,将研究性教学模式引入汇编语言程序设计教学中,对教学方法、教学组织形式及考核方法等进行了改革,改善了教学效果,提高了教学质量。
【关键词】
汇编语言程序设计;研究性教学模式;创新人才培养
1《汇编语言程序设计》课程现状及存在问题
《汇编语言程序设计》是计算机专业的专业基础课,是一门实践性很强的课程。以往老师讲授这门课程时,主要以“老师讲、学生听”的形式进行的,这样不助于学生理解指令的执行过程,往往导致学生在上机调试时无从下手,更谈不上综合程序的设计。这种僵化的教与学的模式必须进行改革,才能达到创新人才培养的目标。
2教学改革思路:
如果要提高教学质量,达到预期的教学效果,关键要改革教师的教学方法和学生的学习方式,即教师从传统的讲授灌入式向探究式转变,学生从传统的被动接受向主动接受、探究发现和研究性学习转变,达到培养学生主动发现问题、分析问题、创造性地解决问题的能力[1]。这就需要重新定位教师主导地位和学生主体地位的关系,采用以"学生为主体,教师为主导"的新教学理念。结合汇编语言程序设计课程的特点,紧紧围绕“深入理解机器工作的基本原理、培养底层编程意识和思想”和提高学生综合运用所学知识的能力两个核心目标,通过对教学方法及考核方式等进行改革,从而提高教学质量。
3教学方法及教学手段的改革
1.启发式教学:课程的讲授过程中,采用启发式教学方法,有意识地引导学生思考,将计算机的硬件工作过程深入课中,使得学生对语言的执行过程有更深入的理解。例如,在讲解存储器的分段时,可以将CPU与存储器的数据访问讲解一下,这样学生就能理解为什么要进行分段处理。2.项目驱动教学:汇编语言程序设计是一门实践性很强的课程,老师根据课程目标,设置3个难度适中的综合训练项目,贯穿整个教学过程中。学生在课余时间,通过检索资料、团队合作、综合分析,寻找解决问题的方案,最终提交程序代码及方案报告。“项目”教学是以学生为中心,老师为组织者和引导者,在项目的实现过程中,不但使学生加深对知识的系统理解,而且也了解了与知识相关的前沿热点问题,从而培养大学生自主学习能力、探究问题能力、协作能力、适应和创新能力等。3.随堂实践:学生上课可以自带笔记本,在知识点的讲解过程中,老师要充分利用多媒体教学环境中的计算机系统,对于程序实例可课堂调试演示,在机器上可随堂编写小程序现场运行,和学生一起进行调试的过程中,打破汇编语言的神秘感,消除学生对汇编语言难以掌握的恐惧心理,使同学们更直观、更快理解和掌握相关知识,激发学生对新知识和新技术的求知欲,提高教学质量。
4教学组织过程
课堂的前几分钟进行提问,掌握学生的知识点掌握情况,并督促学生搞好复习与预习;在知识扩展环节中,老师布置知识扩展点及要求,学生自主查阅资料并整理资料,增强学生查阅、整理和总结资料的能力,进而锻炼学生自主学习的能力;训练项目的实施以项目组的形式进行,即5~6名学生为1个项目组,并选其中一个学生担任组长,组长组织成员开展讨论和交流,但每个学生都***完成项目的设计、实验和项目报告;项目的实施主要采取“课外为主、课内为辅”的方式。即学生领取任务后,通过课余时间进行资料查阅、讨论、答疑、编程和调试,以及完成项目报告书等。每个项目布置时,老师要进行概要的讲解,让学生了解项目的整体思路及接下来应该怎样解决,然后多安排几次答疑辅导时间,学生带着自己的疑问与老师交流,师生一起找到解决问题的办法,这也提高了项目的完成质量;答辩时要求以组为单位,在规定的时间范围内,做完的组可以找老师答辩,答辩时学生带着电脑可以进行现场调试,根据功能实现及答辩情况给予答辩分,对平时负责本组程序讲解的同学答辩成绩有加分;由组长组织,进行讨论,锻炼学生的表达能力,增加学生的知识储备;每周安排一次答疑,这样可以及时了解学生知识点的掌握情况,有助于老师课堂内容的安排,同时也有助于师生交流,提高教学质量。
5考核方式
以课程结束时的考试作为评定学生的依据是很不科学的,要改变传统的学生学业评价中“一考定全局”终结式评价模式[2]。学生的评价应该是能够不断的指导学生、鼓励学生、完善其学习方法,增加学生的应用能力,进而实现人才的培养目标。在课程考核中,我们采取以下的考核办法:期末总成绩由考试成绩(50分)、综合训练成绩(40分)、平时成绩(10分)三部分组成。总成绩中加重了学生对所学知识综合应用能力的比重,同时也注重对学生学习过程的评价。
6结束语
本文将研究性教学模式引入《汇编语言程序设计》课程教学中,打破了传统的教学理念,经过两轮教学实践,教学效果较以往有明显的提高。
参考文献:
[1]罗克露.研究性教学模式的探讨[J].计算机教育
汇编程序篇5
关键词:汇编语言;C语言;混合编程
汇编语言的优势就是速度快,占用存储空间不大,而且可以随时控制硬件,这些优点是其它的程序语言无法取代的。汇编语言也有不足之处,就是在高级程序的编写与调试时存在着较大的困难,特别是在处理一些数据或者一些混合运算时显得更加困难。
C语言,它的优势就是在于功能全面,表达形式多样且灵活,开发使用效率很高,具有其它高级语言无法具有的优势。通常在软件开发过程中,大部分程序采用高级语言编写,以提高程序的开发效率;但在要求执行速度快、占用空间少或要求直接控制硬件的场合,则利用汇编语言编写,以提高程序的运行效率。
1.汇编语言和C语言混合编程的方法
C语言和汇编语言混合编程的具体方法有以下几种。
2.1 参数传递
汇编语言程序和C语言程序在调用时会涉及到参数传递,一般采用堆栈进行传递。在汇编语言中将BP作为基址寄存器,调用程序先将来自于C语言程序中的参数依次压入堆栈中,然后当需要使用这些参数时,再用BP加上不同的偏移量依次对堆栈中的数据进行存取操作。
2.2 调用关系的确定
对于将要涉及到调用的过程或函数需要事先说明和建立调用与被调用关系。被调用的过程或函数应预先说明为外部类型,以便被外部模块引用,而调用程序也需要在程序中说明将要引用的外部模块的名称。在说明调用关系时还应根据不同的存储模式确定相应的汇编语言格式。C程序小模式对应汇编程序的近类型过程,而C程序大模式则对应汇 编程序的远类型过程。
总而言之,汇编语言和C语言的混合编程方法可以使汇编语言与C语言之间取长补短,充分发挥各自优势,相互交叉调用,进行参数传递,共享数据信息和数据结构,使由此开发的软件更实用、更安全可靠,使开发和编程工作达到事半功倍的效果。
参考文献:
[1] 罗南超,向昌成,李唐辉. 汇编语言实现多种进制的通用输入输出[J]电脑知识与技术, 2008,(36) .
[2] 崔卫东. VC++与汇编语言混合编程的研究与实现[J]福建电脑, 2007,(05) .
[3] 宋金华. 汇编语言和C语言在***形处理中的综合应用[J]湖北广播电视大学学报, 2010,(12) .
汇编程序篇6
关键词:汇编语言程序设计;自主化学习;***学习;互联网技术
中***分类号:G642 文献标识码:B
文章编号:1672-5913 (2007) 24-0023-03
1“汇编语言程序设计”课程教学现状的分析
汇编语言是一门面向处理器的低级语言。该课程一方面配合“计算机组成原理”、“微机原理及接口技术”和“嵌入式系统”等课程,为自动控制等与硬件相关的应用领域提供基础知识;另一方面作为“操作系统”及“编译原理”等课程的程序设计基础,从软件角度理解计算机的工作原理,加强学生的高级语言编程能力。
目前在大部分院校该课程的教学模式依然沿用传统的教学方法。在课程讲授环节,以主讲教师授课作为主体,辅以课后作业、定期答疑;在实践环节,根据课程的进度,配置相应的上机实验。从多年的教学实践的结果来看,这种传统的教学方式基本可以达到预期的教学目标。通过本课程的学习,学生能够基本掌握Intel 80x86系列处理器的指令系统和汇编语言,能够运用学到的汇编语言知识开发一些简单的应用程序。但随着教学体制改革的不断深化,信息化、网络化教学技术的不断成熟,特别是学生自主化学习的理念不断加深,引发了我们对当前教学模式以及考试方法的思考。
“汇编语言程序设计”课程是一门理论性和实践性都很强的计算机专业的核心课程。本课程的学习要求学生对计算机的组织结构,特别是计算机的指令系统有一定的了解;该课程所教授的知识,不是单纯的理论知识,必须要求学生进行上机实践操作,这样才能更加熟练地掌握这门语言。因此,传统的教学方法也不可回避地暴露出与这门课程的特点所不相适应的弊端,归纳起来有如下几点:
(1) 由于汇编语言程序设计较C语言等高级语言程序设计更加烦琐,并且与硬件关系密切,因此使得学生感到学习这门课程有一定的难度。
(2) 课时的紧迫与学生课业负担较重产生矛盾,使得学生学习不够扎实,影响学生的学习效果。
(3) 答疑时间太为固定集中,有时可能与学生的时间发生冲突。
(4) 学生自由支配的时间过少,教学计划与学生实际的学习进度不相一致。
当然以上几点也可能是在许多其他课程教学过程中所存在的通病,但在“汇编语言程序设计”这样一门理论性和实践性都很强的课程中就显得尤为突出。这也就迫使我们朝着学生自主化学习的方向不断探索、不断前进。
2学生自主化学习的研究
顾名思义,学生自主化学习就是把教学的主动性从老师那里拿回到学生手中。具体地讲就是改变传统的教师主讲的教学模式,将学生被动的听课模式转变为学生自主地学习。这样可以给学生充裕的时间自由支配自己的学习,提高学生的主动实践、积极思考的能力。从而提高学生的学习兴趣,使学生学有所得,学有所获。
必须指出的是,这种自主化学习的方式在教育界曾多次提出,但收效极佳的还未见到。分析其原因主要有以下两点:
(1) 自主化学习留于形式,最终导致自主化学习变为了不学习
目前,有些课程推行所谓的学生自主化学习的教学模式,其实是把教学的一切任务都推给了学生,老师也不闻不问,最后象征性的考试了事。这样的教学不但起不到提高学生自主化学习、主动实践、积极思考问题和解决问题的能力,反而在学生中滋生了浮躁、涣散的学风。这种做法是极不可取的。
(2) 自主化学习缺乏必要的技术支持,严重影响了教学的效果
如果教学过程缺乏必要的技术支持,自主化学习的学习模式也是很难推行的。其相应的技术支持应包括在学校构建一个用于学生进行自主学习的***学习平台,建立起一套完整的课程教学计划、课程进度安排、课程学习目标、课后作业布置以及***答疑等系统。这样才能为学生的自主化学习提供物质上的保障。
北京工业大学在学生自主化学习方面也有过积极的尝试。在“计算机组成原理”课程的教学实践中,利用先进的互联网技术开发了校园网学生***学习子系统。利用该系统可以在正常的教学过程中作为学生***学习的辅助指导,为提高学生主动学习的积极性及师生之间的相互交流提供了有力的支持。因此,在“汇编语言程序设计”课程的教学过程中,我们也可以借鉴“计算机组成原理”课程的教学经验,并不断完善,最终实现全面的学生自主化学习的过程。
3应用校园网***学习及考试系统实现学生自主化学习
教学工作的信息化、网络化、无纸化长期以来一直是我们研究的对象和目标。也是实现学生自主化学习的物质基础。它不但可以提高学生主动思考、积极探索的能力,而且在一定程度上可以提高教学效率,激发学生的学习潜能。
北京工业大学正在研究、开发并完善“校园网***学习及考试系统”。利用该系统,可以很好地实现教师教学和学生学习的信息化及网络化。此系统是实现学生自主化学习的物质基础和实践平台。虽然该系统尚处于试验阶段,功能尚不完善,但它对于最终实现学生自主化学习是一个积极的探索和有益的尝试。
校园网***学习及考试系统的总体结构如***1所示。该系统的实现可以把课程的学习、课后的作业练习、疑难问题的答疑及最后的考试等教与学的工作环节都放到互联网上完成。
***1 校园网***学习及考试系统总体结构***
从***1可以看出校园网***学习及考试系统采用基于网络架构的B/S模型建立。服务前台共分为四个功能模块,每个功能模块提供一种特殊的服务。
(1) ***课程学习模块:利用该模块教师可以在每个学期的开始,为学生制定一份详细的学习计划,学生根据计划的安排和本课程的教学要求结合自身的实际情况进行课程的学习。教师可以按阶段把当前应该掌握的知识以及应该完成的学习进度以消息的方式提示给学生,以便学生自己掌握好学习的进度。这种模式可以把只有教师教、学生被动学的教学模式,转变为由教师制定学习计划、让学生自己根据实际情况进行***自主学习的教学模式。这样每个学生能够根据自己的时间安排,自由选择、合理安排“上课时间”。这种教学方式可以有效地提高学生的自主化学习及***思考问题的能力,在自己的主动探索中不断发现问题、提出问题并且解决问题。
(2) ***作业模块:本模块旨在通过网络平台给学生布置课后作业及上机实验,学生可以通过该模块***提交作业及上机实验结果,教师可以及时检查、了解学生的学习状况,以督促学生进行主动学习。
(3) ***答疑模块:一个合格的***学习系统必须包含***答疑模块。***答疑模块为教师和学生、同学和同学之间提供了提问、交流、切磋的平台。***答疑平台是一个论坛形式的公共平台,它的功能主要是由学生***向教师提出课程学习中的疑难问题,由教师定期予以回复。但在实践中我们发现,这个平台的功能远大于此。学生们不但在***答疑平台上提出了许多很好的问题,而且同学之间也可以进行丰富的交流。有时,不用等到教师给出问题的答案,同学之间就已经把问题解决了。因此,这个平台真正成为了教师、同学之间进行交流、传授知识、切磋技艺及发表心得的纽带。
(4) ***考试模块:在课程学习结束后,可以通过***考试模块来考察学生对相应课程的学习掌握情况。通过Internet/Intranet实现网上考试,是现代教育技术的一个具体实现,具有很重要的现实意义。通过网络进行***考试的模式是对传统的考场考试方式的延伸,它可以利用网络的无限广阔空间,随时随地对学生进行考试。该模块的实现,不仅可以实现自动化组卷、阅卷及考务工作的全自动化管理,为实现考试的客观性和公正性、实现考教分离及进行大规模的考试提供相应的支持,而且可以有效地利用校园网的软硬件资源,使其发挥最大的效力,更好地为学校的教学、科研、管理服务,也为检查学生进行自主化学习的效果提供了一定的技术支持。
4结论
本文通过对学生进行自主化学习方法的探讨和研究,提出了关于“汇编语言程序设计”课程实现以教师为主导、学生进行自主化学习教学模式的方案。详细介绍了北京工业大学校园网***学习及考试系统的基本构架、部分已实现的功能、系统的整体构想以及该系统对学生进行自主化学习的具体帮助及技术上的支持。
通过对汇编语言程序设计课程自主化学习教学实践的研究,可以看到为了更好地实现学生的自主化学习,教师不仅需要研究各种教学方法及教学内容,而且需要利用先进的现代化网络技术,进一步完善教学及实践方式,这样才能更好地指导、协助学生进行自主化学习。自主化学习教学方案的实施,不仅能够培养学生自主学习、***思考问题、解决问题的能力,而且能够极大地提高学生的实践能力及创新精神。我们期望汇编语言程序设计课程的自主化学习的教学改革与实践,能够为其他课程的教学改革提供一些积极的探讨和有益的经验。
参考文献
[1] 梁峰. 多媒体校园网系统探讨[J]. 教育技术理论与实践,2005,(4).
[2] 易小琳等. 基于EDA平台的计算机系统硬件课程虚拟化实践的研究[J]. 中国大学教学,2005,(7).
[3] 易小琳等. 网上计算机系统虚拟实验室的研究[J]. 计算机工程,2002,(11).
[4] 中国计算机科学与技术学科教程[M]. 北京:清华大学出版社,2002.
作者简介
易小琳(1959-),女,高级工程师、计算机系统结构教研组主讲教授,硕导,目前研究方向为计算机系统结构及嵌入式系统。
鲁鹏程(1976-),男,讲师,计算机系统结构教研组教师,博士,目前研究方向为计算机系统结构及嵌入式系统。
周巍(1982-),男,研究生助教,目前研究方向为计算机系统结构及嵌入式系统。
杨峰(1984-),男,研究生助教,目前研究方向为计算机系统结构及嵌入式系统。
联系方式
北京工业大学计算机学院,北京朝阳区平乐园100号,100022,易小琳
E-mail:
汇编程序篇7
杂谈之十七
为了研究正版卡的反制,特别是某地有线类型的高级反制,不仅要研究带Key的EMM,还要关注和跟踪修改EEPROM的EMM。一直关注这些EMM动向的朋友会得到正版卡修改后的EEPROM代码,它们一般以*.BIN的形式给出。朋友们打开装有PC仿真卡的微机程序目录,可以在MyTheatre\Plugins\Nagra\目录下看到不少的这类*.BIN文件。
如果得到了ROM卡的*.BIN文件,就可以了解到正版卡在EEPROM中加入了哪些新的补丁程序或采取了什么反制方法。
研究和了解的第一步是反汇编。反汇编是将机器指令或数据代码转为源程序的一种操作,它是汇编过程的反向操作,是反向工程的一种手段。
一般开发产品,自主编写源程序后,主要的工作是汇编,很少反汇编。但在我国卫视界破解的朋友中,却常常进行反汇编。
原因之一,是因为水平不够,无法自编源程序,只好用国外或国内高手赠送的目标代码通过反汇编来转为源程序,再进行学习和修改,这成了必要的步骤。
原因之二,是研究正版卡的反制方法与原理的需要,必须通过反汇编将EMM或EEPROM中的机器码转为易读的源程序,再进行分析和研究。
汇编是将源程序转换为目标代码的过程,它比较简单,指令或数据转为机器码时都是唯一的,没有二义性;而反汇编就复杂得多!由于二进制代码的多义性,即,同一个字节,可以代表多种信息,它即可以代表CPU的操作指令,又可以代表各种字符、无符号数、带符号数、浮点数和其它种种信息,因此,一般情况下反汇编是不可能返回汇编前的源程序的,如果反汇编能将指令或数据正确区别开来,就是很不错的了。
朋友们可能有疑问:要反汇编的是程序,只要转为助记符指令就可以了,怎么还会有转为数据的问题呢?为什么难以区别程序与数据呢?
原来,程序是指令与数据的集合,程序存储区中即可以存放CPU的指令,又可以存放程序使用的数据,它们都是二进制代码。在源程序中,不仅有CPU执行的指令,也还有程序用到的数据,这些数据是用数据定义伪指令来描述的。指令与数据汇编后产生的目标代码都是二进制数,它们可能是指令也可能是数据,单从二进制代码本身并不能区别出它们是指令还是数据。
以ROM10卡的EEPROM中的部分机器码反汇编为例:
在ROM10.BIN文件中,取从地址$CE18开始的机器码:CD CB 21 00 96 02 70 08 A6 01。
用反汇编软件,如EMMStudio中的Disassembler,反汇编得到的源程序(是错误的)见***17,正确的反汇编应当得到如***18的源程序。
对比以上两个反汇编的源程序,就可以看出,反汇编后的源程序差别有多大!
前面的反汇编没有正确区别指令与数据,得到的源程序将误导阅读者,使之无法了解正确的程序思路。
而后面的反汇编正确区别了数据与指令,阅读者就可以明白程序的思路。
像这样的情形大量发生在某地有线的超级反制程序中,正如Kid朋友给我代码时的附言所讲:“cb 与ce code内,有很多都是特别的subroutine,用emmstudio disassem 时要小心一点,否则会看得不明所以……尤其是‘cd’等字眼,多是地址位置而不是opcode。早一页我post 出的就是例子,自己用emmstudio 时会出现不同结果。而keychange 的bytedump 部分全是random parameters for MAP CALL,再多例子也没分别。”
反汇编是有志研究破解的人必须掌握的技能,它是一个再创造的过程,需要的能力绝不比编程低,不要小看了反汇编的技巧,不信?可以自己试一试将我的程序代码反汇编看看!
杂谈之十八
真正的源程序的价值是非常高的,而简单反汇编得到的所谓源程序就没有什么价值,因为这样的源程序难以阅读,难以修改。
如何能将目标代码转换成为真正的源程序呢?
以下是正确反汇编的基本步骤:
1、反汇编首先要选对反汇编的工具程序DisAssembler,反汇编工具应当针对目标代码适用的CPU。乱抓一个来用,也可以反汇编,但产生出来的是莫名其妙的东西。一般的汇编程序都顺便带有反汇编的功能,也有专门的反汇编工具可以使用。大型的反汇编工具使用起来比较复杂,初学者可以先试试简单的。
2、其次,反汇编得到的源程序要能再汇编成为目标代码,这个目标代码必须与原先用于反汇编的目标代码完全相同,这可以检验反汇编是否基本正确。
3、再次,反汇编得到的源程序必须经过人工的阅读、分析和判断,确定哪些是指令代码,哪些是数据,确定之后,再告诉反汇编工具程序,让它做相应的处理,产生更合理的源程序。这个步骤要反复进行,直到数据和指令正确分离为止。判断哪些是数据,哪些是指令,要有敏锐的观察力。通常,如果出现“Unknown”字样,或不合逻辑的指令(如对同一个变量重复赋值等),或程序没有入口标号等,就可以认为这部分是数据;如果程序中出现了不合理的标号,说明其它地方还存在数据被当成指令的错误。
4、最后,对这种反汇编得到的原始源程序进行人工修改,使用有意义的变量名、常数名和子程序名替换原来没有意义的标号,加上详细的注释,最终才形成真正的源程序。这一步是一个再创造的过程,是反汇编中最难和最关键的工作。不会编程的人,一般无法完成这一步,因此我说:“反汇编是一个再创造的过程,需要的能力绝不比编程低!”是否真正能得到可以供修改和继续开发的源程序,关键都在这一步。可以说,反汇编的工作,工具软件仅仅帮了我们反汇编工作的其中一小部分,仅处理了那些死板的固定套路的事,而关键的智力活动都必需要人来完成。
许多朋友过分相信和依赖工具软件,这是不正确的。好的工具软件可以帮助我们,减轻不少繁琐的劳动。但工具是死的,而人是活的,是创造性的源泉。反汇编这种需要高智力的劳动,更是单纯依靠工具软件不可能完成的。
以下例子是取自146 D卡中的部分Flash程序,用于说明上述反汇编过程:
A. *.HEX格式的Flash程序代码(部分)如***19。
B. 用DISAVR2.EXE来反汇编,得到如***20的代码。
C. 经过人工分析,正确分离出数据和指令,在修改变量名,程序入口名,加上注释,得到最后的源程序见***21(前面这部分是这段程序的理论依据,来自StuntGuy的FAQ,作为注释,放在源程序中,帮助理解和阅读)。
在人介入之前,反汇编得到的源程序没有什么价值;而通过人的智力劳动所得到的源程序,十分便于阅读,可以任意修改、搬移到任意地方、增加或删除指令等等,成为闪亮发光的珍宝!
杂谈之十九
要了解正版卡的反制原理,首先要反汇编ROM卡中EEPROM的程序。ROM卡使用的CPU是ST7,它是STMicroelectronix 8位处理器家族的成员,指令系统与硬件结构向下兼容Motorola的6805计算机,可以直接执行EMM中携带的6805指令集。
通过下行的信号对ROM卡更新后,产生了新的程序。这些新的EEPROM的信息往往以*.BIN文件的形式出现在网站上。我们得到后,可以选择文件中我们有兴趣的一部分信息,交给EMMStudio进行反汇编。之所以选择EMMStudio,是因为EMMStudio专门针对ROM卡,它的反汇编具有一定的智能,可以自动处理变量名、ROM卡中已知的子程序名和特定子程序夹带的数据等,还可以加上注释;之所以只对一部分代码反汇编,是因为EMMStudio对反汇编调入的代码长度有限制,不允许超过4kB即$1000。
下面以某地有线反制的EEPROM程序的反汇编为例,介绍ROM卡的*.BIN文件中部分代码进行反汇编的基本方法:
根据EMMStudio解开的EMM,我们可以看到某地有线下行的EMM中夹带了这样的一段程序(见***22)。
从中我们知道,一切的关键都在$CE02这个子程序中,必须要反汇编存在ROM卡的EEPROM中的地址为$CE02开始的程序。
1、将含有$CE02程序的*.BIN文件读入某种编程器的缓冲区,缓冲区地址从$0000开始。记住ROM10/ROM11文件的*.BIN文件是从$C000地址开始的(见***23)。
2、计算保存文件的开始地址=需要反汇编的程序地址的开始地址-$C090。如,希望反汇编$CE02开始的子程序,则计算出的保存文件开始地址=$CE02-$C090=$0D72。
3、用编程器保存文件的功能,保存一份文件,文件类型为*.BIN,保存的缓冲区地址为计算得到的开始地址,文件长度为$1000。注意:EMMStudio的DisAssembler只接受长度为$1000的文件。例,保存文件名定为:CE02.BIN,开始地址为$0D72,长度为$1000(见***24)。
4、进入EMMStudio,点击DisAssembler功能,点击“Extract BSs Code From EEPROM Image...”,选择在第3步中保存的文件名,将Initial Addresses 和 Code Base都改为程序的真实地址,如在上例中,地址都改为$CE02,选择ROM卡的类型,如ROM10,最后点击“DISASSEMB-
LER!”,完成反汇编(见***25)。
5、当然,特殊的子程序,如后面跟随数据的,反汇编可能不正确,需要人工判读,并采取特殊的处理(处理方法从略)。
杂谈之廿
前几篇“杂谈”谈了不少反汇编的方法,通过反汇编可以阅读程序,了解不少程序的原理,这种方法对于可以得到目标代码的情形,是十分直接和有用的方法,但对于MAP功能,却无能为力,因为MAP程序的代码无法得到!
对于MAP功能的分析,只有通过不断调用MAP的某个功能,用不同的输入数据“喂”给它,观察它的输出从而判断出MAP完成的是何种操作。
由于MAP协处理器在ROM卡的内部,因此要实现不断测试MAP功能的操作,需要特殊的方法:
1、需要编写一段特殊的类似“Trojan Horse(木马)”的程序(我称为“MAPLogger”),该程序的功能是在EEPROM中纪录MAP执行前ROM卡有关内存的数据,然后调用MAP功能,执行后再在EEPROM中纪录MAP调用后ROM卡有关内存的数据。
2、修改ROM卡EEPROM中的部分程序,用MAPLogger的调用取代原先MAP的调用,让MAPLogger程序起作用。
3、将特定的EMM发送给ROM卡,让它执行EMM中的程序,触发引起调用特定的MAP Call,这时,我们埋伏在其中的MAPLogger会起作用,记录下我们希望看到的数据。
4、将ROM卡的EEPROM区读出,取出MAPLogger纪录的数据,供分析和研究。
这种嵌入式Logging的方法是Cracker们研究的常用手段。
对于ROM卡而言,需要的工具与软件有:
1、Phoenix写卡器,写卡器的晶振频率应当为3.68MHz(见***26)。
2、NagraEdit软件(见***27)。
3、XNCS软件(见***28)。
写卡器的作用是配合NagraEdit和XNCS软件,完成以下任务:
1、往ROM10卡中写入*.BIN文件。
2、发送EMM或其它信息。
3、从ROM10卡的EEPROM中读出记录到的信息。
MAPLogger程序由某个高手编写成功,我反汇编后加上注释,列出如下,供参考(见***29)。
MAPLogger的嵌入与使用方法如***30。
汇编程序篇8
引言
长期以来,在DSP系统开发中,一直把汇编语言作为主要的开发工具;但汇编语言与自然语言差距很大,不易常,而且汇编语言是依赖于处理器的,不利于软件的可重复利用和系统的稳定性,程序不易移植,给开发工作带来了很大的困难。随着嵌入式系统复杂程度的不断提高,用汇编语言编写一个巨大的程度将是困难,甚至是不可能的。为此,AD公司推出了针对ADSP21XX系列DSP的嵌入式C和C++语言集成开发工具,分别是VisualDSP和VisualDSP++系列,这些开发工具提供了C语言和C++语音的开发功能。以下就以笔者在实际开发中的一些经验,结合VisualDSP6.1版本,介绍用C语言开发VisualDSP6.1版本,介绍用C语言开发ADSP21XX的方法。VisualDSP提供了一个开放源码软件组织GNU的C编译器,和一套成熟稳定的C运行时间库(C Run time Library)等。GNU的编译器一向以编译效率高著称,在编译后的代码长度和运行速度方面非常优秀;C运行时间库则把很多重复性的工作,如浮点运行、三角函数、FFT等作为C语言的库函数,提供给用户,大大提高了用户的开发效率和程序的稳定性,降低了开发难度,另外,由于把这些库函数的源代码提供给了用户,还提高了C语言与汇编语言之间的透明性,使用户开发的程序兼具两者的优点。
1 Visual DSP简介
VisualDSP是AD公司的DSP开发工具,主要由可执行文件、库文件和各种帮助文档组成。6.1版本还带有一个基于***形界面,针对21XX系列DSP的软件仿真和调试工具。
VisualDSP的可执行文件包括汇编、编译、链接工具以及可执行文件重新格式化工具等,见表1。
表1 VisualDSP的可执行文件及用途
可执行文件名用 途
Asmpp.exe*汇编预处理程序Asm2.exe*21XX系列汇编程序的汇编程序Asm21.exe21XX系列命令行汇编程序Ld21.exe21XX系列链接工具G21.exe基于GNU的21XX系列C编译器Bld21.exe系统编译工具,产生相应于不同硬件体系的.ACH文件Lib21.exe21XX系列的库管理工具Hspl21.exe把21XX系列可执行文件变成HIP口可加载的格式Spl21.exe把21XX系列可执行文件变成PROM可烧写的格式注:“*”代表该程序一般不单独使用,而昌由G21.exe或Asm21.exe调用。
VisualDSP套件中的软件仿真调试工具DEBUGAPP,采用Windows***形界面,使用方便。它的主要特点是:可以仿真调试从ADSP2101~2189全系列的DSP;支持断点、单步、全速运行等各种常见调试方法;可以随时查询和修改DSP的程序RAM(PM)、数据RAM(DM)和各寄存器的内容;可以仿真中断,进行可执行程序性能评估(Profile),因此可以进行时序仿真。DEBUGAPP是调试程序和验证复杂算法的极好工具。
VisualDSP6.1还提供了丰富的帮助文档,包括21XX系列的用户手册、汇编和C语言工具以及仿真调试程序的使用手册;还有C运行库的参考手册,列出了所有可用的C库函数。用C语言开发DSP的典型流程如***1所示。
2 C语言运行库结构
C语言运行时间库是位于LIB目录下的*.a文件,是整个C开发工具的核心之一,提供了大量的可以直接调用的库函数。这些库函数的函数原型包含在INCLUDE目录下的头文件中。这些头文件有的还包含一些宏定义。另外,VisualDSP还把这些库函数的汇编语言源代码提供给出了用户,方便了用户从中提取有用的代码,甚至修改源代码,生成新的库,来适应自己的要求。利用LIB21程序,还可以把自己的常用汇编子程序做成库,或是将实时性要求较高的代码用汇编语言来写,做成库,供C语言程序调用。
VisualDSP的C语言运行库由两部分组成:应用程序框架和预定义的各种库函数。
不同的DSP型号有不同的硬件结构、中断向量表,所以对应的应用程序框架库也不同,相应的文件是21*_HDR.DSP.其中*代表不同的DSP型号。应用程序框架的主体是中断向量处理部分,把中断向量引到合适的地址。其中最重要的是对系统复位(RESET_VECTOR)的中断向量的处理:
_Reset_vector:CALL_lib_setup_everything;
CALL main_;
JUMP_lib_prog_term;
NOP;
第一条指令是调用C库函数中的_ _lib_setup_everything函数作程序启动时的初始化工作。接下来,调用C语言程序中的main_函数,进入C程序的主体,也就是进入用户自己程序,开始正常工作。主程序结束后,再调用_lib_prog_term函数,作程序退出时的结尾工作。由于嵌入式系统的特性,系统绝大多数都在主程序运行时被继电了,所以_lib_prog_term得到执行的机会很小。
其它的中断向量由C运行库来管理,汇编指令如下:
_Interrupt2:JUMP_lib_int2_ctrl;NOP;NOP;NOP;
其中的_lib_int2_crtl就是C语言库中控制INT2的函数。如果用户要使用该中断,应先把中断服务程序用一个C库函数Interrupt()把服务函数指针设定好,并打开相应的中断允许位,当该中断发生时,_lib_int2_ctr1函数就会控制DSP跳转到相应的指针位置。
VisualDSP预定义的C语言库函数包括数学函数、FFT函数、ANSI标准内存管理和字符串管理函数的一个子集。所有的函数列表可参考VisualDSP的联机文档。这些库函数以二进制代码的形式,打包集合在lib*.a文件中,用户的C语言程序可以像使用自己的子程序一样方便地调用这些库函数。下面是调用库函数的一个例子。
#include //包含所需的头文件
……
float a,b,c; //定义所需的变量
……
c=a*sin(b); //数学运算
编译后产生的汇编源代码中有call sin_指令,就是调用sin库函数的汇编语言指令语句。
从嵌入式开发的角度讲,VisualDSP的C语言工具已经提供了一个操作系统雏形的功能。在AD公司的ADMC系列DSP中,已经把这些库函数和一些电机控制专用的函数,以及程序加载功能,集成在了DSP的片内ROM中。
3 C语言与汇编语言混合编程方法
用C语言开发的缺点是不能精确控制程序运行的时间,对于实时性要求较高的应用,必须用汇编语言。VisualDSP为用户提供了两种与汇编语言的接口方法:用A***()方法,直接嵌入汇编语言语句;用汇编语言编写子程序,供C语言程序调用。为了支持C语言与汇编程序程序的接口,VisualDSP预定义了诸如FUNCTION_ENTRY、EXIT、SAVE_REG、RESTORE_REG等13个宏。限于篇幅,不详细介绍其功能。使用这些宏以前,要包含asm_sprt.h头文件。
3.1 使用A***()嵌入行的方法
使用这一方法时,一定要注意各寄存器和堆栈当前的状态,以免破坏程序运行的环境,产生错误的结果。VisualDSP保留了一些内部寄存器供用户的汇编代码使用。用户可以自由地修改其内容,而不会对程序造成破坏。这些寄存器包括AR、AF、AY1、M5、11、16、MF、MR0等18个。如果不够用,可以用系统定义的宏save_reg和restore_reg保护现场,得到另外11个可用寄存器。另外要注意的是,在汇编语言中操作C语言中定义的变量时,要在变量名后加下划线。下面是一个嵌套汇编语言的例子:
int img228; //定义C语言变量
asm("ax0=0x5c;")
asm("dm(ing228_)=ax0"); //用汇编语言赋值要将Img228变成Img228_
img228=0x5c; //直接用C语言赋值
编译后的汇编语言代码是
ax0=0x5c;
dm(img228_)=ax0
my1=92;
dm(img228_)=my1;
注意前者可能会破坏程序结构,因为它使用了未经保护的寄存器AX0;而由C语言产生的汇编代码,则会自动选择合适的临时寄存器MY1。
3.2 使用汇编子程序的方法
使用汇编子程序是C语言程序与汇编语言接口的另一种方法。用户定义的子程序放在单独的汇编文件中,或是做成二进制的库文件,并将子程序的定义用GLOBEL输出,汇编后就可以供C语言程序调用。下面是一个不需要参数的子程序的例子:
.MODULE/RAM_delay_;
.external del_cycle; //声明del_cycle是外部变量
.global delay; //声明delay为全局函数
delay_:
runction_entry; //子程序开始标志,必须要的
ar=dm(del_cycle_);
cntr=ar;
do d_loop until ce;
d_loop:nop;
exit; //子程序结束标志,必须要的
.ENDMOD;
如果汇编语言子程序中用到了参数,情况就复杂些。子程序中的入口参数前两个一定要保存在AR、AY1中。如果参数多于两个就要把其余的放在堆栈中。所有子程序的第一个返回值放在AR中。如果返回值不止一个,就要用到变量型参数或者指针来获得取所有的返回值了。下面是一个有5个输入参数、1个返回值的子程序例子。
add5_:
function_entry;
ar=ar+ay1; //前面的两个变量放在AR、AY1中
readsfirst(ay1); //从程序堆栈中读取第三个变量
ar=ar+ay1;
ay1=readsnext; //从程序堆栈中读取第四个变量
ar=ar+ay1;
ay1=readsnext; //从程序堆栈中读取第五个变量
ar=ar+ay1; //返回值放在AR中
exit;
注意其中的readsfirst和readsnext都是汇编语言接口宏。其功能是从堆栈中读取所有的参数。
4 C运行库的汇编源代码
如果只用C语言来开发21XX程序,只要有C运行库的二进制版就够了。幸运的是,AD公司把所有C运行库的汇编源代码随VisualDSP提供给了用户,所以对那些用汇编语言开发的工程师来说,这些源代码也提供了很大的帮助。因此这代表很多功能的子程序不需要自己去编码、调试,用到某功能时只要把相应的汇编代码链接进自己的程序就可以。C运行库的源代码是扩展名为DSP的文本文件。基本上一个库函数对应一个文件,文件名就是函数名。比如说sin.dsp是正弦、余弦查找、使用都很方便,但是对于其中的交叉调用要注意。
反过来,用户也可以把自己已经调试、验证过的汇编子程序,做成二进制库文件,供C程序调用,这样可以大大提高软件的可重复利用率。要制作二进制库文件,只要用lib21.exe工具处理就行了。注意,生成的二制库文件的名字必须以.a作为文件扩展名。
笔者在实际的开发中,遇到这样的情况,自制的2181目标板上有一个自己开忍气吞声驻留程序,通过软件模拟的异步串口与PC通信,加载程序。但是这个驻留程序占据了0~0x500的空间,用户开发的程序只能加载到从0x500开始的空间内,而用C语言开发的程序起始地址都是从0开始的。为了解决这个问题,只能自己修改2181_hdr.dsp源文件。首先把第一行的.MODULE/ABS=0改成.MODULE/ABS=0x500,然后汇编成obj文件,代替原来的文件。另外,在自己的程序中定义一个从0开始0x500大小的PM区域,并初始化成0,就可以防止编译器在该区域内分配别的变量或程序代码,这样编译后的可执行文件的0~0x500空间都是0,加载时把它剔除,而其它有用的指令代码都在0x500之后,解决了这一个问题。
汇编程序篇9
关键词:汇编语言;指令系统;宏汇编;Win32
中***分类号:G642 文献标识码:A 文章编号:1009-3044(2014)07-1473-03
在《微机原理及应用》课程中,微处理器中的指令系统以及汇编语言编程是很重要的内容,它是微机系统的主要组成部分之一。随着计算机技术的不断发展,微型计算机由16位微处理器早已过度到了32位微处理器,当前,《微机原理及应用》课程的内容应该以32位微机为主,而32位微处理器是基于16位微处理器的基础之上产生与发展的,它兼容了16位微处理器8086的指令集,因此,在阐述32位微处理器指令系统时,必然涉及到16位的指令,相应的汇编语言编程也在发展,教学过程中如何优化处理16位与32位指令系统及相应的汇编语言编程,使学生能够快速地学习与接受32位机的工作原理,提高教学效果,它是《微机原理及应用》课程教学中的一个难点,是一个值得探讨的问题。
1 《微机原理及应用》课程中的指令集
32位微处理器指令系统包括基本指令集、浮点指令集、保护方式指令集以及扩展指令集等。根据浮点运算部件和浮点运算格式,用浮点指令编写浮点运算程序;保护方式指令集通常由系统程序员使用,编写操作系统程序,保护方式一般是由操作系统通过执行初始化程序来设置的;CPU扩展指令集指的是CPU增加的多媒体或者是3D处理指令,这些扩展指令可以提高CPU处理多媒体和3D***形的能力。一般在计算机课程教学中涉及的指令系统主要是基本指令集,因此,该文所讨论的指令系统是指微处理器的基本指令以及应用基本指令进行的汇编语言编程。
2 教学中以16位指令系统作为基础
微处理器的发展过程经历了从经典的16位微处理器8086到80286、80386、80486、Pentium、多核等系列微处理器的演变和应用。在教学中,首先还是要以8086 CPU为基础组织教学,介绍16位CPU的结构及16位的指令系统,理由如下:
第一,8086 CPU的内部结构简单,有利于学生学习与建立微处理器的概念。
8086微处理器的内部主要包括执行单元EU和总线接口单元BIU,它具有中央处理器(CPU)的经典结构,使学生容易建立微处理器的概念。总线接口部件BIU是8086 CPU与外部存储器和I/O端口的接口,它提供了16位双向数据总线和20位地址总线,负责CPU与存储器及I/O端口之间的数据传送操作。执行部件EU从BIU中的指令队列获取指令,对指令进行译码分析并执行,执行指令所需要的操作数和运算结果都是通过总线接口部件与指定的内存单元或外设端口进行传送的。
在一般教材中,高档微处理器的结构则侧重于其他复杂功能块的分析,不易为初学者接受。
第二,8086 CPU内部各组寄存器结构清晰,通过DEBUG调试程序或MA***汇编程序,很容易验证,而且,学生理解8086 CPU内部寄存器组后,很容易理解32位微处理器内部扩充后的寄存器组。
8086 CPU内部分为:8个16位通用寄存器,每个寄存器还有它们各自的专用场合;4个段寄存器都有各自所代表的内存段;16位的指令指针IP用来存放将要执行的下一条指令在当前代码段中的偏移地址,它与代码段寄存器CS联用,以确定下一条指令的物理地址; 16位的标志寄存器(FLAGS)只定义了9位,分为两类,一类用于反映部分指令(例算术运算及逻辑运算指令)执行结果的状态,常用作后续条件转移指令的转移控制条件,另一类为控制标志,用来控制CPU的操作。
如果学生从理论与实践上,理解与认同了8086 CPU内部的寄存器后,一方面对微处理器的工作原理有了较系统的认识,另一方面,对于下一步学习32位微处理器,奠定了坚实的基础。
3 教学中快速处理32位指令系统
由于学生从理论与实践(上机)两方面,已经掌握了16位机的指令系统,如何快速处理32位指令系统,首先,要简单介绍32位CPU内部寄存器的编程结构,比如,通用寄存器扩充到了32位,增加了两个段寄存器(FS、GS)等。然后,着重介绍32位机的寻址方式,32位机与16位机寻址方式绝大部分是相同的,主要是32位机寻址内存方式多,而且灵活,因此,要重点介绍32位机寻址内存的几种方式。
4 在宏汇编MA*** 6.X IDE环境下调试程序
MA*** 6.X是一个IDE环境(集成开发环境),它将汇编语言源程序的编辑、汇编、执行、调试合为一体,呈现在程序员面前的是一个窗口,使用非常方便。MA*** 6.X将汇编程序和调试程序(DEBUG)集成到一起,使程序的开发和调试结合的更紧密。MA*** 6.X最具特色的是能够汇编简化段模式的汇编语言源程序,可用于简化段程序的设计及汇编16、32位指令的程序,还提供了类似于高级语言的IF/ELSE分支结构、WHILE和REPEAT/UNTIL循环结构,使编写汇编语言程序和编写高级语言程序一样方便。现在最新的汇编程序MA***32支持32位段操作,可以构造出窗口程序,功能已接近于高级语言程序。
16位汇编语言编程以完整段格式编写,32位汇编语言编程以简化段格式编写,程序不在于多,但具有典型性。由于《微机原理及应用》课程总学时数不可能完全满足教学的需求,所以,在上机学时的分配上,MA*** 6.x IDE环境的熟悉与16位汇编语言上机4学时,32位汇编语言上机6学时。
5 在Win32汇编语言集成开发环境下调试程序
Win32汇编语言程序是构筑在Win32 API基础上的。在Win32 API中,包括了大量的函数、结构和消息等,它不仅为应用程序所调用,也是Windows自身的一部分,Windows自身的运行也调用这些API函数。
Win32环境中的API编程接口实际上代替了DOS中的软中断,和DOS的结构相比,Win32的系统功能模块放在Windows的动态链接库(DLL)中,DLL是一种Windows的可执行文件,采用的是和.exe文件同样的PE格式,在PE格式文件头的导出表中,以字符串形式指出了这个DLL能提供的函数列表。应用程序使用字符串类型的函数名来指定要调用的函数。应用程序在使用的时候由Windows自动装入DLL程序,并调用相应的函数。
5.1 Win32汇编语言程序集成开发环境的使用
Win32汇编语言程序集成开发环境下的使用并不复杂,大致过程如下:
1)启动Win32汇编语言程序集成开发环境;
2)汇编语言编程的第一步是建立一个新文件,所以在菜单中选择“File”“New”建立一个新文件;
3)第二步是进行文件的编辑,编辑包括程序输入、插入、删除、修改和保存,最后生成文件的后缀是.asm。
4)汇编语言编程的第三步是汇编和连接源程序,生成可执行文件。所以在菜单中选择“Project”“Build All”来完成此工作;
5)在汇编和连接无错误的情况下,会自动生成可执行程序,在菜单中选择“Project”“Run Program”,执行程序得到结果。
5.2 Win32汇编语言程序的理论教学与上机
Win32汇编语言程序的编写,是一个重要的问题,建议讲解4学时。主要讲解内容:
1)针对简单的Win32汇编语言源程序,讲述有关模式的定义、头文件和库文件的加载、程序段的定义、Win32汇编源程序注释和换行的规定;
2)关于API的说明与调用API;
3)Win32汇编语言程序设计方法和实例。
Win32汇编语言程序的实践教学,教师提供2学时的上机范例,包括机房讲解Win32汇编语言程序集成开发环境。学生自己编程,上机2~4学时,共计6学时左右。
6 结束语
汇编语言程序设计在计算机专业是一门***的课程,在《微机原理及应用》课程中讲解汇编语言程序设计,由于其内容非常丰富、涉及知识面宽、难度大,教学组织困难,学生难学。我们将《微机原理及应用》课程作为精品课程进行建设,通过不断地学习、教学实践以及编写教材,总结出了自己的认识与体会,教学效果较好。
参考文献:
[1] 李华贵,. 微机原理与接口技术[M]. 北京:电子工业出版社,2010.
汇编程序篇10
汇编语言程序设计是高校计算机专业的一门必修课,是组成原理、操作系统和信息安全等核心课程的先修课程。汇编语言使用指令助记符,使机器语言易学和易懂。相比高级语言编程,汇编语言程序运行效率高、可直接控制硬件,但是需要深入了解硬件,编程效率低,并且每种计算机的汇编语言编程结构不尽相同,上手较慢,降低了学生的学习兴趣,教学效果也随之下降。因此,需要对汇编语言教学现状进行剖析,并提出相应的改革措施。
1 汇编语言程序设计教学存在的http://问题
目前,汇编语言课程教学过程中存在以下问题。
1.1 教学内容相对陈旧,缺乏实用性
目前,很多高校的汇编语言教学还是基于十六位机,多采用清华大学出版的沈美明《ibm pc汇编语言程序设计》一书。其中,cpu内寄存器主要是16位,内存空间只有1mb,且只能在实模式下进行内存管理。而在目前的计算机技术发展环境下,内存空间以gb计算,传统的16位汇编语言教学模式明显滞后于现今的主流技术,学生学习时会觉得学过即淘汰,学习积极性较低[1]。
1.2 教学方法基本上还是采用常规的灌输式的教学方法
课堂讲授按照书本一章一节进行,知识点相对零散且枯燥乏味,难以在学生脑海中建立对语言的整体认识。特别是对于掌握了计算机基础知识和计算机语言知识的学生,在讲授汇编语言程序设计时仍延用常规的方法,不利于学生掌握大型汇编语言程序设计方法。
1.3 实验环节重视不够,实验教学方法单一
目前的实验安排都是围绕如何消化课堂内容展开,实验环节相对孤立且模仿性强,难于锻炼学生的综合问题解决能力;实验课只是布置任务让学生自己做,较少关注创新思维的培养。WWw.lw881
2 教学改革措施
针对汇编语言程序设计教学中存在的问题,从以下方面进行了教学改革尝试。
2.1 更新教学内容
为了适应硬件系统32位大环境,让学生学有目标,需要更新汇编语言的教学内容。在16位汇编语言基础上,适当增加32位汇编语言程序设计内容,具体包括:编程结构、寻址方式和指令系统。编程结构是汇编语言程序设计的着陆点。当前,winxp等主流操作系统都工作在保护模式下,在讲授实模式编程结构基础上,再介绍保护模式的编程结构,学生会感觉新颖实用。其次,32位汇编语言的寻址方式类型和操作数位数都大为增加。再次,32位汇编语言的指令系统多达300多条指令,其源代码的数量、速度、占用的内存资源都有了质的飞跃。因此,学习32位汇编,可以深入了解操作系统运行细节,并增加学生的学习兴趣。
2.2 案例教学法的使用
常规灌输式的教学方法下,教师对语法规则和指令系统逐个进行讲解,学生仅仅是被动、机械和强制的记忆,学习后面知识点时,容易忘记前面相关知识点。而使用案例教学法,通过简单实例引出枯燥的语法规则和指令系统,让学生即学即用,便于知识的前后衔接和呼应。案例教学的主要步骤包括:(1)案例设计和准备;(2)章节重点难点讲解;(2)学生分析案例;(4)教师分析和总结案例;(5)上机验证并完善案例。在不断变化和扩充的案例中,使学生有充分的空间思考所学内容,也易于引出新知识点,使得教学内容具有连贯性,有利于学生提高自信心并系统理解和掌握汇编语言。
2.3 精心安排实验及实验教学方法[2]
汇编语言的实验内容主要包括以下内容:调试工具debug的适用、汇编语言程序设计的上机过程、基本程序结构设计、子程序设计和中断调用,此外还可以让学生了解汇编语言与高级语言的连接,时间允许的情况下,还可以设计综合实验。实验教学中,可以采取演示法、模仿法和对比法相结合的教学模式。老师借助多媒体演示工具,将实验步骤从头到尾讲解一遍,学生跟着操作,可以极大提高学习效率。模仿方法下,老师将一些经典程序介绍给学生,学生在读懂后模仿编程,一段时间积累经验后,就可以编写较复杂的程序。另外,可以将汇编语言与c语言联系起来,对比其异同,促进学生对两种语言的理解。
3 结语