汇编语言程序设计实验报告_第1页
汇编语言程序设计实验报告_第2页
汇编语言程序设计实验报告_第3页
汇编语言程序设计实验报告_第4页
汇编语言程序设计实验报告_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

./实验报告实验名称汇编语言程序设计||专业班级:信息安全学号:姓名:实验一汇编语言上机过程和Debug常用调试命令实验目的:学习程序设计的基本方法和技能,熟练掌握用汇编语言设计、编写、调试和运行程序的方法。实验题目:熟悉与实验有关的系统软件<如编辑程序、汇编程序、连接程序和调试程序等>的使用方法。在调试过程中,学习及掌握debug程序的各种操作命令。问题描述:试编写一程序:比较两个字符串string1和string2所含的字符是否相同,若相同则显示‘match’;否则,显示‘nomatch’。方法说明:使用ws、tc或EDIT编辑程序来建立源文件,然后存盘,使系统返回DOS。用汇编程序masm<或asm>对源文件汇编产生目标文件obj如:汇编指示出错则需重新调用编辑程序修改错误,直至汇编通过为止。用连接程序link产生执行文件EXE.执行程序,可直接从DOS执行程序。使用debug程序调试程序的方法。实验步骤:调用字处理程序EDIT建立以sample.asm文件datareasegmentstring1db‘movethecursorbackward.’string2db‘movethecursorbackward.’mess1db‘Match..’,13,10,’$’mess2db‘Nomatch!..’,13,10,’$’datareaendsprognamsegmentmainprocfarassumecs:prognam,ds:datarea,es:datareastart:pushdssubax,axpushaxmovax,datareamovds,axmoves,axleasi,string1leadi,string2cldmovcx,25repzcmpsbjzmatchleadx,mess2jmpshortdispmatch:leadx,mess1disp:movah,09int21hretmainendpprognamendsendstart对源文件汇编产生目标文件objD:\masm文件名。Asm3.用连接程序link产生执行文件exeD:\link文件名。Obj4.执行程序D:\文件名5.使用debug程序调试程序的方法。d>debug文件名.exe_用G命令运行程序用U命令显示程序学会设置断点。学会查看数据段的内容情况D用E命令修改数据区的字符串。用A命令把数据区的内容恢复原状T命令逐条跟踪程序的执行学会使用F命令、R命令、Q命令等等实验总结第一次进行汇编实验,主要是学习程序设计的基本方法和技能,熟练掌握用汇编语言设计、编写、调试和运行程序的方法,只有多上机练习,才能更好的掌握汇编语言程序设计的思想。实验二循环程序设计1循环结构是控制重复执行某一程序段的基本程序结构.在汇编语言程序设计中,循环程序的地位也是极为重要,从本质上来看,循环程序结构是分支程序结构的一种手特殊形式,也是使用条件转移指令来控制执行循环的.一.实验目的:学会用循环结构进行程序编程。二.实验题目:设计一个按表格形式显示ASC||码为10H—100H的所有字符的程序。三.实验要求:按15行*16列的表格形式显示ASC||码为10H100H的所有字符,即以行为主的顺序及ASC||码递增的次序依次显示对应的字符。每16个字符为一行,每行中的相邻两个字符之间用空白符<ASC||为0>隔开。四.方法说明:<1>显示每个字符可使用功能号为02的显示输出功能调用,使用方法如下:movah,02hmovdl,0AHint21h本题中可把dl初始化为10H,然后不断使其加1<用INC指令>以取得下一个字符的ASC||码。<2>显示空白符时,用其ASC||码0置入dl寄存器,每行结束时,用显示回车<ASC||为0dh>和换行符<ASC||为oah>来结束本行并开始下一行。<3>由于逐个显示相继的ASC||字符时,需要保存并不断修改dl寄存器的内容,而显示空白、回车、换行符时也需要使用dl寄存器,为此可使用堆栈来保存相继的ASC||字符。具体用法是:在显示空白或回车,换行符前用指令pushdx把dl的内容保存到堆栈中去。在显示空白或回车,换行符后用指令popdx恢复dl寄存器的原始内容。五、实验代码stacksegmentdb100dup<?>stackendscodesegmentassumecs:code,ss:stackstart:movdl,10hmovcl,0fhloopc:movah,02hmoval,dlint21hincdlpushdxmovdl,0hmovah,02hmoval,dlint21hpopdxloopnzloopcpushdxmovdl,0dhmovah,02hmoval,dlint21hmovdl,0ahmovah,02hmoval,dlint21hpopdxmovcl,0fhcmpdl,0hjneloopcmovah,4chint21hcodeendsendstart实验结果实验总结本次试验学会用循环结构进行程序编程,学好循环程序是很重要的,在程序设计中,它的地位是极其重要的。实验三循环程序设计2一.实验目的:学会用循环程序设计进行程序编程。二.实验题目:设计查找匹配字符串SEARCH的程序。三.问题要求:程序接收用户键入的一个关键字以及一个句子。如果句子中不包含关键字则显示’nomatch’;如果句子中包含关键字则显示‘match’,且把该字在句子中的位置用十六进制数显示出来,要求程序的执行过程如下:enterkeyword:abcentersentence:wearestudyingabcmatchatlocation:11Hofthesentenceentersentence:xyz,ok?nomatchentersentence:^c四.方法说明:程序可由三部分组成:<1>输入关键字和一个句子,分别存入相应的缓冲区中,可用功能调用0AH。在句子中查找关键字。关键字和一个句子中相应字段的比较可使用串比较指令,为此必须定义附加段,但附加段和数据段可以定义为同一段,以便于串指令的使用,这样,相应的寄存器内容也有了确定的含义,如下:SI寄存器为关键字的指针DI寄存器为句子中正相比较的字段的指针CX寄存器存放关键字的字母个数<长度>整个句子和关键字的比较过程可以用一个循环结构来完成。循环次数为:<句子长度--关键字长度>+1在计算循环次数时,如遇到句子长度小于关键字长度的情况则应转向显示"nomatch",循环中还需要用到BX寄存器,它用来保存句子中当前正在比较字段的首地址。输出信息:用功能调用09h分"找到"或"找不到"两种情况分别显示不同的信息。在"找到"时,还要求显示出匹配字符串在句子中的位置,在"找到"时BX寄存器的内容为匹配字符串的首地址,将此值减到句子的首地址,再将差值加1即是所要的匹配字符串在句子中的位置,可将位置转换为十六进制数从屏幕上显示出来。实验代码ssegsegmentstackdw256dup<?>ssegendsdatasegmentmsg1db'Enterkeyword:',24hmsg2db'EnterSentence:',24hcrdb13,10,24hkeyworddb250,?,250dup<?>Sentencedb250,?,250dup<?>matchdb'Matchatlocation:',24hmatch1db'ofthesentence',13,10,24hnomatchdb'Nomatch',13,10,24hdataendscodesegmentassumecs:code,ds:data,ss:ssegdisp_hexprocnearpushaxpushcxpushdxpushaxmovcl,4roral,clandal,0fhaddal,30hcmpal,39hjnad1addal,7d1:movdl,almovah,2int21hpopaxandal,0fhaddal,30hcmpal,39hjnad2addal,7d2:movdl,almovah,2int21hmovdl,'h'movah,2int21hpopdxpopcxpopaxretdisp_hexendpbegin:movax,datamovds,axmoves,axmovdx,offsetmsg1movah,9int21hmovdx,offsetkeywordmovah,0ahint21hcmpkeyword+1,0jequitmovdx,offsetcrmovah,9int21hb1:movdx,offsetmsg2movah,9int21hmovdx,offsetSentencemovah,0ahint21hmovdx,offsetcrmovah,9int21hmovdl,Sentence+1cmpdl,0jequitmovdh,keyword+1movdi,offsetSentence+2b2:cmpdh,dlja_nomatchmovsi,offsetkeyword+2movcl,dhmovch,0cldpushdirepecmpsbpopdije_matchincdidecdljmpb2_match:movax,disubax,offsetSentence+2incaxpushaxmovdx,offsetmatchmovah,9int21hpopaxcalldisp_hexmovdx,offsetmatch1movah,9int21hjmpb1_nomatch:movdx,offsetnomatchmovah,9int21hjmpb1quit:movah,4chint21hcodeendsendbegin六、实验结果实验总结本次试验主要考察了串比较指令的用法,同时将串指令和REPE联合起来用,使得指令变得简单。实验中还用到了一些数据结构,开始时需要定义空间以及缓冲区。另外程序需要运用有两层循环,内循环由CX记录关键字长度控制循环计数,外循环是由ax记录外循环次数控制外循环计数。通过本次实验,使我更加熟悉了课堂上知识,还培养了我将理论知识运用到实际编程中去的能力。实验四分支程序设计一.实验目的:学会用分支程序设计进行程序编程。二.实验题目:设计一个程序能分类统计字符个数三.实验要求:程序接收用户键入的一行字符<字符个数不超过80个,该字符串用回车符结束>,并按字母、数字及其它字符分类计数,然后将结果存入以letter、digit和other为名的存储单元中。四.方法说明:程序可采用0AH功能调用把键入字符直接送到缓冲区中,然后再逐个取出分类计数,也可采用01H功能调用在接收字符后先分类计数然后再存入缓冲区中。程序需进入debug运行并查看计数结果。实验代码DATASSEGMENTSTRING1DB'InputYourString:$';输入提示信息STRING2DB'Digit:$';各类字符提示信息STRING3DB'Letter:$'STRING5DB'Others:$'DIGITDB0;数字CHARSDB0;字母OTHERSDB0;其他DATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXLEADX,STRING1;显示输入提示信息MOVAH,9INT21HMOVCX,100;设置循环次数足够大L1:MOVAH,1;中断调用,单字符输入INT21HCMPAL,0DH;若输入回车符则结束JZOVER2CMPAL,30HJBOTHER;若<30H<0>,OTHERS++CMPAL,39H;若>39H<9>,跳转进一步比较JAHIGHER1JMPDIGITAL;DIGIT++HIGHER1:CMPAL,41H;if<41H<A>,OTHERS++JBOTHERCMPAL,5AH;if>5AH<Z>,跳转继续比较JAHIGHER2JMPCHAR;ALPHAU++HIGHER2:CMPAL,61H;if<61H<a>,OTHERS++JBOTHERCMPAL,7AH;if>7AH<z>,OTHERS++JAOTHERJMPCHAR;ALPHAL++JMPOVER;比较结束OTHER:INCOTHERS;OTHERS++JMPOVERDIGITAL:INCDIGIT;DIGIT++JMPOVERCHAR:INCCHARS;ALPHAL++JMPOVERJMPOVEROVER:NOPLOOPL1;循环,输入下一字符OVER2:CALLENDLINE;回车换行LEADX,STRING2;输出提示信息MOVAH,9INT21HXORAX,AXMOVAL,DIGIT;将统计的数字送AX,为输出做准备CALLDISPLAY;调用输出两位数字的子程序CALLENDLINE;下同LEADX,STRING3MOVAH,9INT21HXORAX,AXMOVAL,CHARSCALLDISPLAYCALLENDLINELEADX,STRING5MOVAH,9INT21HXORAX,AXMOVAL,OTHERSCALLDISPLAYMOVAH,4CHINT21HENDLINEPROCNEAR;控制输出格式,输出回车换行子程序MOVAH,2MOVDL,0AHINT21HMOVAH,2MOVDL,0DHINT21HRETENDLINEENDPDISPLAYPROCNEAR;输出两位数字的子程序MOVBL,10;10送BLDIVBL;AX/BL,AL=商,AH=余数PUSHAX;保存AX中的信息MOVDL,ALADDDL,30HMOVAH,2INT21H;输出十位数POPAX;出栈送AXMOVDL,AHADDDL,30HMOVAH,2INT21H;输出个位数RETDISPLAYENDPCODESENDSENDSTART实验总结本次实验要求我们学会用分支程序设计进行程序编程,其中运用到许多跳转和比较指令,只要细心一点,理清思路就能很容易的将本程序编写出来。实验五子程序设计实验目的:学会用子程序设计进行程序编程。实验题目:设计一个能查找电话号码phone的程序。实验要求:要求程序建立一个可存放50项的电话号码表,每项包括人名<20个字符>及电话号码<8个字符>两部分;程序可接收输入人名及相应的电话号码,并把它们加入电话号码表中;凡有新的输入后,程序应按人名对电话号码表重新排序;程序可接收需要查找电话号码的人名,并从电话号码表中查出其电话号码,再在屏幕上以如下格式显示出来。nametel********实验提示:程序采用子程序结构,主程序的主要部分如下:.显示提示符‘inputname:’;.调用子程序input_name接收人名;.调用子程序stor_name把人名存入电话号码表tel_tab中;.显示提示符‘inputatelephonenumber:’;.调用子程序inphone接收电话号码,并把它存入电话号码表tel_tab中;.如输入已结束则调用name_sort子程序对电话号码表按人名排序;.显示提示符‘DOyouwantatelephonenumber?<y/n>’;.回答N则退出程序;.回答Y则再显示提示符‘name?’;.调用子程序input_name接收人名;.调用子程序name_search在电话号码表中查找所要的电话号码;.调用子程序printline按要求格式显示人名及电话号码;.重复查号提示符直至用户不再要求查号为止。实验代码data segmenttel_tab db 50dup<28dup<''>> ;tel_tab电话本空间tab_len dw 0 ;已存联系人数目endaddr dw 0 ;最后一个联系人的地址+28tname db 21,?,20dup<''>,? ;姓名缓冲区tphone db 9,?,8dup<''>,? ;号码缓冲区temp db 28dup<?> ;一个联系人的临时空间iname db 13,10,'Inputname:',13,10,'$' iphone db 13,10,'Inputatelephonenumber:',13,10,'$' go_on db 13,10,'Continueinsert?<Y/N>',13,10,'$';提示是否继续插入联系人sname db 13,10,'Name?',13,10,'$' name_e db 13,10,13,10,'Thenamehasbeeninthetable!Pleaseinputagain!',13,10,'$'text2 db 13,10,'NameTel.',13,10,'$'text3 db 13,10,'Thenameisnotinthetelephonetable!',13,10,'$'text4 db 13,10,13,10,'Doyouwantatelephonenumber?<Y/N>',13,10,'$'data endscode segment;****************************************************************************;主程序;main proc far assume cs:code,ds:data,es:datastart: push ds ;保存旧数据用于返回 sub ax,ax push ax mov ax,data ;数据段、附加段初始化 mov ds,ax mov es,axinname: lea dx,iname ;提示输入姓名 mov ah,09h int 21h call input_name ;调用读入姓名子程序 call name_search ;调用查找子程序, cmp bx,-1 ;如表中不存在该联系人 je stor ;则跳转到stor call crlf ;回车换行 lea dx,name_e ;否则提示该联系人已在表中,提示重新输入 mov ah,09h int 21h jmp innamestor: call stor_name ;调用姓名转存子程序,把姓名移动到表中 lea dx,iphone ;提示输入电话号码 mov ah,09h int 21h call inphone ;调用读入号码子程序 call name_sort ;排序 call crlf lea dx,go_on ;提示是否继续插入 mov ah,09h int 21hchoice1: mov ah,07 ;读取用户选择 int 21h cmp al,'y' je inname cmp al,'Y' je inname cmp al,'n' je print_all ;如选择不插入,则显示所有记录 cmp al,'N' je print_all jmp choice1print_all: call printall ;显示所有记录want_search:call crlf lea dx,text4 ;提示是否查找号码 mov ah,09 int 21h call crlfchoice2: mov ah,07 ;读取用户选择 int 21h cmp al,'y' je search ;如果为y或Y则跳转到查找search cmp al,'Y' je search cmp al,'n' ;为n或N则退出程序 je exit_m cmp al,'N' je exit_m jmp choice2search: lea dx,sname ;提示用户输入要查找的姓名 mov ah,09 int 21h call input_name ;读入姓名 call name_search ;查找 call crlf call crlf cmp bx,-1 ;是否查找到? je not_find ;<bx>=1则跳转到未找到not_find lea dx,text2 ;找到则输出'NameTel.' mov ah,09 int 21h call printline ;显示查找到的联系人 jmp want_search ;跳转到提示查找not_find: ;未找到 call crlf lea dx,text3 ;输出'Thenameisnotinthetelephonetable!' mov ah,09h int 21h jmp want_search exit_m: retprintall proc near;**************************************************************************;显示所有电话。显示电话表中的所有姓名和号码,查看排序结果是否正确; call crlf call crlf lea dx,text2 ;输出'NameTel.' mov ah,09 int 21h lea bx,tel_tab ;号码表基址rept1: call printline ;显示联系人 add bx,28 ;求下一个联系人首地址 cmp bx,endaddr ;是否到达表尾? jb rept1 ;未到达则继续显示 retprintall endp ;*******************************************************************;输入姓名子程序:读入姓名到tname缓冲区,并把不满20位的部分;补上空格〔方便查找时的比较; input_name proc near call crlfnoinputn: lea dx,tname ;姓名缓冲区 mov ah,0ah ;调用dos0ah读入字符串功能 int 21h cmp tname[1],0 ;如果输入为回车 je noinputn ;继续等待输入 xor bx,bx mov bl,tname[1] mov cx,20 sub cx,bx set_blank: mov tname[bx+2],20h ;把不满20位的部分补空格 inc bx loop set_blank call crlf retinput_name endp;*****************************************************************;stor_name,该子程序把tname缓冲区的姓名转存入号码表中;stor_name proc near xor cx,cx mov cl,tname[1] ;字符个数 lea si,tname[2] mov di,endaddr cld rep movsb inc tab_len ;联系人人数增1 add endaddr,28 ;最后一个联系人地址增28 retstor_name endp;***************************************************************;获取号码子程序:读入用户输入的号码到tphone缓冲区,然后;转存入号码表对应位置;inphone proc nearnoinputp: call crlf lea dx,tphone mov ah,0ah int 21h ;调用dos0a号功能输入字符串 cmp tphone[1],0 ;判断输入是否为回车 je noinputp ;是,则继续等待输入 xor cx,cx mov cl,tphone[1] lea si,tphone[2] mov di,endaddr sub di,8 ;待插入位置 cld rep movsb ;移动 ret inphone endp;**********************************************************************;排序子程序〔用直接插入排序,对号码表进行按人名从小到大排序;name_sort proc near cmp [tab_len],1 ;记录数1,不用排序 je exitn lea di,tel_tab ;第一个记录地址 mov si,endaddr sub si,28 ;最后一个记录-待排序记录的地址next1: mov cx,20 mov ax,si ;暂存两个地址 mov dx,di cld repe cmpsb ;查找插入位置 jb insert mov si,ax mov di,dx add di,28 ;比较下一个 cmp di,si ;是否比较完 jb next1 ;没有则继续比较 jmp exitn ;否则排序完成insert: mov cx,28 mov si,ax lea di,temp rep movsb ;待排序数据放到缓冲区 mov di,axnext2: mov cx,28 mov si,di sub si,28 rep movsb ;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论