信息与通信工程学院 微机原理软件实验报告
班
级: 名: 号: 期: 2015年11月
姓 学 日
1
实验B 分支、循环程序设计
一、实验目的
1. 开始独立进行汇编语言程序设计; 2. 掌握基本分支,循环程序设计; 3. 掌握最简单的 DOS 功能调用。
二、实验内容
1. 安排一个数据区,内存有若干个正数,负数和零。每类数的个数都不超过 9。
2. 编写一个程序统计数据区中正数,负数和零的个数。 3. 将统计结果在屏幕上显示。
4. (选作题)统计出正奇数、正偶数,负奇数、负偶数以及零的个数。
三、预习思考
1. 十进制数 0 ~ 9 所对应的 ASCII 码是什么? 如何将十进制数 0 ~ 9 在屏幕上显示出来?
0~9分别对应ASCII码的30H~39H;
由于数字0~9的ASCII码值与其代表的数值之间相差30H,因此将其减去30H即可得到以非压缩型BCD数形式表示的十进制数。 2. 如何检验一个数为正,为负或为零? 你能举出多少种不同的方法? 一是直接用CMP命令和0比较(CMP X,0 ),然后检验标志位CF,CF=1则X为负数,CF=0接着检验ZF,ZF=1则X为零,ZF=0则X为正数; 二是使用逻辑或移位运算,和0相比是否相等,用数和10000000相与,取出符号位判断,可区分正负。
页 第2
四、实验过程
流程图
源代码
data segment
array db 1,4,3,2,5,7,-1,-2,-6,0,0,0;自定义数组 length EQU $-array ;数组长度 pnum db ? ;正数个数 nnum db ? ;负数个数 zero db ? ;零的个数 peven db ? ;正偶数个数 podd db ? ;正奇数个数 neven db ? ;负偶数个数 nodd db ? ;负奇数个数
POSICHAR DB 'Positive: $';用于打印字符串定义 NEGTCHAR DB 'Negtive: $'
页 第3
ZEROCHAR DB 'Zero: $'
EVENCHAR DB ' Even: $'ODDCHAR DB ' Odd: $' CR DB 0DH,0AH,'$'; 回车换行的ASCII码 data ends
;-------------------------------------------------------- code segment
assume cs:code,ds:data start:mov ax,data
mov ds,ax
mov si,offset array ;offset指令取array的偏移地址 dec si ;偏移地址先减1 mov cl,length ;数组长度赋予CL xor al,al
lop:cmp cl,0 ;余下数组长度不为0,则继续循环
je print;cl为0跳出循环
inc si;偏移地址加1,比较下一位数字 dec cl;余下数组长度减1
mov bl,[si];采用寄存器间接寻址方式 cmp bl,0;和0比较 jg posi;正数跳转 jz zo;零跳转 jl neg;负数跳转
posi:inc pnum;正数个数加1
test bx,01h;检测最后一位是否是0 jz pep;是0,即为偶数则跳转至pep inc podd;不是0,则正奇数个数加1 jmp lop
pep:inc peven;正偶数个数加1
jmp lop
zo:inc zero;零的个数加1
jmp lop
neg:inc nnum;负数个数加1
test bx,01h;检测最后一位是否是0 jz nep;是0,即为偶数则跳转至nep
页 第4
相关推荐: