桂电汇编实验报告_第1页
桂电汇编实验报告_第2页
桂电汇编实验报告_第3页
桂电汇编实验报告_第4页
桂电汇编实验报告_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

实验报告实验名称汇编语言程序设计||实验一汇编语言上机过程和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||码为10H----100H的所有字符,即以行为主的顺序及ASC||码递增的次序依次显示对应的字符。每16个字符为一行,每行中的相邻两个字符之间用空白符(ASC||为0)隔开。四、方法说明(1)显示每个字符可使用功能号为02的显示输出功能调用,使用方法如下:movah,02hmovdl,输出字符的ASC||码int21h本题中可把dl初始化为10H,然后不断使其加1(用INC指令)以取得下一个字符的ASC||码。(2)显示空白符时,用其ASC||码0置入dl寄存器,每行结束时,用显示回车(ASC||为0dh)和换行符(ASC||为oah)来结束本行并开始下一行。(3)由于逐个显示相继的ASC||字符时,需要保存并不断修改dl寄存器的内容,而显示空白、回车、换行符时也需要使用dl寄存器,为此可使用堆栈来保存相继的ASC||字符。具体用法是:在显示空白或回车,换行符前用指令pushdx把dl的内容保存到堆栈中去。在显示空白或回车,换行符后用指令popdx恢复dl寄存器的原始内容。五、实验代码codesegmentassumecs:codestart:movbx,15;外循环次数movcx,16;内循环movdx,10h;10h是待显示的第一个字符Lop:movah,02h;输出单个字符int21h;中断incdx;下一个pushdxmovdx,20h;空格movah,2int21hpopdxLoopLopLop1:pushdx;循环16次后,把最后的数送入堆栈段movdx,0dh;输出回车键int21hmovdx,0ah;输出换行符int21hmovcx,16;重新定义内循环次数popdxdecbx;bx-1cmpbx,0;decbxjneLop;没有完成外循环时进入lopmovah,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实验四分支程序设计在实际应用的程序中,通常遇到根据某一条件是否成立来进行逻辑判断,以便确定程序的下一步执行,这就形成了分支结构程序,在汇编语言程序设计中,分支结构程序设计是一种很重要的程序设计方法.一、实验目的学会用分支程序设计进行程序编程。二、实验题目设计一个程序能分类统计字符个数三、实验要求程序接收用户键入的一行字符(字符个数不超过80个,该字符串用回车符结束),并按字母、数字及其它字符分类计数,然后将结果存入以letter、digit和other为名的存储单元中。四、方法说明程序可采用0AH功能调用把键入字符直接送到缓冲区中,然后再逐个取出分类计数,也可采用01H功能调用在接收字符后先分类计数然后再存入缓冲区中。程序需进入debug运行并查看计数结果。五、实验代码datasegmentletterdb0digitdb0otherdb0dataendscodesegmentmainprocfarassumecs:code,ds:datastart:movletter,0movdigit,0movother,0input:movah,01hint21hcmpal,0dhjzexitcmpal,'a'jbokcmpal,'z'jaothdkh:incletterjmpinputok:cmpal,'A'jbhellocmpal,'Z'jbdkhjaothhello:cmpal,'0'jbothcmpal,'9'jaothincdigitjmpinputoth:incotherjmpinputexit:movah,4chint21hmainendpcodeendsendstart

实验五子程序设计子程序(过程)是程序设计中常用的方法.子程序结构是模块化程序设计的重要工具。设计子程序主要考虑参数传递的方法,参数传递是主程序和子程序之间的接口。一、实验目的学会用子程序设计进行程序编程。二、实验题目设计一个能查找电话号码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,ax inname: 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 inname stor: 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 21h choice1: 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 choice1 print_all: call printall ;显示所有记录 want_search: call crlf lea dx,text4 ;提示是否查找号码 mov ah,09 int 21h call crlf choice2: 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 choice2 search: 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 ;记录后移 sub di,56 cmp di,dx ja next2 mov cx,28 mov di,dx lea si,temp rep movsb ;插入到待插位置exitn: ret name_sort endp;******************************************************************************;姓名查找子程序。入口参数为tname缓冲区的人名,用寄存器bx返回结果,找到则返回该;

温馨提示

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

评论

0/150

提交评论