北邮微机原理实验报告Word格式文档下载.docx
《北邮微机原理实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《北邮微机原理实验报告Word格式文档下载.docx(26页珍藏版)》请在冰豆网上搜索。
datasegment
buffdw1,2,0,0,-1;
数据段,初始化数据
countequ$-buff
plusdb?
;
定义三种数的存储位置
zerodb?
minusdb?
string1db'
plusnumber:
'
'
$'
string2db'
zeronumber:
string3db'
minusnumber:
dataends
stacksegmentstack'
stack'
db100dup(?
)
stackends
codesegment
assumecs:
code,ds:
data,es:
data,ss:
stack
begin:
movax,data
movds,ax
movcx,count
shrcx,1
movdx,0
movah,0
leabx,buff
again:
cmpwordptr[bx],0;
首先和0比较
jgeplu
incah;
小于零MINUS+1
jmpnext
plu:
jzzer;
判断是否等于零,等于零ZERO+1
incdl;
不等于零PLUS+1
zer:
incdh
next:
incbx;
下一个数
incbx
loopagain
adddl,48
movplus,dl
adddh,48
movzero,dh
addah,48
movminus,ah
show:
subdx,dx;
显示模块
movdx,offsetstring1
送显示指令movax,0900h
int21h
movdl,[plus]
movax,0200h
movdl,0dh
movdl,0ah
movdx,offsetstring2
movax,0900h
movdl,[zero]
movdx,offsetstring3
movdl,[minus]
movax,4c00h;
结束程序
int21h
codeends
endbegin
五、给出程序运行结果(运行结果抓屏保存)
datasegment中存入1,2,0,0,-1
显示有2个0、2个大于0的数、1个小于0的数,结果正确
六、预习题
1.十进制数0--9所对应的ASCII码是什么?
如何将十进制数0-9在屏幕上显示出来?
答:
对应的ASCII码是30H~39H,把0-9加上30H即可得到对应的ASCII,送给DL,再执行INT21H即可显示。
2.如何检验一个数为正,为负或为零?
你能举出多少种不同的方法?
1先判断是否大于等于零,否则为负数,是则判断是否等于零,否则为整数。
2.判断ZF标志位,为零则循环左移一直判断,为1为负,为0为正
七、实验总结、建议要求、心得体会
之前小学期中已经用汇编语言编写过比较大型的程序,但是是在编译器中运行,比较容易查错,而且显示、输入等功能都是调用硬件实现,因此很多经验不能照搬,遇到了很多问题,我发现汇编语言对程序内部存储器等的利用虽然比C语言麻烦,但是都是真正可以控制、可以调用显示的,可以直接DEBUG看到内存空间,非常直观。
由于在程序中存在很多条件跳转语句,所以需要在最初设计时就考虑好各种分支情况,在画好程序流程图之后,程序的编写工作变得简单了很多,简化了编写代码过程中的思考过程。
实验三代码转换程序设计
1.掌握几种最基本的代码转换方法;
2.运用子程序进行程序设计.
1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来.
2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明.
3.对输入要有检错措施,以防止非法字符输入,并有适当的提示.
4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图.
开始
初始化Y开始N
键盘输入两个字符,存储在连续空间检测输入是否正确
Y与MIN比较,刷新最小值N输入空格
Y.输入结束符Y
显示提示输入输入子函数单字符输入
调用检验子函数输入是否合理YY
输入回车结束调用排序子函数调用显示子函数
NERROR!
注:
本程序段中中断字符为空格结束字符为回车
datasegment;
数据段初始化
mindb'
9'
string0db0dh,0ah,'
PLEASEINPUTSOMEINTEGERS.DEVIDEDwithSPACE.STOPwith
ENTER'
0dh,0ah,'
string1db0dh,0ah,'
ERROR!
PLEASEINPUTAGAIN!
string2db0dh,0ah,'
THEMINESTNUMBERIS:
STACKSEGMENTSTACK'
STACK'
DB100DUP(?
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
INPUTPROCNEAR;
输入子函数
MOVAH,01H
INT21H
ret
inputendp
test1procnear;
测试输入是否为数字子函数
cmpal,'
0'
jberror
jaerror
jmpexit
error:
moval,0;
输入不为数字返回0
exit:
test1endp
start:
movdx,offsetstring0
round:
循环主体
输入第一个数callinput
calltest1
cmpal,00h
;
错误提示jzwrong1
movbh,al;
存储
输入第二个数callinput
jzwrong1
movbl,al
callinput
输入是否结束cmpal,0dh
输入结束转移到显示jzshow
输入分隔符,开始比较cmpal,'
'
jzcompare
jmpwrong1
wrong1:
movax,0900h
jmpround
比较并刷新compare:
cmpbx,WORDPTRminMIN
jbchange
change:
movwordptrmin,bx
显示子函数show:
cmpbx,WORDPTRmin
jbswap
movwordptrmin,bxswap:
movdx,offsetstring2outt:
movdl,min+1
movax,0200h
movdl,min
movax,4c00h
endstart
结果讲解:
第一次由于输入了三位数,所以报错;
第二次由于输入字母,所以报错;
第三次输出正常结果,运行成功。
六、回答预习题
1.如何将输入的两个字符(0~9)变为十进制或二进制数?
减30H。
2.如何将选出的最小值(二进制或十进制)变为ASCII码再进行显示?
直接存储输入的ASCII,不需要转换。
如要转换则加30H。
你觉得采用二进制运算还是十进制运算更适合于这个实验?
二进制运算,直接保存输入的数的二进制编码,直接比较,不需要区分十位个位。
练习了调用子函数,发现子函数调用的PROCNEAR必须和子函数名同一行显示,不然程序会报错,还有不能把存储器操作数作为目的操作数,一定要通过寄存器转换。
汇编语言有很多需要注意的语法细节,应该多多练习。
实验四子程序设计
一、实验目的
1.进一步掌握子程序设计方法;
2.进一步掌握基本的DOS功能调用.
1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入.
2.统计检查每个学生的名次.
3.将统计结果在屏幕上显示.
4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽可能考虑美观.
5.输入要有检错手段.
结束
datasegment;
buffdw20dup(0000h);
存放成绩
buff1dw20dup(31h,32h,33h,34h,35h,36h,37h,38h,39h);
存放学号
count1db0;
存放输入了几个数
count2db0
PLEASEINPUTSCORES'
THERANK:
string3db0dh,0ah,'
NUMBER:
INPUTPROCNEAR;
moval,0
save1procnear;
存储输入的第一个数子函数,存在高位
leasi,buff
movcx,0
movcl,count1
addsi,cx
addsi,1
mov[si],al
;
40
inccl
movcount1,cl
ret
endpsave1
save2procnear;
存储输入的第二个数子函数,存在低位leasi,buff
movcx,0
movcl,count1
addsi,cx
decsi
endpsave2
比较两个数大小并完成交换子函数compareprocnear
cmpax,bx
jmpexit0
movch,0
leasi,buff
addsi,dx
mov[si],bx
addsi,2
mov[si],ax
leasi,buff1
movax,[si];
交换成绩同时交换学号
movbx,[si]
subsi,2
exit0:
compareendp
主程序入口movax,datastart:
movds,ax
movdx,offsetstring0
movax,0
callinput;
输入第一个数
calltest1;
测试
cmpal,00h
jzwrong1;
错误提示
callsave1
输入第二个数
calltest1
jzwrong1
callsave2
callinput
cmpal,0dh
jelist;
输入结束进入排序
jeround
jmpwrong1
movdx,offsetstring1
movah,09h
movcl,0
movcount1,cl
jmpround
list:
shrcl,1
movcount2,cl
deccl
jzshow
order:
movcl,0;
冒泡排序法外层循环
order1:
leasi,buff;
冒泡排序法内层循环
movdh,0
movdl,cl
shldl,1
addsi,dx;
100
movax,[si]
addsi,2
movbx,[si]
callcompare
cmpcl,count1
jeorder2
jmporder1
order2:
jnzorder
jmpshow
movdx,offsetstring4;
显示名次
movah,09h
movah,02hshow0:
leasi,buff2
movcl,count2
show00:
incsi
movdl,[si]
incsi
movdl,'
deccl
jnzshow00
显示学号show1:
movdx,offsetstring3
movah,02h
show2:
movdl,[si]
decsi
movdl,'
jnzshow2
show3:
movdl,0dh;
显示成绩int21h
movdx,offsetstring2
incsishow4:
jnzshow4
movax,4c00h
五、给出程序运行结果
第一次输入三位数提示错误;
第二次输出字母提示错误;
第三次输入正确,显示名次,学号,分数。
1.如何确定一个学生在这门科目中的名次?
根据输入成绩进行排序
2.你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单?
冒泡排序法
3.模块层次图.
输入模块测试输入是否正确模块
键盘输入
存储模块
显示屏显示
排序模块显示模块
给出输出显示的形式.4.答:
第一行显示名次
第二行显示学号
第三行显示成绩
本次实验加深了我对汇编语言的理解,更加熟练的掌握汇编语言的用法,熟练了各种DEBUG的方法,尤其注意在对存储器内容改写时可以用SI寄存器,汇编的寄存器数量比较少,不像C等语言可以自己定义变量,要注意寄存器的合理利用,不注意的的话可能在程序中随意修改他们的值,导致程序混乱不好调试。
总的来说,本次实验十分有意义。