微机原理软件实验报告学院:信息与通信工程学院班级:班内序号:姓名:学号:实验二分支,循环程序设计一.实验目的:1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的DOS 功能调用.二.实验内容:1.安排一个数据区(数据段),内存有若干个正数,负数和零.每类数的个数都不超过9.2.编写一个程序统计数据区中正数,负数和零的个数.3.将统计结果在屏幕上显示.三.预习题:1.十进制数0 -- 9 所对应的ASCII 码是什么? 如何将十进制数0 -- 9 在屏幕上显示出来?答:0—9对应的ASCII 码是30H—39H;在屏幕上显示0—9,需要将对应字符的ASCII 码赋给DL,并进行DOS的2号功能调用,0—9的ASCII 码正是其本身的数值加上30H。
2.如何检验一个数为正,为负或为零? 你能举出多少种不同的方法?答:①用CMP命令和0比较,如果ZF为1,则该数为零;再用该数和8000H相与,取出符号位判断,可区分正负;②用CMP命令和0比较,结果不小于0时用JGE命令进行跳转,否则为负数;用JGE 命令跳转后,如果为0再用JZ命令跳转,否则为正数。
四.选作题:统计出正奇数,正偶数,负奇数,负偶数以及零的个数.五.实验过程1.流程图2.源代码DATA SEGMENTNUM DW 0,0,1,2,3,4,5,101,-6,-7,-8,-8,-9 ;有2个0,6 个正数,5 个负数N DW ($-NUM)/2 ;该组数据的个数Z DB 0 ;0 的个数P DB 0 ;正数的个数PO DB 0 ;正奇数的个数PE DB 0;正偶数的个数M DB 0 ;负数的个数MO DB 0;负奇数的个数ME DB 0 ;负偶数的个数STR0 DB 'number of zeros : $' ;STR0-4为用于显示的字符串STR1 DB 0DH, 0AH, 'number of positive numbers : $'STR2 DB 0DH, 0AH, 'number of negative numbers : $'STR3 DB 0DH, 0AH, ' odd : $'STR4 DB ' even : $'DATA ENDSSTACK SEGMENT STACKDW 100 DUP(?)STACK ENDSCODE SEGMENTASSUME DS:DATA, SS:STACK, CS:CODESTART: MOV AX, DATAMOV DS, AXMOV AX, STACKMOV SS, AX ;初始化DS、SSLEA BX, NUM ;将NUM 中第一个数字的地址送入BXMOV CX, N ;将数据个数送入CXAGAIN: MOV AX, [BX] ;取出NUM 中的第一个数字CMP AX, 0 ;和0比较JGE PLU ;大于等于0时转PLUINC M ;负数的个数加1TEST AX, 1 ;检测该数据最低位是否为1,即是否为负奇数JNZ MINODD ;ZF为0时转MINODD,该数为负奇数INC ME ;负偶数个数加1JMP NEXTMINODD: INC MO ;负奇数个数加1JMP NEXTPLU: JZ ZER ;等于0时转ZERINC P ;正数个数加1TEST AX, 1 ;检测该数据最低位是否为1,即是否为正奇数JNZ PLUODD ;ZF为0时转PLUODD,该数为正奇数INC PE ;正偶数个数加1JMP NEXTPLUODD: INC PO ;正奇数个数加1JMP NEXTZER: INC Z ;零的个数加1NEXT: ADD BX,2 ;偏移地址加2,指向下一数字LOOP AGAIN ;CX自减,CX≠0时继续循环DISPLAY: ;在屏幕上显示统计结果MOV AH, 09H ;9号功能调用,显示字符串MOV DX, OFFSET STR0 ;将字符串的首地址的偏移地址送到DX,DS已;是其段基址INT 21HMOV AH, 02H ;2号功能调用,显示单个字符MOV DL, Z ;将零的个数送到DLADD DL, 30H ;0—9数字本身加上30H即为其ASCII 码INT 21HMOV AH, 09H ;正数部分统计结果显示,原理同上MOV DX, OFFSET STR1INT 21HMOV AH, 02HMOV DL, PADD DL, 30HINT 21HMOV AH, 09HMOV DX, OFFSET STR3INT 21HMOV AH, 02HMOV DL, POADD DL, 30HINT 21HMOV AH, 09HMOV DX, OFFSET STR4INT 21HMOV AH, 02HMOV DL, PEADD DL, 30HINT 21HMOV AH, 09H ;负数部分统计结果显示,原理同上MOV DX, OFFSET STR2INT 21HMOV AH, 02HMOV DL, MADD DL, 30HINT 21HMOV AH, 09HMOV DX, OFFSET STR3INT 21HMOV AH, 02HMOV DL, MOADD DL, 30HINT 21HMOV AH, 09HMOV DX, OFFSET STR4INT 21HMOV AH, 02HMOV DL, MEADD DL, 30HINT 21HMOV AX, 4C00H ;返回DOSINT 21HCODE ENDSEND START3.运行结果数据为:0,0,1,2,3,4,5,101,-6,-7,-8,-8,-9运行结果:zero表示零的个数,为2;positive number表示正数的个数,为6,其中奇数odd为4个,偶数even为2个;negative number表示负数的个数,为5,其中奇数odd为2个,偶数even 为3个。