当前位置:文档之家› 实验四分支和循环程序设计实验(精)

实验四分支和循环程序设计实验(精)

实验四分支和循环程序设计实验一、实验要求和目的1.熟悉汇编语言程序设计结构;2.熟悉汇编语言分支程序基本指令的使用方法;3.掌握利用汇编语言实现单分支、双分支、多分支的程序设计方法;4.了解汇编语言循环程序设计的基本流程;5.熟悉汇编语言循环基本指令的使用方法;6.掌握利用汇编语言的循环指令完成循环程序设计方法。

二、软硬件环境1、硬件环境:计算机系统 windows;2、软件环境:装有 MASM、DEBUG、LINK、等应用程序。

三、实验涉及的主要知识在实际应用中,经常根据一些条件来选择一条分支执行。

汇编语言的条件判断主要是通过状态寄存器中的状态位、无符号数相减或有符号相减而导致的结果来进行。

1.无条件转移指令 JMP无条件转移指令 JMP是使程序无条件转移至目标处,又分为段内转移、段间转移。

2.条件转移指令 JXX条件转移指令可分为三大类:1).简单条件转移指令指令。

根据单个标志位的状态判断转移条件。

标志位指令转移条件意义CFJC CF=1 有进位/借位JNC CF=0 无进位/借位ZFJE/JZ ZF=1 相等/等于 0JNE/JNZ ZF=0 不相等/不等于 0SFJS SF=1 是负数JNS SF=0 是正数OFJO OF=1 有溢出JNO OF=0 无溢出PFJP/JPE PF=1 有偶数个 1JNP/JPO PF=0 有奇数个 12).无符号数条件转移指令。

假设在条件转移指令前使用比较指令,比较两个无符号数A,B,指令进行的的操作是 A-B,其转移指令如下:指令转移条件意义JA/JNBE CF=0 AND ZF=0 A>BJAE/JNB CF=0 OR ZF=1 A>=BJB/JNAE CF=1 AND ZF=0 A<BJBE/JNA CF=1 OR ZF=1 A<=B3).带符号数条件转移指令。

指令转移条件意义JG/JNLE SF=OF AND ZF=0 A>BJGE/JNL SF=OF OR ZF=1 A>=BJL/JNGE SF OF AND ZF=0 A<BJLE/JNG SF OF OR ZF=1 A<=B四、实验内容与步骤1、判断方程 AX2+BX+C=0是否有实根。

若有实根,则将字节变量 tag置 1,否则置 0。

假设 A、B、C均为字节变量,数据范围为-128~127。

流程图:(2)程序代码:DATAS SEGMENTA1 DB ?B1 DB ?C1 DB ? TAG DB ? ;此处输入数据段代码 DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START:MOV AX,DATAS MOV DS,AXMOV AH,01H;输入第一个数据 INT 21HSUB AL,30H;输入数据存入A,并转化为十进制数MOV A1,ALMOV AH,01H;输入第二个数据 INT 21H SUB AL,30H MOV B1,ALMOV AH,01H;输入第三个数据 INT 21HSUB AL,30H;输入数据存入C,并转化为十进制数MOV C1,AL程序结果: B*B-4AC=0,>0,<0的三种情况MOV AL,B1MUL AL;计算B*B,结果存入AX MOV BX,AX;B*B结果存入BXMOV AL,A1 IMUL C1 MOV CL,4IMUL CL;计算4*A*CCMP BX,AX JGE T1 MOV TAG,0 JMP NEXT1T1: MOV TAG,1;有根,将TAG赋值为1 NEXT1:ADD TAG,30HMOV DL,TAG;输出TAG的值 MOV AH,02H INT 21H MOV AH,4CH INT 21H CODES ENDS END START2、编写一个程序,判别键盘上输入的字符;若是 1-9字符,则显示之;若为 A-Z 字符,显示“C”;若为 a-z字符,显示“ c”;若是回车字符 <CR>(其 ASCII码为 0DH),则结束程序,若为其它字符则显示显示“R”。

流程图:DATAS SEGMENT;此处输入数据段代码结果DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS START:MOV AX,DATASMOV DS,AXMOV AH,01HINT 21HCMP AL,'1';同1比较JNB ONEONE:CMP AL,'9';同9比较JL READJGE TOWREAD:MOV DL,ALMOV AH,02HINT 21HMOV AH,4CHINT 21HTOW: CMP AL,'A';同A比较JGE A A:CMP AL,'Z';同Z比较READ1:MOV DL,'C' MOV AH,02H INT 21H MOV AH,4CH INT 21HTHREE:CMP AL,'a';同a比较 JGE B;>a则转到B B: CMP AL,'z';同z比较 JL READ2 JGE FOUR READ2: MOV DL,'c' MOV AH,02H INT 21H MOV AH,4CH JL READ1 JGE THREEINT 21HFOUR:CMP AL,0DH JZ CR JNZ FIVE CR: MOV AH,4CH INT 21HFIVE: MOV DL,'R' MOV AH,02HINT 21H ;此处输入代码据段代码 MOV AH,4CH INT 21H CODES ENDS END START3、(大家再次编成实现实验一的题目,看是否可以优化程序?)分类统计字数组 data中正数、负数和零的个数,并分别存入内存字变量Positive、Negative和Zero中,数组元素个数保存在其第一个字中。

使用 Debug查看Positive、Negative和 Zero三个变量的数据。

流程图程序代码DATAS SEGMENTNUM DW 30,4,16,-2,0,6,34,0,-4,3 CNT EQU $-NUM POSITIVE db 0 Negative db 0 Zero db 0DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS START:MOV AX,DATASMOV DS,AXLEA SI,NUM ;SI取NUM的偏移地址 MOV CX,CNT/2;CX存入数据个数,JMP A Z:INC Zero JMP A A:ADD SI,2 LOOP SADD POSITIVE,30H;把数字转换为相应的ASCII码MOV DL,POSITIVE MOV AH,02H INT 21HADD Negative,30H MOV DL,Negative MOV AH,02HINT 21HADD Zero,30H用于控制循环 S:CMP WORD PTR [SI],0 JG P JZ Z INC Negative JMP A P:INC POSITIVE程序结果MOV DL,ZeroMOV AH,02HINT 21HMOV AH,4CH INT 21H CODES ENDS END START4、编写程序,在字符串变量 STRING中存有一个以 $为结尾的 ASCII码字符串,要求计算字符串的长度,并把它存入 LENGTH单元中。

(要求用条件控制循环方法,并且字符串分数据类型是字节和字两种情况)流程图:程序代码: STRING1 DB 100 db ?DB 100 DUP(?) LENGTH1 DB -1STR2 DB 0ah,'The length of the string is',' ','$' DATAS ENDSCODES SEGMENTMOV AH,0AH LEA DX,STRING1 INT 21H;输入字符串 LEA SI,STRING1+2 MOV CL,0 S:MOV AH,0CMP BYTE PTR[SI],'$';判断与$是否相等 JZ STOP;相等则跳去STOPINC SIASSUME CS:CODES,DS:DATAS,ES:DATAS START:MOV AX,DATAS;初始化ES,DX MOV DS,AXINC CLMOV LENGTH1,CL;CL每次变化后保存JMP SSTOP:LEA DX,STR2MOV AH,09HINT 21HMOV AH,0结果ADD CL,30h MOV DL,CL MOV AH,02H INT 21H MOV AH,4CH INT 21H CODES ENDS END START五、实验总结通过这次实验掌握了输入输出基本操作,学习了单个字符的输入输出与字符串的输入输出,学习使用了数字与ASCII码之间的转换,进一步熟悉了许多的条件转移指令如JZ,JNZ,JGE,JL等.通过实验巩固了基础知识,加深了理解,非常有助于今后的学习.。

相关主题