您好,欢迎访问三七文档
汇编语言程序设计实验三汇编语言程序调试运行学号:姓名:(1)将下面的数据段输入,取名为1.asm,保存在MASM文件夹下,生成.lst文件,不必连接运行,查看1.lst文件,试回答:DA1,DA2的偏移量分别为多少?COUNT的值为多少?datasegmentorg20hnum1=8num2=num1+10hda1db'IBMPC'da2db0ah,0dhcountequ$-da1dataendsendDA1偏移量为0020H,DA2偏移量为:0026HCOUNT的值为:0008H(2)输入下列指令,改正可能的错误(先不要运行程序):datasegmentvar1db0,25,0dh,300var2db12h,a4h,6bhvar3db'ABCDEF'var4dw1234h,5678hvar5dw10hdup(?)dataendscodesegmentassumecs:code,de:databeginmovax,datamovds,axleasi,var5movbx,offsetvar2mov[si],0abhmovax,var1+2mov[bx],[si]movvar5+4,var4movah,4chint21hcodeendsendstart改正为:datasegmentvar1db0,25,0dh,255var2db12h,0a4h,06bhvar3db'ABCDEF'var4dw1234h,5678hvar5dw10hdup(?)dataendscodesegmentassumecs:code,ds:datastart:movax,datamovds,axleasi,var5movbx,offsetvar2mov[si],WORDPTR0abhmovax,offsetvar3movcx,[si]mov[bx],cxpushbxmovbx,offsetvar4movsi,offsetvar5movcx,[bx]mov[si],cxmovcx,[bx+2]mov[si+2],cxpopbxmovah,4chint21hcodeendsendstart(3)写一个完整的程序放在代码段C_SEG中,要求把数据段D_SEG中的AGUEND和附加段E_SEG中的ADDEND相加,并把结果存放在D_SEG中的SUM中。其中AUGEND,ADDEND,SUM均为dw类型,AUGEND赋值为9251,ADDEND赋值为-5962。实验报告中要求写出源程序,简单叙述上机步骤,调试方法。调试步骤(详见书P146~153)1.编辑源程序,建立一个以后缀为.asm的文件.2.汇编源程序,编译:c:\MASM5\masmxxxx.asm检查程序有否错误,有错时回到编辑状态,修改程序中错误行。无错时继续第3步。3.连接目标程序,产生可执行程序。连接:c:\MASM5\linkxxxx.obj4.运行:c:\MASM5\xxxx..exe5.调试:c:\winnt\system32\debugxxxx.exe1)先用命令U反汇编整个程序,查看每条指令的物理地址,其显示内容的含义为:内存地址指令代码反汇编的程序代码-u0B75:00001EPUSHDS2)再用-t命令单步执行,检查各个寄存器的值变化情况6.DEBUG调试可执行程序,记录数据段和附加段的内容。代码:D_SEGsegmentAGUENDdw9251SUMdw?D_SEGendsE_SEGsegmentADDENDdw-5962E_SEGendsC_SEGsegmentassumecs:C_SEG,ds:D_SEG,es:E_SEGstart:movax,D_SEGmovds,axmovax,E_SEGmoves,axmovax,AGUENDaddax,ADDENDmovSUM,axint21hC_SEGendsendstart反汇编:-u0B40:0000B83E0BMOVAX,0B3E0B40:00038ED8MOVDS,AX0B40:0005B83F0BMOVAX,0B3F0B40:00088EC0MOVES,AX0B40:000AA10000MOVAX,[0000]0B40:000D26ES:0B40:000E03060000ADDAX,[0000]0B40:0012A30200MOV[0002],AX0B40:0015CD21INT21执行结果:-gcs:0015AX=0CD9BX=0000CX=0037DX=0000SP=0000BP=0000SI=0000DI=0000DS=0B3EES=0B3FSS=0B3ECS=0B40IP=0015NVUPEIPLNZNAPOCY0B40:0015CD21INT21-dds:00B3E:00002324D90C00000000-0000000000000000#$..............-des:000B3F:0000B6E8000000000000-0000000000000000................在编辑器中编程,然后用masm5.0将程序编译连接,得到可执行文件,使用debug程序对本程序进行调试,执行后发现无错误,演算结果正确,程序正确。(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:ADDSI,1;增加一条ADD语句即可LOOPL1MOVM,ALMOVAX,4C00HINT21HCSEGENDSENDSTART(5)试编制一个汇编语言程序,求出首地址为DATA的10个无符号字数组中的最小偶数,把它存放在AX中。画出程序框图,写出源程序清单和执行结果。Dataword0141H,0AE00H,07B4H,0A508H,0691H,word0870H,7542H,0081H,0916H,0017H程序框图:开始数据指针SI循环变量CX程序数据[SI]是否为偶数CX减一SI加一CX大于0否是AX=[SI]是AX=0否[SI]是否大于AX是否数据指针SI循环变量CX[SI】是否为偶数AX=[SI]是结束CX减一SI加一CX大于0否是源程序清单:DSEGSEGMENTdataADW0141H,0AE0H,07B4H,0A58H,0691H,0870H,7542H,0081H,0916H,0017HDSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVCX,10MOVSI,0INIT:MOVBX,[SI]ANDBX,1CMPBX,1JEDEFMOVAX,[SI]JMPCMPADEF:ADDSI,2LOOPINITMOVCX,10MOVSI,0CMPA:CMPAX,[SI]JBERESMOVBX,[SI]ANDBX,1CMPBX,1JERESMOVAX,[SI]RES:ADDSI,2LOOPCMPAINT21HCSEGENDSENDSTART执行结果:-ucs:333a0B40:00338B04MOVAX,[SI]0B40:003583C602ADDSI,+020B40:0038E2EBLOOP00250B40:003ACD21INT21-rAX=07B4BX=0001CX=0000DX=0000SP=0000BP=0000SI=0014DI=0000DS=0B3EES=0B2ESS=0B3ECS=0B40IP=003ANVUPEIPLNZNAPENC0B40:003ACD21INT21(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,0JBENEXT;JBE改为JLE,JBE只能判断无符号数,此处为带符号数INCALNEXT:INCSILOOPL1MOVM,ALMOVAX,4C00HINT21HCSEGENDSENDSTART(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次分支结构后结束。源程序:DSEGSEGMENTMSGDB5,-4,0,3,100,-51ResultDB6dup(?)DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVCX,6LEASI,MSGLEABX,ResultLABLE:MOVAL,[SI]CMPAL,0JLENPOSIMOV[BX],BYTEPTR1ADDBX,1JMPLOPNPOSI:JZNNEGAMOV[BX],BYTEPTR-1ADDBX,1JMPLOPNNEGA:MOV[BX],BYTEPTR0ADDBX,1JMPLOPLOP:INCSILOOPLABLEINT21HCSEGENDSENDSTART(8)数据段中的三个字符,调用子程序将其逐个显示出来。子程序的功能是显示一个字符。单步执行,观察SP、IP的变化,并用D命令查看栈顶的内容。DATASEGMENTMAGDB'ABC'DATAENDSSTACK_SEGSEGMENTDB100DUP(?)TOSLABELWORDSTACK_SEGENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK_SEGSTART:MOVAX,STACK_SEGMOVSS,AX;设置栈段寄存器SSMOVSP,OFFSETTOS;设置栈顶指针寄存器SPMOVAX,DATAMOVDS,AX;设置数据段寄存器DSMOVSI,0;设置数据段指针寄存器SIMOVCX,3;设置循环次数LL:MOVDL,MAG[SI];将要输出的字符放到DL中CALLMADD;调用子函数INCSI;指针指向下一位LOOPLL;循环MOVAx,4C00HINT21H;结束程序MADDPROC;MOVAH,02H;设置AH值INT21H;调用中断RET;返回MADDENDPCODEENDSENDSTART程序在CALLMADD指令处压栈,将下一条指令的地址压入栈顶,在子程序RET指令处出栈,将栈顶元素放到IP寄存器中。(9)将一个给定的二进制数按位转换成相应的ASCII码字符串,送到指定的存储单元,如二进制数10010011转换成字符串为‘10010011’。要求将转换过程写成子程序,且子程序应具有较好的通用性,而必须能实现对8位和16位二进制数的转换。(用寄存器或变量实现参数传递)测试数据:Var8bitbyte10010011BVar16bitword1010001111000100B显示单元:Sh
本文标题:34实验三
链接地址:https://www.777doc.com/doc-1910251 .html