1一、实验内容:编制程序,把十进制数15786转化成二进制数。提示:15786=1×10×10×10×10+5×10³+7×10²+8×10+6循环CX=5实验要求:1.绘出练习1和2的程序流程图。2编写完整的程序,上机调试。3使用DEBUG调试命令,查看中间结果,并查看最终结果。二、程序清单DATASEGMENTBUFFER1DD15786DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATASTART:MOVAX,DATAMOVDS,AXMOVES,AXLEASI,BUFFER1;取出十进制数的首地址MOVBX,[SI];将首地址的内容放到寄存器MOVCX,16;循环次数NEXT1:MOVDL,31H;1SHLBX,1;左移一位,将最高位移到进位位中JCNEXT2;进位位为1,即最高位为1,跳转输出1MOVDL,30H;否则输出0NEXT2:MOVAH,02HINT21HLOOPNEXT1;循环MOVAH,4CHINT21HCODEENDSENDSTART程序流程图见下页:2程序流程图开始将数据从地址中取出,设置存放的寄存器设置CX的数值将数据左移一位C中为1?将ASCII码31H输出,即输出为1将ASCII码30H输出,即输出为0CX=0?结束3三、运行结果程序编译:程序链接:程序运行结果:程序运行结果:15786十进制数转换为二进制输出为00111101101010104四、调试分析及体会调试分析:在此次编程中第一次编出的程序经过编译没有错误之后经过链接运行结果不正确。首先自己进行检查,通过检查发现自己没有认真,在编写程序时,误把十进制数15786写成了16进制,写为了15786H(因为这个自己一直没有检查出来,还在调试如何改正),后来检查了出来。因为这个缘故,在进行把数字取出放入寄存器的时候,由于BX是16位数据寄存器,而20位的数放不下,于是在循环输出二进制数时,首先不会输出20位,其次输出的结果是与15786H相关的二进制,结果完全错误。在之后的程序中,由于自己的考虑全面,觉得15786小于65536即0FFFFH,就将CX设置为了14,由于循环次数比正确程序少了两位,十进制在转化出来之后结果与正确结果相比少了低两位。附:此次错误的源程序,以及编译连接运行过程及调试过程:错误的程序:DATASEGMENTBUFFER1DD15786DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATASTART:MOVAX,DATAMOVDS,AXMOVES,AXLEASI,BUFFER1MOVBX,[SI]MOVCX,14NEXT1:MOVDL,31HSHLBX,1JCNEXT2MOVDL,30HNEXT2:MOVAH,02HINT21HLOOPNEXT1MOVAH,4CHINT21HCODEENDSENDSTART5编译链接运行:编译:链接:运行:6主要过程的单步调试:通过单步调试,发现其余的寄存器等结果都正确,主要因为循环次数的不正确,导致在二进制数输出时,想比正确程序提前结束,到之后两位缺少,输出不完全。在发现这个原因之后进行改正,最终得到正确的输出结果。7体会:首先,写程序重点在于思路,之前一直没有在写程序之前画程序流程图的习惯,程序流程图就是整个程序的思路,这样才能逻辑性比较强的写出程序。并且自己还是写程序的逻辑性不够强,以后还需加强。其次,再码转换这个程序中,让自己首先请出了一个概念,当数字输入计算机之后,计算机是以二进制数进行存储的,而要以二进制输出,即为将数据从电脑中输出即可,在这里,移位来输出会表现得比较简单易行。在最初的编写中,首先没有看清题目,导致自己在开始时走了很多弯路,但是自己在弯路中也学会了很多,因为在把数字当作十六进制数后,变成了二进制20位的,当时一直在想办法把16位放入通用寄存器输出以后,把另外四位如何解决,虽然最后没有行得通,但是过程最重要,就是要在过程中将书本上的知识加以利用,更深刻的理解。结果只是一个简单的结果,但是我们最大的收获还是在过程中,实践是检验真理的唯一标准。最后,通过此次程序的编写,对书上的指令加以实践应用,对这些指令有了更深的认识,理论联系实际,这样才能将知识理解的更深刻。