您好,欢迎访问三七文档
汇编语言程序设计实验三汇编语言程序调试运行学号:姓名:(1)将下面的数据段输入,取名为1.asm,保存在MASM文件夹下,生成.lst文件,不必连接运行,查看1.lst文件,试回答:DA1,DA2的偏移量分别为多少?COUNT的值为多少?datasegmentorg20hnum1=8num2=num1+10hda1db'IBMPC'da2db0ah,0dhcountequ$-da1dataendsendDA1偏移量为20,DA2偏移量为26,count值为8(2)输入下列指令,改正可能的错误(先不要运行程序):datasegmentvar1db0,25,0DH,30var2db12h,0a4h,6bhvar3db'ABCDEF'var4dw1234h,5678hvar5dw10hdup(?)dataendscodesegmentassumecs:code,ds:databeginmovax,datamovds,axleasi,var5movbx,offsetvar2mov[si],0abhmovax,var1+2mov[bx],[si]movvar5+4,var4movah,4chint21hcodeendsendstart正确代码:datasegmentvar1db0,25,0DH,255var2db12h,04h,6bhvar3db'ABCDEF'var4dw1234h,5678hvar5dw10hdup(?)dataendscodesegmentassumecs:code,ds:datastart:movax,datamovds,axleasi,var5movbx,offsetvar2movax,0abhmov[si],axmoval,var1+2movax,[si]mov[bx],axmovax,var4movvar5+4,axmovah,4chint21hcodeendsendstart(3)写一个完整的程序放在代码段C_SEG中,要求把数据段D_SEG中的AGUEND和附加段E_SEG中的ADDEND相加,并把结果存放在D_SEG中的SUM中。其中AUGEND,ADDEND,SUM均为dw类型,AUGEND赋值为9251,ADDEND赋值为-5962。实验报告中要求写出源程序,简单叙述上机步骤,调试方法。a.实验步骤:1.将AGUEND、AGUEND+2分别存入AX,DX中。2.与ADDEND、ADDEND+2相加后,将相加后的结果存入SUM、SUM+2中。3.以十六进制的形式显示结果。b.源程序:datassegmentaugenddd9251sumdd?datasendse_segsegmentaddenddd-5962e_segendscodessegmentassumecs:codes,ds:datas,es:e_segstart:movax,datasmovds,axmovax,e_segmoves,axmovax,wordptr[augend]addax,wordptres:[addend]movdx,wordptr[augend+2]adcdx,wordptres:[addend+2]movwordptr[sum],axmovwordptr[sum+2],dxmovbx,wordptr[sum+2]movch,4movdh,1AA:movcl,4rolbx,clmoval,blandal,0fhaddal,30hcmpal,3ahjlprintaddal,07hprint:movdl,almovah,2int21hdecchjnzaamovbx,wordptr[sum]movch,4decdhjzaamovah,4chint21hcodesendsendstartc.显示结果:(4)数组中是一组无符号数,将最小数放在M单元中,经过汇编后,形成.EXE文件,先用G=0命令执行程序,用-D命令查看M单元的内容,会发现结果不正确。用单步执行命令T查找程序中的逻辑错误。DSEGSEGMENTMSGDB13,15,7,25,24MDB?DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVCX,4MOVAL,MSGMOVSI,OFFSETMSG+1L1:CMPAL,[SI]JBNEXTMOVAL,[SI]NEXT:LOOPL1MOVM,ALMOVAX,4C00HINT21HCSEGENDSENDSTART1.程序说明:此程序的目的是要在13,15,7,25,24中找到最小数,并放在M单元。2.调试说明:运行无问题3.错误问题:结果中M单元的内容是错的,此时M为13,但真实值应为6.4.解决方法:该程序的循环是一个死循环,无法将每个数都进行比较,因此,需要每次循环时地址+1才能将每个数进行比较,所以需要在循环上加“INCSI”5.修改后程序DSEGSEGMENTMSGDB13,15,7,25,24MDB?DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVCX,4MOVAL,MSGMOVSI,OFFSETMSG+1L1:CMPAL,[SI]JBNEXTMOVAL,[SI]NEXT:INCSILOOPL1MOVM,ALMOVAX,4C00HINT21HCSEGENDSENDSTART6.修改后运行结果:(5)试编制一个汇编语言程序,求出首地址为DATA的10个无符号字数组中的最小偶数,把它存放在AX中。画出程序框图,写出源程序清单和执行结果。Dataword0141H,0AE00H,07B4H,0A508H,0691H,word0870H,7542H,0081H,0916H,0017Ha.设计思路:本程序需要在10个无符号数中寻找最小的偶数,关键点为最小和偶数,所以需要两次判断,最后把结果放在AX中。b.程序设计图:c.程序说明dsegsegmentdatadw0141H,0AE00H,07B4H,0A508H,0691H,0870H,7542H,0081H,0916H,0017Hdsegendscsegsegmentassumeds:dseg,cs:csegstart:movax,dsegmovds,axmovcx,9//循环次数为9movax,data//取data的首地址放在ax中movsi,offsetdata+2//取data的第二号地址放在si中L1:testax,01h//判断ax中的数是奇数还是偶数jnzL2//不等于0即为奇数,跳到L2地址testwordptr[si],01h//判断[si]中的数是奇数还是偶数jnznext//奇数跳到next地址cmpax,[si]//比较ax与[si]jbnext//ax小于[si],跳到next地址L2:movax,[si]//ax与[si]进行交换next:addsi,2//si+2,取下个数地址LoopL1//L1进行循环movax,4c00h//退出int21hcsegendsendstartd.程序结果:(6)有10个数,统计正数的个数,存放在变量M中。经过汇编后,形成.EXE文件,先用G=0命令执行程序,用-D命令查看M单元的内容,会发现结果不正确。用单步执行命令T查找程序中的逻辑错误,注意每一次循环中AL寄存器中的值变化是否正确(AL寄存器中存放正数的个数)DSEGSEGMENTMSGDB4,-2,-6,0,5,67,8,-3,5,6MDB?DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVCX,10MOVAL,0LEASI,MSGL1:MOVBL,[SI]CMPBL,0JBENEXTINCALNEXT:INCSILOOPL1MOVM,ALMOVAX,4C00HINT21HCSEGENDSENDSTARTa.程序说说明这个程序的目的是要在4,-2,-6,0,5,67,8,-3,5,6中找出正数的个数。b.调试说明:运行无问题。c.错误问题:M单元中的内容错误,此时M为9,但真实值应为6.d.解决方法:该程序不应用无符号数的跳转,因此,需要把JBE改为JLEe.修改后代码:DSEGSEGMENTMSGDB4,-2,-6,0,5,67,8,-3,5,6MDB?DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVCX,10MOVAL,0LEASI,MSGL1:MOVBL,[SI]CMPBL,0JLENEXTINCALNEXT:INCSILOOPL1MOVM,ALMOVAX,4C00HINT21HCSEGENDSENDSTARTf.修改后结果:(7)假设有一组数据:5,-4,0,3,100,-51请编一程序,判断:每个数大于0,等于0,还是小于0;并将最终结果存于以result为存储的字节单元中,(ResultDB6dup(?))即:1当x0y=0当x=0-1当x0编程提示:1.首先将原始数据装入起始地址为XX的字节存储单元中。2.其中判断部分可采用CMP指令,得到一个分支结构,分别输出“y=0”,“y=1”,“y=-1”。将结果存入result的相应单元3.程序中存在一个循环结构,循环6次,调用6次分支结构后结束。a.设计思路:该实验主要的两大步就是“与0比较”和“将结果存入result的相应单元”,因此,需要用指针来实现。b.程序代码:dsegsegmentmsgdb5,-4,0,3,100,-51resultdb6dup(?)dsegendscsegsegmentassumecs:cseg,ds:dsegstart:movax,dsegmovds,axmovcx,6//循环6次leasi,msg//取msg的首地址放在si中leadi,result//取result的首地址放在result中l1:movbl,[si]//把si的内容放入bl中cmpbl,0//比较bl与0的大小jll3//bl小于0,跳到L3地址cmpbl,0//比较bl与0的大小jgl4//bl大于0,跳到L4地址movbl,0//bl等于0mov[di],bl//把bl的内容放在[di]中jmpl2//跳到L2中l3:movbl,-1//bl=-1mov[di],bl//把bl的内容放在[di]中jmpl2//跳到L2中l4:movbl,1//bl=1mov[di],bl//把bl的内容放在[di]中l2:incsi//si+1incdi//di+1deccx//cx-1cmpcx,0jzdonejmpl1done:movah,4chint21hcsejendsendstartc.运行结果:(8)数据段中的三个字符,调用子程序将其逐个显示出来。子程序的功能是显示一个字符。单步执行,观察SP、IP的变化,并用D命令查看栈顶的内容。DATASEGMENTMAGDB'ABC'DATAENDSSTACK_SEGSEGMENTDB100DUP(?)TOSLABELWORDSTACK_SEGENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK_SEGSTART:MOVAX,STACK_SEGMOVSS,AXMOVSP,OFFSETTOSMOVAX,DATAMOVDS,AXMOVSI,0MOVCX,3LL:MOVDL,MAG[SI]CALLMADDINCSILOOPLLMOVAx,4C00HINT21HMADDPROCMOVAH,02HINT21HRETMADDENDPCODEENDSENDSTARTa.单步执行程序,如下:从图中可以看出,在执行call命令前,SP一直保持0064不变而IP持续增加。在RET前从上图中可以看出,当程序在SP、IP每次都是分别按2和1递增,当运行到RET时,SP还是按照2来递增
本文标题:汇编实验三
链接地址:https://www.777doc.com/doc-7261874 .html