




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
宁 波 工 程 学 院学年论文论 文 题 目: 16 位汇编语言程序设计方法探索 学 院 名 称: 专 业: 学 生 姓 名: 学号: 指 导 教 师: 起讫时间: 年 月 日 至 年 月 日16位汇编语言程序设计方法探索xx(宁波工程学院 电气工程及其自动化,浙江 宁波 082027)摘 要:为了研究汇编语言的编程技巧,通过对分支结构程序的实际例子,进行了多种方法编写,并对各种方法进行比较,分析了如何有效精简程序的长度,为以后编写较大程序打好基础。关键词:编程技巧;汇编语言;分支结构16-bit assembly language programming methods to exploreYAO Dong(Electrical Engineering and Automation ,NingBo University of Technology,Ningbo,082071,China)Abstract: In order to study assembly language programming skills, through practical examples of the branch structure of the program, were prepared by various methods, and comparison of methods to analyze how to effectively streamline the procedures for the length of the program for the future lay the foundation for the preparation of larger .Key words: programming skills; assembly language; branch structure引言汇编语言是一种面向机器的程序设计语言,是一种低级语言,与那些高级语言相比而言,代码的长度过于长,开发效率不高,但是作为一门机器语言还是有其存在的价值的。因此,对于这种又长又难懂的语言,需要有良好的编程习惯,并且需要对计算机硬件有一定了解,掌握一定的编程技巧。1 汇编程序设计方法介绍汇编语言的程序结构跟各种语言基本上类同,都分为顺序结构,分支结构,循环结构这三大块结构类型,综合性的程序则是综合了以上几种结构的结合体。汇编语言编写起来无关乎定义数据段,堆栈段(在需要用到大量数据的时候使用),代码段这几个程序的主干部分,因此有必要先把这几个段的功能做一个简单的介绍。数据段:通常是指用来存放程序中已初始化的全局变量的一块内存区域,它属于静态内存分配,因此定义数据段很重要的一块就是要分配好全局变量的地址,有效的分配地址对程序的运行速度和编写效率都有很大的帮助。堆栈段:是用来存放局部变量和函数返回地址的,而且它是在程序运行时动态分配使用,只需要通过栈顶指针即可访问,因此,在要求大量使用数据或者一个数据在多个子程序被多次使用到时,为了方便可以在程序里面定义堆栈段,但是一般的小程序是不需要用到堆栈段,可以根据系统要求来定义一个空的堆栈段。代码段:通常是指用来存放程序执行代码的一块内存区域,这部分区域的大小在程序运行前就已经确定了,并且在内存区域内通常属于只读, 但是某些架构也是允许代码段为可写的,即允许自修改程序。简而言之,代码段是编写指令的地方,是一个程序的灵魂所在,也是作为一个编程者的编写技巧体现的地方。从上面可以看出,数据段,堆栈段定义没什么技巧可言,而真正的所谓变化是在代码段里面,相比高级语言的变化多端,汇编语言的变化稍显单薄,但是基本上经典的方法都是能够完全还原的。在这里,一个亘古不变的词又出来了,那就是“算法”, 算法是一系列解决问题的清晰指令,而它代表着用系统的方法描述解决问题的策略机制。算法并不是在计算机里面存在的,它是通过人的大脑创造出来的,所以编程的关键是在于对算法的设计,关于“算法”的设计,我会在文章后面结合具体的例子再详细阐述的。由于后面的例子需要,这里再来讲一下DOS中断调用。所谓DOS中断调用,就是为了节省编程工作量与优化程序结构,在DOS中预先设计好了一系列的的通用子程序,以便供DOS调用。由于这种调用采用的是以中断INT n的内部中断方式进行的,因此常称为DOS中断调用;又因为在一个中断程序中往往包含多个功能相对独立的子程序,所以也将中断调用称为系统功能调用或中断功能调用。2 汇编语言与C语言的比较 汇编语言与其他我们常用语言相比,比如C语言或者VB语言这些程序语言来讲,算是直接面向机器的低级语言,本人在这里就以我们常用的C语言作为高级语言的代表,来与汇编语言作比较,而像C语言这种高级语言,因为工作空间内有大量的函数可以调用,并且有能让机器更容易识别的能力,更重要的是也更容易被编写者理解,因此在就设计方法的变化来讲,可以有多得多的变化,并且用汇编语言编写的程序往往都可以被C语言运行来实现的,甚至用C语言可以更加容易,但是汇编语言有一个优势是其他任何语言所不具备的,这也是为什么汇编语言能一直在编程中占有一席之地,那就是汇编语言对硬件的直接控制,也就是说它能直接对硬件操作,可以绕过操作系统等等之类。虽然有的领域的其他编程也能够实现,但是在很多地方上往往是汇编语言能更加简单,更加完美的完成任务。而且学好了汇编语言你就能对CPU是怎么工作的有了清晰的认识,对存储空间的取址方式也能够有更加清晰的认识。 3 设计实例的编写要求与分析3.1编写要求从键盘上输入1个数,判断其奇偶性,如果是奇数,屏幕上显示“It is odd”,否则显示“It is even”。3.2 编程思路分析由于在键盘输入的字符在计算机上读取的是该字符的ASCII码,因此就要想办法去判断输入字符的ASCII码的奇偶性,而ASCII码可以表示成为二进制,并且二进制代码的每一位除了“0”就是“1”,最低位是“0”就是偶数,否则便是奇数。因此在这里算法的关键的就是如何取得输入字符的ASCII码的最后一位并且要来判断是“0”或者“1”。尽管也可以用传统的判断奇偶性的方法也就是将输入字符除以2再拿除出来的余数来判断“0”或者“1”,但是这种方法用汇编语言会显得比较麻烦,因此在这里不采用这种方法。 4 程序 4.1 本人编写的第一种方法这种方法的思路就是先定义数据段,然后再定义代码段,代码段中的算法核心是:键盘输入并显示一个字符循环左移7位循环右移7位(取得字符的最后一位)比较最后一位是“0”或者“1”,是“0”就是偶数,输出“it is even”,是1就是奇数,输出“it is odd”。这里是利用DOS中断调用的1号功能(等待扫描从键盘输入的一个字符,保存并显示在屏幕上)来输入一个字符,利用DOS中断调用的9号功能(显示以$结尾的字符串),来显示要输出的字符串。利用中断调用的4ch号功能来调回到DOS界面,在下面的方法中也是同样。data segment ;开始定义数据段 d1 db please input a number ,0dh,0ah,$ ;此数据段存入“please input a number”这句 d2 db it is odd ,0ah,$ ;此数据段存入“it is odd”这句 d3 db it is even ,0ah,$ ;此数据段存入 “it is even”这句 data ends ;定义数据段结束 code segment ;开始定义代码段(这里不需要定义堆栈段) assume cs:code,ds:data ;assume伪操作 是指定某个段分配给哪一个段寄存器 start: mov ax,data ;start主程序开始 mov ds,ax ;上面两句是规定数据存取的寄存器 mov dx,offset d1 ;offset伪指令取数据段d1的首地址 mov ah,9 ;9号DOS中断调用int 21h ;在屏幕上输出“please input a number” mov ah,1 ;1号DOS中断调用 int 21h ;键盘任意输入一个字符并将其显示在屏幕上 mov cl,7 ;给cl赋值,为后面的运算用 shl al,cl ;循环左移7位shr al,cl ;循环右移7位cmp al,0 ;比较最后一位是否为“0” ;以上三句是此程序核心,取最后一位与“0”比较判断奇偶。 je a ;若运算结果为“0”,跳入名字为a的程序分支 mov dx,offset d2 ;若运算结果不为“0”,执行下面语句 mov ah,9 ;9号DOS中断调用 int 21h ;这里是在屏幕上输出“it is odd”这句 jmp over ;跳入到over分支程序,退回DOS程序 a: mov dx,offset d3 ;a程序分支是用来显示偶数情况的 mov ah,9 int 21h ;这里是在屏幕上输出“it is even”这句jmp overover: mov ah,4ch ;over程序分支是用来跳回DOS int 21h ;4ch号DOS中断调用,跳回DOS界面code ends ;代码段定义结束 end start ;主程序结束运行结果:图1 编法一运行结果总结:这是一种相对来讲循规蹈矩的编写方法,按照顺序,先是定义了数据段,再编写代码段,核心的算法就是利用8位二进制代码循环左移7位和循环右移7位的指令来取得该字符的ASCII码最后一位,并且与“0”进行比较,预先设置好两个分支,偶数分支和奇数分支,如果末位是“0”则跳入偶数分支,不是“0”则跳入奇数分支,相应地显示其对应的输出语句,最后利用功能号4CH的DOS中断调用跳回到DOS界面。所以,总的来说这种编写方法是可以成功地判断出键盘输入的单个字符的奇偶性,完全可以说是也贴合设计要求去编写程序了,并且调试出来结果也是正确的,但是缺点就是编写的结构来讲还是不够巧妙,程序语句过多,并且只能判断个位数,而不能判断多位数。4.2 本人编写的第二种方法 这种方法也是依旧先定义数据段,然后定义代码段,代码段的算法核心是:输入并显示出一个字符与“1”作与运算计算结果为“0”,则输出首地址为d2数据段的语句,也就是偶数输出“it is even”,如果计算结果为“1”,则输出d2首地址加13个偏移量后的语句,也就是奇数输出“it is odd”。data segment ;开始定义数据段d2 db it is even $ ;此数据段存入“it is even”这句d3 db it is odd $ ;此数据段存入“it is odd”这句data ends ;数据段的定义,同上一种方法code segment ;开始定义代码段assume cs:code,ds:data ;assume伪操作 是指定某个段分配给哪一个段 寄存器start: mov ax,data ;主程序开始mov ds,ax mov ah,1int 21h ;键盘输入一个字符并显示在屏幕上and al,01h ;输入的字符与“1”做与运算mov ch,0 ;为防止赋值混乱,给cx高位赋“0”mov cl,0dh ;赋予cx=13,作为后面计算用mul cl ;将cl乘以做完与运算的allea si,d2 ;取d2首地址到simov bx,si ;将d2首地址先放入bx,si还有其他用途mov si,ax ;并将ax里面的值放入到si中lea dx,bx+si ;首地址加偏移量取得需要输出语句的首地址 mov ah,9 ;9号DOS中断调用int 21h ;将运算取得的首地址的语句输出mov ah,4ch ;4ch号DOS中断调用int 21h ;跳回DOS界面code ends ;代码段定义完成end start ;主程序结束运行结果: 图2 编法二的运行结果总结:利用这种程序的设计方法是在正确理解了存储器的寻址方式和写入数据的原理的基础上来设计编写的,此种设计方法的核心并不在于如何判断输入的二进制数的末位是“0”或者“1”,而在于对于输出语句的控制算法,假设该数字的最后一位是X(“0”或“1”),则利用了用来存放输出语句的存储空间的首地址为13X来寻找正确的输出语句的首地址。尽管这段程序并没有用到分支结构,但是从整个程序看来显得短小精悍,而汇编程序对子程序行数是有规定的,因此如果能编写得简短应当尽量简短。但是缺点是这段程序编写得尽管巧妙,但是仍然存在只能判断个位数,不能判断多位数的问题。4.3 本人编写的第三种方法 这种方法是利用了DOS中断调用的10号功能(从键盘接收字符串,并存放到内存缓冲区)来输入字符串,先定义数据段,这里的数据段定义稍微有些不一样,一定要定义一段为DOS中断调用的10号功能专用的存储空间,不然后面程序可能会出错,然后再定义代码段,代码段中程序的算法核心是:先输入字符串取得字符串长度根据首地址加偏移量取得该字符串的最后一位通过同1作与运算,判断取得的最后一位是“0”或者“1”,是“0”则是偶数,输出“it is even“,是“1”则是奇数,输出“it is odd”。data segment ;开始数据段定义d1 db please type a number $ ;此数据段存入“please type a number”这句d2 db 0ah,it is odd $ ;此数据段存入“it is odd”这句d3 db 0ah,it is even $ ;此数据段存入“it is even”这句d4 db 20 ;d4是专门为后面的10号DOS功能调用而准备 db ? 的数据段,第一个地址放最大位数,第二个地 db 20 dup(?) 址放实际位数,打入的数字从第三个地址开始 存放data ends ;以上数据段定义完成code segment ;开始定义代码段assume cs:code,ds:data ;assume伪操作 是指定某个段分配给哪一个段 寄存器start: mov ax,data ;主程序开始 mov ds,ax mov dx,offset d1 ;取数据段d1首地址到dxmov ah,9 ;9号DOS中断调用int 21h ;输出“please type a number”这句话lea dx,d4 ;取d4数据段的首地址到dx中mov ah,0ah ;10号DOS中断调用int 21h ;利用DOS中断调用的10号功能输入字符串mov bh,0 ;为防止赋值混乱,给bx高位赋“0”mov bl,d4+1 ;将实际输入字符的位数放入到bl中lea di,d4 ;取d4的首地址到dimov ax,di+bx+1 ;利用首地址+偏移量来找到该字符串的最后一位mov cx,01h ;将“1”放入cx用来后面做比较用 and ax,cx ;将取到的最后一位ax与cx(1)来做与运算cmp al,0 ;比较是否为 “0”jz e ;比较结果为“0”则跳入到e程序分支中mov dx,offset d2 ;比较结果不为“0”则按顺序执行程序mov ah,9 ;9号DOS中断调用int 21h ;输出“it is odd”jmp over ;跳入到over分支程序,退回DOS程序e: mov dx,offset d3 ;e分支是用来偶数分支,输出对应语句的mov ah,9 ;9号DOS中断调用int 21h ;输出“it is even”jmp over ;跳入到over分支程序,退回DOS程序over: mov ah,4ch ;over分支是用来跳回DOS界面int 21h ;4ch号DOS中断调用,跳回DOS界面code ends ;代码段定义结束end start ;主程序结束运行结果:图3 编法3的运行结果总结:这个程序设计方法是利用了DOS中断调用的功能号为10号的功能来输入字符串的,而利用这个DOS中断调用就必须在数据段存储空间里面设置一段d4 db 20,?,20 dup(?)的数据段来存储键盘所输入的字符串,假设输入了N个字符,而d4的首地址为X,则X地址上所存入最大输入字符个数,在这段程序里面就是20,而在X+1地址
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 北京舞蹈学院《女装纸样设计》2023-2024学年第一学期期末试卷
- 山东商务职业学院《跨文化交流与管理》2023-2024学年第一学期期末试卷
- 音乐脑科学探索-洞察及研究
- 云南理工职业学院《拉丁美洲文学史》2023-2024学年第一学期期末试卷
- 安吉cs团建活动方案
- 宣传板凳活动策划方案
- 小学牛奶促销活动方案
- 寻宝乐园活动方案
- 家装活动特惠活动方案
- 寻找影子活动方案
- 内蒙古锦山蒙古族中学2024年数学高一下期末综合测试模拟试题含解析
- 医院检验科实验室生物安全程序文件SOP
- 医疗设备仪器的清洁消毒
- 基于Matlab的巴特沃斯滤波器设计
- 儿童发展心理学全套课件
- 侵占公司资金还款协议
- 实验室搬迁方案
- 2013年10月自考英语二试题及答案和评分标准完整版
- 电大国开专科(附答案)《办公室管理》形考在线(形考任务五)试题
- 闻诊问诊切诊
- 2023年安徽省合肥市庐阳区小升初数学真题及答案
评论
0/150
提交评论