北理bit微机原理上机软件实验报告Word文件下载.docx
《北理bit微机原理上机软件实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《北理bit微机原理上机软件实验报告Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
1.1编写程序求出10个数中的最大值和最小值
由于一共有十个数,所以求其最大数或者最小数需要比较9次。
从数据段的段首开取数,先取两个数进行比较,比较完后取其中的最大数或者最小数放入数据段的第二位中。
再取第三位数与第二位数比较,如此循环,比较9次后在数据段最末位的就是我们需要的数。
1.2求1到100的累加和,并用十进制形式将结果显示在屏幕上
求和部分:
1~100一共有100个数,所以需要做100次加法。
做加法要有两个数,第一个数是第i位的数值,第二个数是i-1位以及之前所有数的和,所以这两个数必须分别存放在两个寄存器里,并且两个数相加之后的所得的值,必须放在存放“和”的寄存器中,另外一个寄存器每做完一次加法自加1。
显示部分:
我们所求得的最终数值在内存中是以16进制数存放的,但是由于结果只是一个数,我们可以把它的每一位所对应的ASCII码按照一定的顺序存放到一个数据段中,再以字符串形式直接输出。
1.3将存储器中的十个字节型十六进制有符号数按从小到大的顺序排序并按十六进制显示出来
比较部分:
题目一共给了我们10个数,如果要进行排序的话可以先把十个数中最大的数选出来,放到数据段的最后一个位置,接着再选出次大的数放到数据段的倒数第二位,如此循环到最后便可成功将所给的十个数排序好。
我们所求得的最终数值在内存中是以16进制数存放的,如果想要显示16进制数就必须要把所得数的每一位ASCII码求出来放入DL中。
2、流程图
2.1编写程序求出10个数中的最大值和最小值
Y
N
2.2求1到100的累加和,并用十进制形式将结果显示在屏幕上
2.3将存储器中的十个字节型十六进制有符号数按从小到大的顺序排序并按十六进制显示出来
四、实验源程序
1、编写程序求出10个数中的最大值和最小值
DATASEGMENT;
定义数据段
DATA1DB12H,23H,34H,45H,56H,67H,78H,89H,9AH,0FDH;
定义十个数
MAXDB0
MINDB0
DATAENDS;
数据段定义完毕
CODESEGMENT;
定义代码段
ASSUMECS:
CODE,DS:
DATA
EXP1PROCFAR;
设定为子函数,可以远
程调用
START:
MOVAX,DATA
MOVDS,AX;
初始化DS
LEASI,DATA1;
将SI指向DATA1
LEADI,MAX;
将DI指向MAX
MOVAH,[SI]
MOVAL,[SI+1];
取出DATA1的前两个数
CALLCASE1;
调用子函数CASE1
MOVAH,0
MOV[DI],AX;
将最大数存入MAX中
LEADI,MIN;
将DI指向MIN
CALLCASE2;
调用子函数CASE2
将最小数存入MIN中
MOVAH,4CH
INT21H;
返回DOS
RET;
远程调用返回
CASE1PROC;
子程序CASE1(查找最
大数)
MOVCX,10;
设定比较次数
GO1:
MOVAH,[SI];
取出SI所指定的数放
入AH
CMPAL,AH;
比较AH与AL
JAGO2;
如果AL大于AH则跳转
到GO2
MOVAL,AH;
若AL小于AH则将AH
放到AL中
INCSI;
修改指针,将指针指向
取DATA1中的下一个数
LOOPGO1;
循环比较10次
JMPEND1;
循环完成
GO2:
END1:
RET;
循环完成,得到最大值
并存在AL了中返回主
程序
CASE1ENDP;
子程序CASE1结束
CASE2PROC;
小数)
XORAX,AX;
将AX清零,以便存数
比较
SI指向DATA1
MOVAL,[SI];
取出第一个数
GO3:
比较DATA1中的两个数
JBGO4;
小于则跳转
大于则把较小数放于AL
修改指针指向下一位
LOOPGO3;
循环比较
JMPEND2;
GO4:
END2:
循环完成,得到最小值
CASE2ENDP;
子程序CASE2结束
EXP1ENDP;
远程调用完成并返回
CODEENDS;
代码段结束
ENDSTART;
汇编结束
2、求1到100的累加和,并用十进制形式将结果显示在屏幕上
DATASEGMENT;
DATA1DW?
;
定义字形变量存放累加
和结果
RESULTDB4DUP(?
),0DH,0AH,'
$'
定义数组以便输出
CODESEGMENT;
DATA,ES:
MOVDS,AX;
MOVCX,100;
设置累加次数
XORAX,AX
XORBX,BX;
清空两个寄存器以便用
于计算
INCAX;
AX为第N个数
ADDBX,AX;
BX为N-1个数的累加和
相加100次
MOV[SI],BX;
所得结果放入DATA1
MOVCX,4;
设定循环次数求结果每
一位的ASCII码
LEADI,RESULT;
将DI指向RESULT
XORDX,DX
MOVAX,DATA1
MOVBX,0AH
AGAIN:
DIVBX
ADDDL,30H
MOV[DI+3],DL
DECDI
MOVDL,0
LOOPAGAIN;
取得结果每一位数的十
进制ASCII码并存放于
RESULT中
LEADX,RESULT
MOVAH,09H
结果以十进制显示
INT21;
ENDSTART;
3、将存储器中的十个字节型十六进制有符号数按从小到大的顺序排序并按十六进制显示出来
数据段定义
DATA1DB56H,0FFH,78H,82H,12H,0,95H,58H,0BCH,34H;
定义要比较的数
数据段定义结束
CODESEGMENT;
代码段定义
远程调用定义
LEASI,DATA1
MOVBH,9;
设置外循环比较次数
MOVDI,SI;
重新开始从第一位开始
MOVBL,BH;
设置内循环比较次数
MOVAH,[DI]
MOVAL,[DI+1]
CMPAH,AL;
比较DATA1中某前后两
位的大小
JNLGO3;
大于跳转
JMPGO4;
小于跳转
MOV[DI+1],AH
MOV[DI],AL;
大于则改变两者位置
跳转
INCDI;
将指针指向下一位数
DECBL
JNZGO2;
判断内循环是否完成
DECBH
JNZGO1;
判断外循环是否完成
MOVCX,10
DISP1:
MOVAL,[SI]
ANDAL,0F0H
RORAL,4
ADDAL,30H
CMPAL,'
9'
与‘9’判断
JBEDISP2
ADDAL,07H;
大于则加07H
DISP2:
MOVDL,AL;
小于直接显示
MOVAH,2
显示某一位数高位16
进制的ASCII码
MOVAL,[SI]
MOVBL,16
DIVBL
ADDAH,30H
CMPAH,'
JBEDISP3
ADDAH,07H
DISP3:
MOVDL,AH
显示某一位数低位16
MOVDL,'
H'
显示‘H’
'
显示‘’(空格)
LOOPDISP1;
逐个显示
远程调用返回
远程调用结束
五、实验运行结果
编译
连接
运行
连接
运行
六、实验中遇到的问题以及解决方法
在这几次的编程实验中,我遇到的问题主要有两个:
1.运行程序后所得到的结果不是我想要的结果
2.不懂得如何输出自己所得到的结果
其解决方法为:
1.通过使用ide86中的单步运行功能单步运行自己的程序,最终找到某一步运行时出现偏差,对那一步的语句进行改正。
2.这个没有其他的办法可以解决,只能先抄写课本上所给的程序,当出现自己想要的结果之后,再与同学讨论输出结果的语句,充分理解其内涵。
七、心得体会
通过此次的上机实验课,我懂得了如何使用ide86来调试自己编写的程序:
首先需要通过ide86来创建一个.ASM文件。
然后对其进行编译和连接。
当完成上述过程后,我们便可以使用DEBUG功能来对程序进行调试:
在该界面中,我们可以从View菜单中调出CPU栏,这样,我们就可以清楚地看到每一步运行时各个寄存器的状态了。
同时,通过使用ide86,我能够更好地理解课本中的许多程序,也能够自己编写一些程序。
总而言之,通过这些次的上机实验课,我学会了如何运用ide86来处理自己在理论课学习上遇到的各种问题。