您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 交通运输 > 西安交通大学汇编语言实验报告
80X86汇编语言程序设计课内实验报告班级:电信硕41班姓名:周翔宇学号:2140508028班级电信硕41实验时间2016-4-1206-4-23姓名周翔宇学号2140508028一、实验内容概述实验一熟悉汇编语言实验环境(masm、link、debug/td)实验二循环程序设计及分支程序设计实验三子程序及DOS/BIOS调用程序设计实验四高级汇编语言技术实验五输入输出程序设计实验六BIOS和DOS中二、实验步骤实验一、masm,link,debug的过程Debug调试命令:a,d,t,g,r,u,q等。A(Assemble):汇编语句A[address]C(Compare):比较内存CrangeaddressD(Display):显示内存D[address]或D[range]E(Enter):改变内存Eaddress[list]F(Fill):填充内存FrangelistG(Go):执行程序G[=address[address[address...]]H:十六进制运算命令H[address[drive|sector|sector]]I(Input):输入IportaddressL(Load):装入内存L[address[drive|sector|sector]]M(Move):传送内存MrangeaddressN(Name):定义文件和参数N[d:][path]filename[.ext]O(Output):输出字节OportaddressbyteP(Proceed):在下条指令前停止P[=address][value]Q(Quit):结束DEBUG程序QR(Register):显示寄存器/标志位R[registername]S(Search):捡索字符SrangelistT(Trace):执行并显示(跟踪)T[=address][value]U(Unassemble):反汇编指令U[address]或U[range]W(Write):把文件或数据写盘W[address[drive|sector|sector]]STEP1首先进入cmd命令运行界面STEP2进入masm5文件夹cdd:\masm5STEP3Masm输入程序代码文件xxx然后回车STEP4Link输入程序代码文件xxx然后回车STEP5Debugxxx.exe进入了Debug界面实验二、循环程序设计及分支程序设计(1)循环程序设计数据段中已定义了一个有n个字数据的数组M,试编写一程序求出M中绝对值最大的数,把它放在数据段的M+2n单元中,并将该数的偏移地址存放在M+2(n+1)单元中。程序思路:STEP1取第一个数,记录此数;STEP2此数是正数吗?是转到STEP3,否转到STEP4;STEP3是正数,即为绝对值,转去判断下一个数;STEP4不是正数,变为其绝对值;STEP5判断绝对值大小;STEP6(AX)(BX),使(AX)中为绝对值最大的数;STEP7记下绝对值最大的数的地址,记下此数;STEP8数判断完了吗?是结束,否继续;STEP9转到STEP1;程序源代码:见附件1(2)分支程序设计设计一程序,接收从键盘输入的数字(1~5),并对每个数字的输入次数进行计数,计数结果存放在以COUNT为首地址的数组中。(最好能将计数结果打印出来)。程序思路:STEP1设置一个五路分支,输入数为X则跳转到X步;STEPXCOUNT[X]+1程序源代码:见附件2实验三、子程序及DOS/BIOS调用程序设计设有10个学生的成绩分别是76,69,84,90,73,88,99,63,100和80分。试编制一个子程序统计60~69分,70~79分,80~89分,90~99分和100分的人数并分别存放到S6,S7,S8,S9和S10单元中。程序思路:将成绩除以10然后减6作为偏移地址,然后将此地址加1则表示人数加1程序代码:见附件3实验四、高级汇编语言技术试编写一段程序,完成以下功能:若给定名为X的字符串长度大于5时,下列指令将汇编10次。ADDAX,AX(要求:使用条件汇编,编译过程中生成LST文件,查看宏展开情况)程序思路:用($-X)代表字符串长度,然后使用条件汇编指令IF程序代码:见附件4实验五、输入输出程序设计编写程序,使类型1CH的中断向量指向中断处理程序COUNT,COUNT统计1CH中断次数并存入单元M中。程序思路:STEP1取中断类型号STEP2取中断向量STEP3偏移地址送IP,段地址送CS(上述步骤为保存原中断向量)STEP4设置新的中断向量STEP5转入中断处理程序,并且中断一次M累加1STEP6中断返回程序代码:见附件5实验六、.BIOS和DOS中断编写一个程序,接收从键盘输入的10个十进制数字,输入回车符则停止输入,然后将这些数字加密后(用XLAT指令变换)存入内存缓冲区BUFFER。加密表为:输入数字:0,1,2,3,4,5,6,7,8,9密码数字:7,5,9,1,3,6,8,0,2,4程序思路:将密码存入数据段,利用XLAT指令,设置AL表示数字值,将对应表中数据送入程序代码:见附件六三、实验中遇到的问题及其解决方法1、问题1问题描述:绝对值如何得到问题是在实验一中遇到,解决思路是:利用反码的思想解决问题的步骤是:是负数则对负数取反码2、问题2问题描述:进入Debug界面后,更改输入,然后输入与要求不符问题是在实验X中遇到,解决的思路是:理清调试步骤解决问题的步骤是:Debug界面进入后修改了输入然后必须退出Debug界面然后修改后再次重新进入Debug界面3、问题3问题描述:如何调用中断,键盘输入,并且屏幕显示问题是在实验二遇到的,解决的思路是:调用DOS功能解决问题的步骤骤是:调用DOS功能(INT21H)并选取AL=2从键盘输入;选取AL=30在屏幕上显示,然后选取AL=4CH返回4、问题4问题描述:如何设置中断向量问题是在实验五遇到的,解决思路是,保存原有中断向量,设置新的中断向量,恢复原有的中断向量解决问题的步骤是:首先保存原有的中断向量,然后设置新的中断向量,进入中断程序,最后恢复原有中断向量四、实验结果实验二(1)输出结果:实验二(2)输入:输出实验三、输出结果:数据段:实验四、反汇编:显示内存:查看LST文件:文件内容截图:实验五、内存结果:实验六、输入:输出:五、附件附件1:datasegmentMdw1,4,3,2,-1,-5,-8,-9,'$'m1dw10dup(?)disadb'thelocationofM+2nis:$'disbdb'thelocationofM+2(n+1)is:$'discdb0dh,0ah,24hdataendsstacksegmentstackdw100dup(?)toplabelwordstackendscodesegmentmainprocfarassumess:stack,cs:code,ds:datastart:movax,stackmovss,axleasp,topmovax,datamovds,axxorsi,si;用来放绝对值最大数的输出leabx,Mmovsi,bx;记录第一个数的地址movcx,0;记录第一个数值假设是0L1:movax,[bx]cmpax,24hjeL4rolax,1andax,1hcmpax,1;是负数的话就求原码jeL2movax,[bx];正数的话就直接比较movdi,0cmpcx,axjbeL3addbx,2jmpL1L2:movdi,1movax,[bx];对负数进行求原码运算subax,1notaxcmpcx,axjbeL3;记录绝对值比较大的数还有符号addbx,2jmpL1L3:movcx,ax;改变cx的值movsi,bx;改变si的地址值movdx,diaddbx,2jmpL1L4:leabx,m1mov[bx-2],cx;M+2n存放绝对值最大的数mov[bx],si;M+2(n+1)存放他的地址mov[bx+2],dx;存放他的符号L5:leadx,disc;输出换行movah,9int21hleadx,disa;输出提示语movah,9int21hleabx,m1movdx,[bx+2]cmpdx,0jeL51movdl,'-'movah,2int21hL51:xorsi,sileabx,m1;把结果地址传给bxmovsi,[bx-2];把结果传给simovcx,4L6:pushcxmovcl,4rolsi,clmovdx,sianddl,0fhcmpdl,9jbeL7adddl,7hL7:adddl,30hmovah,2hint21hpopcxloopL6L8:leadx,disc;输出换行movah,9int21hleadx,disb;输出提示语movah,9int21hxorsi,sileabx,m1movsi,[bx]movcx,4L9:pushcxmovcl,4rolsi,clmovdx,sianddl,0fhcmpdl,9jbeL10adddl,7hL10:adddl,30hmovah,2hint21hpopcxloopL9movah,4chint21hmainendpcodeendsendstart附件2:DATASSEGMENTCOUNTdb5dup(0)DATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:pushdssubax,axpushaxMOVAX,DATASMOVDS,AXnext:movah,01hint21hcmpal,'1'jzC1;jz当zf=1跳转cmpal,'2'jzC2cmpal,'3'jzC3cmpal,'4'jzC4cmpal,'5'jzC5jmpexitC1:movcl,COUNTaddcl,1movCOUNT[0],cljmpnextC2:movbx,1movcl,COUNT[bx]addcl,1movCOUNT[bx],cljmpnextC3:movbx,2movcl,COUNT[bx]addcl,1movCOUNT[bx],cljmpnextC4:movbx,3movcl,COUNT[bx]addcl,1movCOUNT[bx],cljmpnextC5:movbx,4movcl,COUNT[bx]addcl,1movCOUNT[bx],cljmpnextexit:movdl,COUNT[0]adddl,30hmovah,02int21hmovdl,COUNT[1]adddl,30hmovah,02int21hmovdl,COUNT[2]adddl,30hmovah,02int21hmovdl,COUNT[3]adddl,30hmovah,02int21hmovdl,COUNT[4]adddl,30hmovah,02int21hmovah,4chint21hCODESENDSENDSTART附件3:DSEGSEGMENTSDW76,69,84,90,73,88,99,63,100,80S6DW0S7DW0S8DW0S9DW0S10DW0DSEGENDSCSEGSEGMENTMAINPROCFARASSUMECS:CSEG,DS:DSEGstart:PUSHDS;设置返回DOSSUBAX,AXPUSHAXMOVAX,DSEGMOVDS,AXBEGIN:MOVCX,10CALLCOUNTRETMAINENDPCOUNTPROCNEAR;成绩统计子程序MOVSI,0NEXT:MOVAX,S[SI]MOVBX,10;DIVBL;计算公式为:((成绩)/10-6)*2送(BX)MOVBL,AL;SUBBX,6;应为只统计60分以上成绩SALBX,1;(BX)*2INCS6[BX];S6是S6,S7,S8,S9和S10单元的首地址ADDSI,2LOOPNEXTRETCOUNTENDP;COUNT子程序结束CSEGENDS;以上定义代码段ENDstart附件4:DSEGSEGMENTDSEGENDSCSEGSEGMENTASSUM
本文标题:西安交通大学汇编语言实验报告
链接地址:https://www.777doc.com/doc-5650313 .html