实验四分支和循环程序设计实验一、实验要求和目的1.熟悉汇编语言程序设计结构;2.熟悉汇编语言分支程序基本指令的使用方法;3.掌握利用汇编语言实现单分支、双分支、多分支的程序设计方法;4.了解汇编语言循环程序设计的基本流程;5.熟悉汇编语言循环基本指令的使用方法;6.掌握利用汇编语言的循环指令完成循环程序设计方法。二、软硬件环境1、硬件环境:计算机系统windows;2、软件环境:装有MASM、DEBUG、LINK、等应用程序。三、实验涉及的主要知识在实际应用中,经常根据一些条件来选择一条分支执行。汇编语言的条件判断主要是通过状态寄存器中的状态位、无符号数相减或有符号相减而导致的结果来进行。1.无条件转移指令JMP无条件转移指令JMP是使程序无条件转移至目标处,又分为段内转移、段间转移。2.条件转移指令JXX条件转移指令可分为三大类:1).简单条件转移指令指令。根据单个标志位的状态判断转移条件。标志位指令转移条件意义CFJCCF=1有进位/借位JNCCF=0无进位/借位ZFJE/JZZF=1相等/等于0JNE/JNZZF=0不相等/不等于0SFJSSF=1是负数JNSSF=0是正数OFJOOF=1有溢出JNOOF=0无溢出PFJP/JPEPF=1有偶数个1JNP/JPOPF=0有奇数个12).无符号数条件转移指令。假设在条件转移指令前使用比较指令,比较两个无符号数A,B,指令进行的的操作是A-B,其转移指令如下:指令转移条件意义JA/JNBECF=0ANDZF=0ABJAE/JNBCF=0ORZF=1A=BJB/JNAECF=1ANDZF=0ABJBE/JNACF=1ORZF=1A=B3).带符号数条件转移指令。指令转移条件意义JG/JNLESF=OFANDZF=0ABJGE/JNLSF=OFORZF=1A=BJL/JNGESFOFANDZF=0ABJLE/JNGSFOFORZF=1A=B四、实验内容与步骤1、判断方程AX2+BX+C=0是否有实根。若有实根,则将字节变量tag置1,否则置0。假设A、B、C均为字节变量,数据范围为-128~127。流程图:(2)程序代码:DATASSEGMENTA1DB?B1DB?C1DB?TAGDB?;此处输入数据段代码DATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXMOVAH,01H;输入第一个数据INT21HSUBAL,30H;输入数据存入A,并转化为十进制数MOVA1,ALMOVAH,01H;输入第二个数据INT21HSUBAL,30HMOVB1,ALMOVAH,01H;输入第三个数据INT21HSUBAL,30H;输入数据存入C,并转化为十进制数MOVC1,AL程序结果:B*B-4AC=0,0,0的三种情况MOVAL,B1MULAL;计算B*B,结果存入AXMOVBX,AX;B*B结果存入BXMOVAL,A1IMULC1MOVCL,4IMULCL;计算4*A*CCMPBX,AXJGET1MOVTAG,0JMPNEXT1T1:MOVTAG,1;有根,将TAG赋值为1NEXT1:ADDTAG,30HMOVDL,TAG;输出TAG的值MOVAH,02HINT21HMOVAH,4CHINT21HCODESENDSENDSTART2、编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z字符,显示“C”;若为a-z字符,显示“c”;若是回车字符CR(其ASCII码为0DH),则结束程序,若为其它字符则显示显示“R”。流程图:DATASSEGMENT;此处输入数据段代码结果DATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXMOVAH,01HINT21HCMPAL,'1';同1比较JNBONEONE:CMPAL,'9';同9比较JLREADJGETOWREAD:MOVDL,ALMOVAH,02HINT21HMOVAH,4CHINT21HTOW:CMPAL,'A';同A比较JGEAA:CMPAL,'Z';同Z比较READ1:MOVDL,'C'MOVAH,02HINT21HMOVAH,4CHINT21HTHREE:CMPAL,'a';同a比较JGEB;a则转到BB:CMPAL,'z';同z比较JLREAD2JGEFOURREAD2:MOVDL,'c'MOVAH,02HINT21HMOVAH,4CHJLREAD1JGETHREEINT21HFOUR:CMPAL,0DHJZCRJNZFIVECR:MOVAH,4CHINT21HFIVE:MOVDL,'R'MOVAH,02HINT21H;此处输入代码据段代码MOVAH,4CHINT21HCODESENDSENDSTART3、(大家再次编成实现实验一的题目,看是否可以优化程序?)分类统计字数组data中正数、负数和零的个数,并分别存入内存字变量Positive、Negative和Zero中,数组元素个数保存在其第一个字中。使用Debug查看Positive、Negative和Zero三个变量的数据。流程图程序代码DATASSEGMENTNUMDW30,4,16,-2,0,6,34,0,-4,3CNTEQU$-NUMPOSITIVEdb0Negativedb0Zerodb0DATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXLEASI,NUM;SI取NUM的偏移地址MOVCX,CNT/2;CX存入数据个数,JMPAZ:INCZeroJMPAA:ADDSI,2LOOPSADDPOSITIVE,30H;把数字转换为相应的ASCII码MOVDL,POSITIVEMOVAH,02HINT21HADDNegative,30HMOVDL,NegativeMOVAH,02HINT21HADDZero,30H用于控制循环S:CMPWORDPTR[SI],0JGPJZZINCNegativeJMPAP:INCPOSITIVE程序结果MOVDL,ZeroMOVAH,02HINT21HMOVAH,4CHINT21HCODESENDSENDSTART4、编写程序,在字符串变量STRING中存有一个以$为结尾的ASCII码字符串,要求计算字符串的长度,并把它存入LENGTH单元中。(要求用条件控制循环方法,并且字符串分数据类型是字节和字两种情况)流程图:程序代码:STRING1DB100db?DB100DUP(?)LENGTH1DB-1STR2DB0ah,'Thelengthofthestringis','','$'DATASENDSCODESSEGMENTMOVAH,0AHLEADX,STRING1INT21H;输入字符串LEASI,STRING1+2MOVCL,0S:MOVAH,0CMPBYTEPTR[SI],'$';判断与$是否相等JZSTOP;相等则跳去STOPINCSIASSUMECS:CODES,DS:DATAS,ES:DATASSTART:MOVAX,DATAS;初始化ES,DXMOVDS,AXINCCLMOVLENGTH1,CL;CL每次变化后保存JMPSSTOP:LEADX,STR2MOVAH,09HINT21HMOVAH,0结果ADDCL,30hMOVDL,CLMOVAH,02HINT21HMOVAH,4CHINT21HCODESENDSENDSTART五、实验总结通过这次实验掌握了输入输出基本操作,学习了单个字符的输入输出与字符串的输入输出,学习使用了数字与ASCII码之间的转换,进一步熟悉了许多的条件转移指令如JZ,JNZ,JGE,JL等.通过实验巩固了基础知识,加深了理解,非常有助于今后的学习.