一、实验目的(1)进一步熟练掌握8086汇编语言编译调试工具和环境的操作;(2)掌握完整8086汇编的程序设计编写方法;(3)掌握简单的数值码制转换方法;(4)掌握键盘输出的DOS功能调用方法。二、实验要求:将AX中的一个二进制数(对应的十进制数范围是0-65535),转换成压缩性BCD码表示的十进制,并从屏幕输出转换结果。要求用减法实现,并比较与除法方法进行运行速度比较。三、实验及报告要求:3.1、简要说明算法,并画出正确的程序流程图;3.2、给出完整正确的源程序代码,要求给每一句伪指令或指令加上注释;3.3、分别在DOS和Windows下编译、连接源程序生成可执行文件并调试,比较两个环境下生成的机器码的长度、寄存器内容、计算结果的异同。3.4、如何观察转换过程中标志寄存器中各标志位的结果?如何观察转换结果的变化?试改变被转换数值,对结果与编制为的变化加以说明和解释。3.5、写出完整的实验报告,特别是“实验结果”与“实验总结体会”部分,是评分的主要依据。3.6、实验总结中要求结合实验中的经验、教训或体会对汇编语言格式、调试方法和微机原理学习方法作出总结。四、程序流程图减法。即五位数先循环减10000,直到不够减了,做减法的次数就是万分位的结果;将不够减之前一次的余数恢复,再循环减去1000,直到不够减了,做减法的次数就是千分位的结果;以此类推,最后恢复的正余数就是个位的结果.除法。即五位数先除以10000,得到的商存放万位数的变量上;再将余数除以1000,得到的商存放千位数的变量上;之后将余数除以100,得到的商存放百分位的变量上;以此类推,最后的余数存放在个位的变量上。A、减法结束将余数保存到个位数恢复正余数恢复余数计数器清零Y将数减去100计数值加1将计数器的值保存到百分位够减否N输入二进制数Y将数减去10000计数值加1将计数器的值保存到万分位恢复余数够减否计数器清零零N计数器清零Y将数减去1000计数值加1将计数器的值保存到千分位恢复余数够减否计数器清零NY将数减去10计数值加1将计数器的值保存到十分位够减否NB、除法五、源程序代码A、减法源程序DATASEGMENT;数据段RESULT_1DB0RESULT_2DB0RESULT_3DB0RESULT_4DB0RESULT_5DB0DATAENDSSTACKSEGMENTSTACK;堆栈段STADB64DUP(0);开辟100单元作为堆栈空间STACK_TOPDB0STACKENDSCODESEGMENT;代码段ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AX;设置数据段MOVAX,STACKMOVSS,AX;设置堆栈段LEASP,STACK_TOP;设置栈顶指针MOVAX,25468MOVCL,0;计数器清零NEXT1:SUBAX,10000;减10000JCOVER1;有借位说明不够减INCCL;否则够减,计数器加1JMPNEXT1;无条件跳转OVER1:ADDAX,10000;最后恢复不够减时AL的余数MOVBX,AXMOVRESULT_1,CLADDCL,30HMOVAH,02MOVDL,CLINT21HMOVCL,0MOVAX,BXNEXT2:SUBAX,1000;减1000JCOVER2;有借位说明不够减INCCL;否则够减,计数器加1JMPNEXT2;无条件跳转OVER2:ADDAX,1000;最后恢复不够减时AL的余数MOVBX,AXMOVRESULT_2,CLADDCL,30HMOVAH,02MOVDL,CLINT21HMOVCL,0MOVAX,BXNEXT3:SUBAX,100;减100JCOVER3;有借位说明不够减INCCL;否则够减,计数器加1JMPNEXT3;无条件跳转OVER3:ADDAX,100;最后恢复不够减时AL的余数MOVBX,AXMOVRESULT_3,CLADDCL,30HMOVAH,02MOVDL,CLINT21HMOVCL,0MOVAX,BXMOVCL,0;计数器清零NEXT4:SUBAL,10;减10JCOVER4;有借位说明不够减INCCL;否则够减,计数器加1JMPNEXT4;无条件跳转OVER4:ADDAL,10;最后恢复不够减时AL的余数MOVBL,ALMOVRESULT_4,CLADDCL,30HMOVAH,02MOVDL,CLINT21HMOVCL,0MOVAX,BXMOVRESULT_5,ALADDAL,30HMOVAH,02MOVDL,ALINT21HMOVAX,4C00H;返回DOS(两句)INT21H;CODEENDSENDSTART;最后一行要按回车键B、除法源程序DATASEGMENT;数据段RESULT_1DB1;结果1为低八位,初始量为’1’RESULT_2DB1;结果1为低八位RESULT_3DB1;结果1为低八位RESULT_4DB1;结果1为低八位RESULT_5DB1;结果1为低八位DATAENDS;结束数据段STACKSEGMENTSTACK;堆栈段STADB64DUP(0);堆栈段初始化STACK_TOPDB0;栈顶初始化STACKENDS;结束堆栈段CODESEGMENT;代码段ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:;假定为指令MOVAX,DATA;把具体DATA送至寄存器中MOVDS,AX;设置数据段MOVAX,STACK;把STACK送至寄存器中MOVSS,AX;设置堆栈段LEASP,STACK_TOP;设置栈顶指针MOVAX,32345;赋予立即数32345给AXMOVDX,0;余数清零MOVCX,10000;赋予立即数10000给CXDIVCX;除于CX中的立即数MOVRESULT_1,AL;除以10000,得万位数MOVAX,DX;将DX中的余数给AXMOVDX,0;余数清零MOVCX,1000;赋予立即数1000给CXDIVCX;除以1000MOVRESULT_2,AL;除以1000,得千位数MOVAX,DX;将DX中的余数给AXMOVDX,0;余数清零MOVCL,100;赋予立即数100给CLDIVCL;除以100;MOVRESULT_3,AL;除以100,得百位数MOVAL,AH;将AH中的余数给ALMOVAH,0;余数清零MOVCL,10;赋予立即数10给CLDIVCL;除以10MOVRESULT_4,AL;余数除以10,得十位数MOVRESULT_5,AH;余数为个位数MOVCX,05H;循环5次MOVAH,02H;显示符LEADI,RESULT_1;将结果1的偏移量给DILP:MOVDL,BYTEPTR[DI];将[SI]中的字节内容给DLADDDL,30H;DL中的内容加30,显示数字INT21H;DOSINT21功能调用INCDI;每显示一个字符,DI加1LOOPLP;LP循环MOVAX,4C00H;返回DOS(两句)INT21HCODEENDS;代码段结束ENDSTART;最后一行要按回车键六、实验结果6.1分别在DOS和Windows下编译、连接源程序生成可执行文件并调试,比较两个环境下生成的机器码的长度、寄存器内容、计算结果的异同。A、减法1、Windows下的调试结果2、DOS下的调试结果3、比较机器码的长度、寄存器内容、计算结果的异同WindowsDOS寄存器内容CSF4001419IP02040000SS07111414SP003A0042BP00000000SI00000000DI00050000DS07101403ES07001403计算结果1742617426B、除法1、Windows下的调试结果2、DOS下的调试结果3、比较机器码的长度、寄存器内容、计算结果的异同WindowsDOS寄存器内容CSF4001419IP02040000SS07111414SP003A0042BP00000000SI00000000DI00050000DS07101403ES070014036.2、如何观察转换过程中标志寄存器中各标志位的结果?如何观察转换结果的变化?试改变被转换数值,对结果与编制为的变化加以说明和解释。A、减法4412H改成3012H1、DOS2、WindowsB、除法4412H改成3012H1、DOS2、Windows计算结果1742617426C、标志寄存器七、实验总结与体会本次实验,是运用减法和除法来进行二进制转换成BCD码。在实验前应做好充分的预习,画好流程图并编好程序,可以的话还是在实验前运行一下,若有问题可及时问老师。而在编写程序中,应及时学会运用循环指令,注意算法,且要注意添加显示符,否则无法显示你的运算结果。在本次试验中,因为没有很注重预习,导致实验时程序出现了差错。课后进行了补充和修改,在DOS和EMU8086环境下能较为顺利的完成了实验内容。八、思考题如何让你的程序自适应地处理高位为‘0’时不输出或输出空格呢?分配一个标志,在该标志不为零时,输出值是零就不输出或输出空格,标志为零时无论何值都要输出。如果是从高位开始输出,那么只要先置标志,在输出一个非零数字或者当做到个位数的时候,把这个标志清零。。NV无溢出UP串操作指令为自动增量指令EI允许中断请求PL符号为正NZ运算结果不为零NA辅助进位无进位PO1的个数为奇数NC无进位