最新版马聪敏 汇编实验报告.docx
- 文档编号:23555551
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:40
- 大小:29.17KB
最新版马聪敏 汇编实验报告.docx
《最新版马聪敏 汇编实验报告.docx》由会员分享,可在线阅读,更多相关《最新版马聪敏 汇编实验报告.docx(40页珍藏版)》请在冰豆网上搜索。
最新版马聪敏汇编实验报告
华北电力大学
实验报告
|
|
实验名称汇编语言程序设计课程实验
课程名称汇编语言程序设计
|
|
专业班级:
网络1002学生姓名:
学号:
成绩:
指导教师:
王保义实验日期:
2013.1
实验1用表格形式显示字符
1、实验目的及要求
(1)实验目的
学习用汇编语言设计与编写循环程序。
(2)实验要求
按15行×16列的表格形式显示ASCII码为10H---100H的所有字符,即以行为主的顺序及ASCII码递增的次序一次显示对应的字符。
每16个字符为一行,每行中的相邻两个字符之间用空白符(ASCII为0)隔开。
2、所用仪器、设备
Masmforwindows集成实验环境
3、实验原理
利用dos的02号显示输出功能调用,显示字符
4、实验方法与步骤
(1)编程思路:
把dl初始化为10H,然后不断使其加一以取得下一个字符的ASCII码,直到dl为100为止。
换行时用cx计数。
显示空白符时,用其ASCII码0置入dl寄存器,每行结束时,用显示回车和换行来结束本行并开始下一行。
由于逐个显示相继的字符时,需要保存并修改寄存器内容,而显示空格,回车,换行时,也要使用寄存器,用堆栈保存相继的字符。
(2)流程图
5、分析与结论
用表格形式显示字符这个程序做起来比较简单,用语句:
movbl,15,movcx,16来定义15行*16列的表格,looplie语句循环输出每行的16个字符,先比较每一行的字符是否输出16个,如果是,则转到exit用movax,4c00h,int21h输出此行的字符,同时,行计数器随之增1,当行计数器增至15,证明字符表已经输完,完全显示出来,程序结束。
由于这个实验比较易于实现,先画出程序框图,之后就比较好编写,编程简单也比较快,所以没有遇到什么问题,最后的输出结果也是正确的。
实验二查找匹配字符串
一、实验目的及要求
(1)实验目的
学习用汇编语言设计与编写循环程序。
(2)实验要求
程序接收用户键入的一个关键字以及一个句子。
如果句子不包含关键字则显示‘Nomatch’;如果句子中包含关键字则显示‘Match’,且把该字在句子中的位置用十六进制数显示出来。
二、所用仪器、设备
Masmforwindows集成实验环境
三、实验原理
串比较指令,压栈、出栈,循环结构
四、实验方法与步骤
(1)编程思路
输入关键字和一个句子,分别存入相应的缓冲区中。
用cx计数,初始值为句子的长度:
从第一个字符开始,判断是否与关键字的第一个字符匹配,若匹配,做压栈操作,记住此时的位置,然后比较整个串(若整个串相同,匹配成功,否则不成功,出栈,继续比较下一个)。
若不匹配第一个字符,cx做减1操作,指针指向下一个字符,继续按此法匹配。
当匹配成功或找到最后一个字符也没成功匹配时,输出结果。
当结果为成功时,可继续输入句子匹配,当结果为失败时,结束整个程序。
(2)流程图:
五、实验结果与数据处理
六、讨论与结论
这个程序有三部分组成:
(1)输入关键字和一个句子,分别存入相应的缓冲区中,用功能调用0AH。
(2)在句子中查找关键字。
关键字和句子的比较使用串比较指令,定义一个附加段,和数据段定义为同一段,SI寄存器为关键字指针,DI寄存器为句子中正在比较的字段指针,CX为存放关键字的字母个数长度。
DI
SI
比较的循环次数为:
(句子长度-关键字长度+1),计算循环次数时,如果句子长度<关键字长度,就跳转到“nomatch”,循环中还要用到BX寄存器保存当前比较字段的首地址。
(3)由输出结果可知,可以成功查找关键字,基本完成了实验要求。
编程中的主要问题有:
1 如何记录查找位置
2 当第一个字符匹配后,如何匹配后面的字符串。
我采用的方法是一个个字符比较,但这样比较麻烦,若能用串操作指令显然更合适些
3 匹配成功后,如何输出是从那个字符开始的。
如何求得计数值并送往存储单元输出,调试了多次才得到正确结果
实验3分类统计字符个数
1、实验目的及要求
(1)实验目的
学习用汇编语言编写与设计分支循环程序。
(2)实验要求
程序接收用户键入的一行字符(字符个数不超过80个,该字符串用回车符结束),并按字母、数字及其他字符分类计数,然后将结果存入以letter、digit和other为名的存储单元中
2、所用仪器、设备
Masmforwindows集成实验环境
3、实验原理
程序采用0AH功能调用把键入字符直接送到缓冲区,然后再逐个取出分类计数。
需要多次用到ASC表,和数字或字符进行比较,设置了子程序display用于将二进制转换成十进制显示出来,标号exit用于输出letter,digit,others各种类型的个数。
四、实验方法与步骤
(1)实验思路:
设计一个分支循环,依次判断字符的类型并计数,直到将所有字符判断完毕后退出循环。
五实验结果与数据处理
6、讨论与结论
在做这个实验时,用到ASCII码表比较多,定义的letter,digit,others存储单元用于记录个数,leadi,string+2将一行字符输入string中,check标号用于将输入的字符分类,l,d,o标号用于记录分类统计的个数,exit用于输出,display子程序用于将二进制转换成10进制。
在内循环中,找出字符串属于哪类,首先判断键入字符是否为回车,是则转到exit,与0比较,小于则为其他类型,转到others,否则与9比较,30h<=x<=39h,转到digit,39h 后面的子程序用除10取余的方法将二进制转换成十进制数。 本次实验成功实现了题目的要求,可以统计输入字符类别的个数 在实验中遇到的问题主要有: 如何将统计的十六进制计数值用十进制输出,解决方法: 将结果除以10,余数为十进制数的个位,商为十进制数的十位数。 实验4电话簿 一、实验目的及要求 (1)实验目的 学习用汇编语言设计与编写子程序 (2)实验要求 要求程序建立一个可存放50项的电话号码表,每项包括人名(20个字符)及电话号码(8个字符)两部分; 程序可接受输入人名及相应的电话号码,并把它们加入电话号码表中; 凡有新的输入后,程序应按人名对电话号码表重新排序; 程序可接受需要查找电话号码的人名,并从电话号码表中查出其电话号码,再在屏幕上以如下格式显示出来。 nametel. 二、所用仪器、设备 Masmfor windows集成 实验环境 三实验原理 流程图: 实验结果: 输入: 姓名查找: 号码查找: 实验思路: 设计一个分支循环,依次判断字符的类型并计数,直到将所有字符判断完毕后推出循环。 流程图见上面。 五、讨论与结论 实验分析: PRINTMACROX1宏定义显示字符串,INPUTMACROX1宏定义出入字符串,RENEWMACROMING,WEI宏定义将输入缓冲区还原,QUHCMACROTEMP,T宏定义删除回车符号,首先,将数据输入到缓冲区QUHCT_TEMP,T_T,根据记录排序(按首字母顺序),接着根据使用者键入的数字(1,2,3,4)去选择输入,查找,列表,推出。 如果选择2查找,还有两个选项,根据姓名或者电话号码查找到。 如果输入错误,则回到初始界面。 list用于显示电话表,本次实验基本实现了题目的要求,但有些功能没有实现,另外还有些功能与题目的要求不一样,是按照自己的想法做的在实验中遇到的问题主要有: 如何对存入的电话簿排序,解决方法: 参考其他同学的算法以及上网查找资料,实现这一子程序。 在这个程序中,存入的号码数是有自己输入的。 为了将输入的十进制数转换成16进制数,先要判断是否为数字,然后再参考课本P84页的程序。 如何在已有的基础上可以继续添加人数,存入电话号码。 解决方法: 未解决,留待课程设计是完善,但是总体还是成功的。 实验五窗口控制程序 一实验目的及要求: 窗口控制程序首先清除屏幕,紧接着在屏幕中间生成一个小窗口,左上角行列坐标为(10,30),右下角坐标为(15,40),光标定位在(0,0),当按动光标控制键时,光标能上下左右移动,当光标移动到指定位置时,按下END键,此时,光标的左上角位置作为窗口左上角位置,或作为右下角扩大或缩小原来的屏幕窗口。 二实验原理: (0,0)x (lux,luy) (rdx,rdy) (24,79) y 编写程序时,多次用到清屏,生成窗口,光标定位,卷屏等功能,用BIOS10H的卷屏功能ah=6或ah=7,然后调用10HROM例行程序。 三实验结果: 1清屏并在屏幕中心生成一个小窗口: 如上 2按end键,以光标初始位置(0,0)为左上角坐标形成新窗口: 3按光标控制键移动光标至12行79列: 4边界控制和上卷功能: 五程序分析总结: 编写程序过程中,清屏,生成窗口,光标定位分别定义为宏指令clear,scroll,postc,清屏用的是BIOS10H的卷屏功能,ah=6或ah=7,给定左上角参数(0,0),右下角参数为(24,79),属性为07,调用10HROM,完成清屏 键盘输入使用INT16H,的0号功能,如键入一个光标移动键,控制光标在25*80的范围内移动,按下END键,则以当前光标位置作为新设置的坐标生成新的窗口。 按下ESC,退出程序返回DOS。 键入其他可显示字符,可以在窗口范围内显示,字符如果超过窗口的有边界,就从下面一行显示。 在光标定位后生成新窗口之前,用setxy实现坐标代换,把光标的行号和列号代换为窗口左上或右下角坐标,在生成新窗口之前,还要用clear进行一次清屏操作。 我在编写代码的时候借鉴了实验指导书84页的程序,有所改动,在设计思路上没有想到以坐标的形式表现出来,这个程序DOS调用很多,在上课的时候学的不扎实,导致编程的时候想不到要用什么调用,硬翻书。 在程序调试的过程中,在顺序和跳转标号上面出了很大问题,经过研究生的帮助,把错误都改好了,程序圆满完成。 实验六扩充键盘处理功能 一实验目的及要求: 增加left_shift键和right_shift键的功能,及按下这两个键同时,又按下0~9或a~z,则cpu取得并显示的是键的上档符号或是大写字母。 二实验原理 在键盘内部,有一个微处理机INTEL8048,从系统板接收到时钟信号,读取每个键的字符,将其扫描码放在8255外围接口,芯片的PA端口(60h)内,键盘正常工作时,第6位总是1,否则,关闭键盘。 PB端口的第7位置1时,发送应答信号给键盘微处理机。 每当按下键或放开键,在8048将其扫描码送入PA端口的同时,还产生一个类型为09h的中断,任务是: 读扫描码并把应答信号送到键盘,把扫描码转换成ASCII码或转换键状态。 将键入的字符输入到缓冲队列,循环状态为空(bufpt1=bufpt2) bufpt1 0123...................15 bufpt2 键盘输入的字符存入缓冲队列,如果bufpt1=bufpt2,从队列中取出一个字符,数据段定义了转换表scantab,可以显示字符或者其他控制键。 三实验数据 六程序分析总结 整个程序由几个部分组成: 主程序start,保存,设置,回复键盘中断向量,设置中断向量屏蔽为并开中断。 从键盘键入字符并显示。 子程序kbget检测并等待键盘中断,如果有输入,就从缓冲队列中取出字符进行队列管理。 键盘中断处理程序kbint从输入端口PA读入按键的扫描码并返回应答信号,对通码进行转换,放在队尾。 子程序dispchar是显示功能。 为了把接收码转换为ASCII码,数据段中还定义了一个转换表scantab,功能键都做无效处理,键盘上按下任意一个控制键或功能键时,程序将光标kbflag设置为80h,控制结束,返回DOS。 程序编写时比较麻烦,一直在想一种简单的思路,在BIOS和DOS功能调用方面还是不太熟练,经常出错,还有段地址和偏移地址的问题,后面编程中都改了,但是我感觉程序还是有点儿冗长,可以进一步优化。 附表1 表格形式显示字符源代码: csegmentsegment assumecs: csegment START: mainprocfar movah,02h movdl,10h;设置初始输出为ASCII的10h movbl,15;输出显示为15行 hang: movcx,16;设置循环次数,16,表示输出显示为16列 lie: int21h;显示输出 pushdx;推入堆栈 movah,02h movdl,0 int21h movah,02h movdl,0 int21h;显示空白符 popdx;将栈顶元素推出 incdl;设置下一个元素 looplie;循环输出每行的16个ASCII元素 pushdx;将下一行的首元素推入堆栈 movah,02h movdl,0dh int21h movah,02h movdl,0ah int21h;输出换行 popdx;将栈顶元素推出 decbl cmpbl,0;比较确定是否已经输出15行元素 jnehang;若还未完成输出,则跳转至e,继续进行下一行元素的输出 jeexit;否则退出程序 exit: movax,4c00h int21h mainendp csegmentends endstart 附表2 查找匹配字符串源代码: DATASEGMENT mess1DB'Enterkeyword: ','$' mess2DB'EnterSentence: ','$' mess3DB'Matchatlocation: ','$' mess4DB'NOTMATCH.''$' mess5DB'Hifthesentence''$' changeDB13,10,'$' stoknin1labelbyte max1db10 act1db? stokn1db10dup(? ) stoknin2labelbyte max2db50 act2db? stokn2db50dup(? ) DATAENDS STACKSSEGMENT ;此处输入堆栈段代码 STACKSENDS CODESEGMENT ;*************************************代码段 assumecs: code,ds: data,es: data START: mainprocfar pushds subAX,AX subBX,BX subDI,DI subSI,SI pushAX;为返回dos并清空后面要用到的寄存器 MOVAX,DATA MOVDS,AX LEADX,mess1 MOVah,09 INT21h;输出Enterkeyword LEADX,stoknin1 MOVah,0ah;用21号中段的0ah号功能获取关键字 INT21h cmpact1,0 jeexit;如果为空直接退出程序 a10: ;********************************输入Sentence并判断 LEADX,change MOVah,09 INT21h;输出回程,换行 LEADX,mess2 MOVah,09 INT21h;输出EnterSentence: LEADX,stoknin2 MOVah,0ah INT21h;用21号中段的0ah号功能获取句子 MOVAL,act1 CBW MOVCX,AX;保存关键字长度到cx PUSHCX;cx入栈 MOVAL,act2 cmpAL,0 jea50;保存句子长度到al,若句子为空则跳转显示notmatch SUBAL,act1 jsa50;若句子长度小于关键字长度,则跳转显示notmatch INCAL CBW LEABX,stokn2;将句子的首地址放进BX MOVDI,0 MOVSI,0 a20: ;****************************************比较,内循环 MOVAH,[BX+DI] CMPAH,stokn1[SI];遇见字符不相等就跳转到a30 jnea30 INCDI INCSI DECCX;没遇到一个相等的字符,cx-1,cx不为0则比较下一个字符,当cx为0是说明关键字比较完 CMPCX,0 jea40 jmpa20 a30: ;*****************************************外循环,BX+1,清空si,di继续内循环比较 INCBX DECAL cmpAL,0 jea50 MOVDI,0 MOVSI,0 POPCX pushCX jmpa20 a40: ;*****************************************match,将bx减去句子的首地址加一得到关键字所在位置,调用二进制转十六进制子函数将位置输出 SUBBX,offsetstokn2 INCBX LEADX,change MOVah,09 INT21h LEADX,mess3 MOVah,09 INT21h CALLbtoh LEADX,mess5 MOVah,09 INT21h jmpa10 ;****************************************二进制转换十六进制 btohPROCNEAR MOVCH,4 rotate: MOVCL,4 ROLBX,CL MOVAL,BL andAL,0fh addAL,30h cmpal,3ah jlprintit addal,7h btohendp a50: exit: ret mainendp CODEENDS ENDSTART 附表3 分类统计字符个数源代码: datareasegment stringdb80 db? db80dup(? );定义字符串string,长度为80 letterdb0;定义存储单元letter digitdb0;定义存储单元digit otherdb0;定义存储单元other datareaends casesegment assumecs: case,ds: datarea start: mainprocfar movax,datarea movds,ax leadx,string movah,0ah int21h leadi,string+2;输入一行字符,依次将每个字符存入字符串string中 subch,ch movcl,string+1 adddx,2 check: ;将每个字符进行分类 moval,[di] cmpal,0dh jeexit;字符串以回车符结束,若进行分类的字符是回车符,则跳转至exit,退出程序 cmpal,30h;与ASCII码中的0,即30h比较 jbo;小于30h的,为其他类型字符,则跳转至o,在other块进行操作 cmpal,39h;与ASCII码中的9,即39h比较 jnad;不大于39h的,结合不小于30h的,则跳转至d,在digit块进行操作 jaloro;剩下的为字母或者其他类型 loro: cmpal,41h;与ASCII码中的A,即41h比较 jbo;小于41h的,结合大于39h的,则跳转至o,在other块进行操作 cmpal,7ah;与ASCII码中的z,即7ah比较 jao;大于7ah的,则条钻至o,在other块进行操作 cmpal,5ah;与ASCII码中的Z,即5ah比较 jnal;不大于5ah的,结合大于41h的,则跳转至l,在letter块进行操作 cmpal,61h;与ASCII码中的a,即61h比较 jnbl;不小于61h的,结合不大于7ah的,则跳转至l,在letter块进行操作 jbo;小于61h的,结合大于5ah的,则跳转至o,在other块进行操作 l: incletter;属于letter类型,则letter增1 incdi jmpcheck;返回继续比较下一个字符 d: incdigit;属于digit类型,则digit增1 incdi jmpcheck o: incother;属于other类型,则other增1 incdi jmpcheck exit: ;输出letter,digit,other类型的计数结果 movah,02 movdl,0dh int21h movdl,0ah int21h movdl,4ch int21h movdl,3ah int21h movdl,0 int21h xorax,ax moval,letter calldisplay;调用子程序display,输出 movah,02 movdl,0dh int21h movdl,0ah int21h movdl,44h int21h movdl,3ah int21h movdl,0 int21h xorax,ax moval,digit calldisplay movah,02 movdl,0dh int21h movdl,0ah int21h movdl,4fh int21h movdl,3ah int21h movdl,0 int21h xorax,ax moval,other calldisplay movax,4c00h int21h mainendp displayprocnear
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新版马聪敏 汇编实验报告 最新版 聪敏 汇编 实验 报告