1、本科实验报告 实验名称:实验4 分支和循环程序设计实验(设计性实验) 课程名称:CPU与汇编语言程序设计实验时间:周四晚 任课教师:王耀威实验地点:10-102 原理验证 实验教师:潘丽敏 实验类型:综合设计 学生姓名:王瑞瑶 自主创新 学号/班级:1120131315/05111361组号: 学院:信息与电子学院同组搭档: 专业:信息工程成绩: 一、实验要求和目的 1熟悉汇编语言程序设计结构; 2熟悉汇编语言分支程序基本指令的使用方法; 3掌握利用汇编语言实现单分支、双分支、多分支的程序设计方法; 4了解汇编语言循环程序设计的基本流程; 5熟悉汇编语言循环基本指令的使用方法; 6掌握利用汇编
2、语言的循环指令完成循环程序设计方法。 二、软硬件环境 1、硬件环境:计算机系统windows; 2、软件环境:装有MASM 、DEBUG 、LINK 、等应用程序。 三、实验涉及的主要知识 在实际应用中,经常根据一些条件来选择一条分支执行。汇编语言的条件判断主要是通 过状态寄存器中的状态位、无符号数相减或有符号相减而导致的结果来进行。 1无条件转移指令JMP 无条件转移指令JMP是使程序无条件转移至目标处,又分为段内转移、段间转移。 2条件转移指令JXX 条件转移指令可分为三大类: 1)简单条件转移指令指令。根据单个标志位的状态判断转移条件。 标志位指令转移条件意义 JCCF=1 有进位 /
3、借位 CF JNCCF=0 无进位 / 借位 JE/JZ ZF=1相等/ 等于 0 ZF JNE/JNZ ZF=0 不相等 / 不等于 0 JSSF=1 是负数 SF JNSSF=0 是正数 JOOF=1 有溢出 OF JNO OF=0无溢出 JP/JPE PF=1 有偶数个 1 PF JNP/JPO PF=0 有奇数个 1 2)无符号数条件转移指令。 假设在条件转移指令前使用比较指令,比较两个无符号数A,B,指令进行的的操作是 A-B,其转移指令如下: 指令转移条件意义 JA/JNBE CF=0 AND ZF=0 AB JAE/JNB CF=0 ORZF=1 A=B JB/JNAE CF=1
4、 AND ZF=0 AB JBE/JNA CF=1 ORZF=1 AB JGE/JNL SF=OFOR ZF=1 A=B JL/JNGESFOF AND ZF=0 AB JLE/JNG SFOF ORZF=1 A0 所以应该有解,tag 为 1 运行后, Dds:0 显示的数据第一排一次为2、8、5、1,前面三个是 a、b、c 的值,第四个是tag 的值,值为 1,符合题目要求 若改一改数据,将b 改成 2,结果应该为0 这里的 tag果然为 0,也符合题目要求。 2、编写一个程序,判别键盘上输入的字符;若是1-9 字符,则显示之;若为A-Z 字符,显 示“C”;若为a-z 字符,显示“c”;
5、若是回车字符 (其 ASCII码为 0DH),则结束程序, 若为其它字符则显示显示“R”。 源代码如下: DATAS SEGMENT char db? ;此处输入数据段代码 DATAS ENDS STACKSSEGMENT ;此处输入堆栈段代码 STACKSENDS CODESSEGMENT ASSUMECS:CODES,DS:DATAS,SS:STACKS START: MOVAX,DATAS MOVDS,AX l: mov ah,1 int 21h mov char,al cmpchar,0dh je end1 cmpchar,1;判断输入数是否比0 大 jge next1 jmpothe
6、rs next1:cmpchar,9;判断是否比 9 大 jle show1;不是的话,即在09 之间,跳至 show1 cmpchar,A;比 9 大后判断是否比41(A)大 jge next2 jmptest1;不比 40 大,去检测是否是回车 next2:cmpchar,Z;比 40 大后,判断是否比5a(Z) 大 jleshow2;不比 5a(Z)大,即在AZ之间, 跳至 show2 cmpchar,a;判断是否比 61(a)大 jge next3;若大,跳至 next3 jmpothers next3:cmpchar,z;检测是否比 7a(z)大 jleshow3;不比 7a(z)大
7、,即在az之间跳 至 show3 jmpothers test1:cmpchar,0dh jeend1 jmpothers show1: movdl,char mov ah,02h int 21h jmpdone show2: movdl,C mov ah,02h int 21h jmpdone show3: movdl,c mov ah,02h int 21h jmpdone others:mov dl,R mov ah,02h int 21h jmpdone done: loop l;输完一个字符之后,会立刻显示对应字符,此后 可以继续输入字符。 end1: ;此处输入代码段代码 MOVA
8、H,4CH INT 21H CODESENDS END START 运行结果如下: 例如输入 3,则立刻显示3(09 显示原字符,输入),输入e 之后显示 c(小写字母 都显示 c),输入 S之后显示 C(大写字母显示C),输入 之后显示 R(其他字符统一 显示 R),如果按回车,则退出循环,如下 3、(大家再次编成实现实验一的题目,看是否可以优化程序?)分类统计字数组data 中正 数、负数和零的个数,并分别存入内存字变量Positive、Negative和 Zero 中,数组元素个 数保存在其第一个字中。使用Debug 查看 Positive、Negative和 Zero 三个变量的数据。
9、 源代码如下: DATAS SEGMENT data1 dw 1,-2,-3,7,4,0,5 count equ ( $-data1)/2 positive dw count+1 dup(?) negetivedw count+1 dup(?) zerodw count+1 dup(?) ;此处输入数据段代码 DATAS ENDS STACKSSEGMENT ;此处输入堆栈段代码 STACKSENDS CODESSEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOVAX,DATAS MOVDS,AX mov dx,0 mov bx,0 mov
10、 di,0 mov si,0 mov cx,count ll: mov ax,data1si cmpax,0 jgp je z jl n p:movax,data1si movpositivesi+2,ax inc dx add si,2 jmpl z: mov ax,data1si mov zerosi+2,ax inc bx add si,2 jmpl n: mov ax,data1si mov negetivesi+2,ax inc di add si,2 jmpl l: loop ll mov positive0,dx mov zero0,bx mov negetive0,di;此处输
11、入代码段代码 MOVAH,4CH INT 21H CODESENDS END START 运行结果如下: -dds :0 里面显示的前面7个数为 data1 里面的,紧接着7 个数是 positive 4、编写程序,在字符串变量STRING 中存有一个以$为结尾的 ASCII码字符串,要求计算 字符串的长度,并把它存入LENGTH单元中。(要求用条件 控制循环方法,并且字符串分数 据类型是字节和字两种情况) 流程图: 情况 1(字节) 源代码: DATAS SEGMENT string db 13211$ length1 db ?;此处输入数据段代码 DATAS ENDS STACKSSEGM
12、ENT ;此处输入堆栈段代码 STACKSENDS CODESSEGMENT ASSUMECS:CODES,DS:DATAS,SS:STACKS START: MOVAX,DATAS MOVDS,AX mov al,0 mov si,0 count:cmpstringsi,$ je done inc si inc al jmpcount done: mov length1,al mov dl,al mov ah,02h int 21h;此处输入代码段代码 MOVAH,4CH INT 21H CODESENDS END START 运行结果为: -dds :0 中数据的第一行前面几个数是stri
13、ng,$的 ASCII码是 24,之后的一个数据 就是 string中字节的个数,这里显示为5个(不含 $本身) 情况 2(字) 源代码: DATAS SEGMENT string dw 1,3,2,1,1,$ length1 db ?;此处输入数据段代码 DATAS ENDS STACKSSEGMENT ;此处输入堆栈段代码 STACKSENDS CODESSEGMENT ASSUMECS:CODES,DS:DATAS,SS:STACKS START: MOVAX,DATAS MOVDS,AX mov al,0 mov si,0 count:cmpstringsi,$ je done inc
14、 si inc si inc al jmpcount done: mov length1,al mov dl,al mov ah,02h int 21h;此处输入代码段代码 MOVAH,4CH INT 21H CODESENDS END START 运行结果如下: 前面的几个数据是string的数据,最后一个数0005 是 string中元素的个数,5 个(这里 依旧把 $算作其内)。 注意:涉及到初始数据的,同学们自行给出多组数据,反复加以验证各题程序。 五、实验要求与提示 1、实验要求 (1)画出各程序流程图; (2)列出程序清单,加上适量注释; (3)回答思考问题; (4)记录实验结果; (5)完成实验报告(实验材料上的内容简写,自己的工作要详尽)。 2、实验提示 : A)二元一次方程有根的条件是B2-4*A*C=0 。依据题意,先计算出B2 和 4*A*C ,然 后比较两者大小, B)字符输入输出 利用 DOS 的 INT 21H系统功能调用来实现字符的输入/输出操作,其中1 号功能表示 输入字符; 2 号功能表示输出字符;详细查阅相关资料,简单示例: (1)显示单个字符可以用DOS 的 INT 21H的 2 号功能,将字符放在DL 寄存器中, 2 号放在 AH 寄存器中。 MOVDL, * MOVAH,2 INT 21H_
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。