东华大学微机实验报告复习资料软件3000字.docx
《东华大学微机实验报告复习资料软件3000字.docx》由会员分享,可在线阅读,更多相关《东华大学微机实验报告复习资料软件3000字.docx(26页珍藏版)》请在冰点文库上搜索。
东华大学微机实验报告复习资料软件3000字
实验一debug的启动及其基本命令的使用实验二内存操作数及寻址方法实验三汇编语言程序的调试及运行实验四查表程序设计实验五系统功能调用实验六分支程序设计实验七循环程序设计实验八子程序设计实验九综合程序设计实验心得体会参考文献
实验一debug的启动及其基本命令的使用
源程序:
(指导书中给出)
datasegment
string1dbmovethecursorbackwardstring2dbmovethecursorbackwardmess1dbmatch.,13,10,$mess2dbnomatch.,13,10,$dataends
stacksegmentstackdb40dup(?
)stackends
prognamsegment
assumecs:
prognam,ds:
data,es:
data,ss:
stack
mainprocfarstart:
pushdsxorax,axpushax
movax,datamovds,axmoves,axmovax,stackmovss,ax
leasi,string1leadi,string2cld
movcx,25repzcmpsbjzmatch
leadx,mess2jmpshortdispmatch:
leadx,mess1disp:
movah,09hint21hret
mainendpprognamendsendstart
运行结果:
用debug调试将输出字符串改为‘nomatch’
用e指令修改“backward”为“forward”
再次用d命令查看修改结果。
用g命令运行程序
实验二内存操作数及寻址方法
1、
(1)程序说明:
设堆栈指针sp=2000h,ax=3000h,bx=5000h;请编一程序段将ax和bx的内容进行交换。
请用堆栈作为两寄存器交换内容的中间存储单元,用字处理程序编辑程序。
(2)调试说明:
对sp的地址分配不到2000,计算机自动分配为0000,此时我就人为的把堆栈的首地址定义为2000。
(3)写出源程序清单和执行结果:
源程序:
stacksegmentstackdw100dup(0)stackendscodesegment
assumess:
stack,cs:
codestart:
movax,3000hmovbx,5000hmovsp,2000h
pushax;将ax中的内容压栈movax,bx;bx中的内容给axpopbx
movah,4chint21hcodeends
endstart
用debug调试结果:
2、程序说明:
用masm和link对以下程序进行汇编和连接,调试程序在debug调试程序状态下进行。
用单步执行的方法,分析每条指令源地址的形成过程,当数据传送完毕时,ax中的内容是什么。
源程序:
datasegmentorg0300h
adb12h,23h,34h,45h,56h,67h,78h,89h,9ahdataends
prognamsegment
assumecs:
prognam,ds:
datastart:
movax,datamovds,ax
movbx,0300h
movax,0300h;立即数寻址
movax,[0300h];存储器寻址方式中的直接寻址方式movax,[bx];寄存器间接寻址movsi,2
movax,0001[bx];基址寻址movax,[bx][si];基址加变址
movax,0001[bx][si];带偏移量的基址加变址movah,4chint21hprognamendsendstart
用debug调试结果:
实验三算术运算指令
1、程序说明:
编写三个完整的汇编语言源程序,完成以下计算。
其中x、y、z、r、w均为存放16位带符号数单元的地址。
(1)z←w+(z-x)
(2)z←w-(x+6)-(r+9)
(3)z←(w*x)/(y+6),r←余数
2、调试说明:
当编译完成后,计算机未能生成.obj的文件,经检查错误发生在add使用上,我把两个寄存器操作数同时用在add语句里,结果出错了。
把add语句稍作写该后,程序运行正确。
3、写出源程序清单和执行结果
本实验我们只做前两个,即:
(1)z←w+(z-x);
(2)z←w-(x+6)-(r+9)
源程序:
(1)z←w+(z-x)
datasegment
xdd0001h
zdd0003h
wdd0005h
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movax,x
movbx,z
subbx,ax
movax,w
addbx,ax
movz,bx
movah,4ch
int21h
codeends
endstart
用debug调试结果:
源程序:
(2)z←w-(x+6)-(r+9)
datasegment
xdw0006h
rdw003ah
wdw0110h
zdw?
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movax,x
addax,6
movbx,r
addbx,9
movcx,w
sbbcx,ax
sbbcx,bx
movz,cxmovah,4ch
int21h
codeends
endstart
用debug调试结果:
实验四查表程序设计
1、程序说明:
用查表的方法将一位十六进制数转换成及它相应的ascii码,并将结果存放到asci单元中。
2、调试说明:
开始生成.obj文件时,调试不成功,以为是程序编译有误,后经再三检查都未发现错误,这时只好从头做检查,结果发现了错误:
从本实验有的提示语段中拷贝过来的语句书写有误,即符号的书写为中文书写,以至于整个程序未能通过编译。
把中文书写修改为英文书写后,编译成功。
3、源程序清单和执行结果:
源程序:
datasegment
tabledb30h,31h,32h,33h,34h,35h,36h,37h
db38h,39h,41h,42h,43h,44h,45h,46h
hexdb08h
ascidb?
dataends
codesegment
assumeds:
data,cs:
code
start:
movax,data
movds,ax
movbx,offsettable
moval,hex;查找对象的下标存在al中
xlat
movasci,al
movah,4ch
int21h
codeends
endstart
用debug调试结果:
实验五系统功能调用
1、程序说明:
试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。
2、调试说明:
在debug显示字符窜时,曾显示乱码,未能按预期显示,经检查发现在编译字符窜时出现错误,因为调用21h中断输出一串字符要求用$结尾,我没用上‘$’。
还有,键盘输入字符是被存放在ax内,当要多次使用ax时应该把输入内容另存一地址
3、源程序清单和执行结果:
源程序:
datasegment
db?
dataends
stacksegmentstack
db5dup(0)
stackends
codesegment
assumeds:
data,ss:
stack,cs:
code
start:
movax,data
movds,ax
movah,01h;从输入端读取字符
int21h
subal,20h;小写转换成大写
movdl,al
movah,02h;输出字符到终端
int21h
movah,4ch
int21h
codeends
endstart
运行结果:
实验六分支程序设计
1、实验说明:
假设有一组数据:
5,-4,0,3,100,-51,请编一程序,判断:
每个数大于0,等于0,还是小于0;并输出其判断结果。
即:
1.当x>0当x=0
当x<0
2、调试说明:
在最初的程序中,我使用了movbx,xx等语句,后来发现像这样的语句在实际使用中有些累赘,于是我便做了修改,简化了汇编语言。
其次,在调试中,发现符号无法显示的问题,于是采用两次显示符号的方法,较理想的解决了负号问题。
3
4、源程序清单和执行结果:
源程序:
datasegmentxxdb05h,0fch,00h,03h,64h,0cdh
y1dby=1,0dh,0ah,$
y2dby=0,0dh,0ah,$
y3dby=-1,0dh,0ah,$
dataends
stacksegmentstack
db10dup(0)
stackends
codesegment
assumeds:
data,ss:
stack,cs:
code
start:
movax,data
movds,ax
leasi,xx
movax,0
movcx,6
l1:
moval,[si]
cmpal,0;及0比较
jgbiger
jeequal
movdx,offsety3
movah,09h
int21h
jmpoutput
biger:
movdx,offsety1
movah,09h
int21h
jmpoutput
equal:
movdx,offsety2
movah,09h
int21h
output:
incsi
loopl1
movah,4ch
int21h
codeends
endstart
运行结果:
思考题:
程序中的原始数据是以怎样的形式存放在数据区中的?
请用debug调试程序观察并分析。
以补码形式存放
实验七循环程序设计
实验内容:
1.编制程序计算s=1+2?
3+3?
4+4?
5+?
?
+n(n+1)+?
?
直到n(n+1)大于200为止,并将结果由屏幕上显示出来。
其程序的流程图如图7.1所示。
2.将从3000h内存单元开始的100个字节存储单元全部清0。
本实验要求在debug调试状态下进行,包括汇编程序、运行程序、检查结果。
源程序:
(1)编制程序计算s=1+2?
3+3?
4+4?
5+?
?
+n(n+1)+?
?
直到n(n+1)大于200为止,并将结果由屏幕上显示出来。
datasegment
resultdw?
dataends
stacksegmentstack
db10dup(0)
stackends
codesegment
assumecs:
code,ds:
data,ss:
stack
start:
movdx,1
movbl,2
lp:
moval,bl
addbl,1
mulbl
adddx,ax;dx中存放sum和
cmpax,200
jgoutput
looplp
output:
movbx,dx
movcx,4
lp2:
rolbx,1;bl存放和,移位,从高到低一位一位显示rolbx,1
rolbx,1
rolbx,1
movax,bx
andax,000fh;取bl中低四位
xordx,dx
addal,30h;十六进制转换成ascii码加30h
cmpal,3ah;0—9数字及a—f的ascii码不连续
jbpit
addal,07h;若比a(10)大,还要再加07h
pit:
movdl,al
movah,02h
int21hlooplp2
movah,4ch
int21h
codeends
endstart
运行结果:
(2)将从3000h内存单元开始的100个字节存储单元全部清0。
本实验要求在debug调试状态下进行,包括汇编程序、运行程序、检查结果。
datasegment
org3000h
xdb100dup(?
)
dataends
stacksegmentstack
db10dup(?
)
stackends
codesegment
assumecs:
code,ds:
data,ss:
stack
start:
movax,data
movds,ax
leasi,x
movcx,100
lp:
andbyteptr[si],00h
incsi
looplp
movah,4ch
int21h
codeends
endstart
运行结果:
先将内存单元赋值,用debug的e指令赋值,用d指令查看内存中的数据
再运行程序,将内存单元全部清零
实验八子程序设计
1、程序说明:
编制一程序,要求键入一个班的学生成绩,并存放于50字的erade数组中,然后根据erade中的成绩,把学生名次填入50字的rank数组中,再按学号顺序把名次从终端上显示出来。
提示:
①程序main
功能:
根据输入的学生成绩,计算并显示出学生名次。
②子程序input
功能:
接收一个班级学生的成绩,各成绩之间用空格隔开。
③子程序rankp
功能:
计算一个班级学生的名次。
④子程序output
功能:
输出(显示)一个班级的学生名次
⑤子程序decibin
功能:
十进制转换二进制,存入bx
⑥子程序bindec
功能:
十进制转换二进制,并在屏幕上显示。
⑦子程序dec_div
功能:
bx的内容除以cx的内容,并在屏幕上显示一位商。
源程序:
datasegment
gradedw50dup()
rankdw50dup()
enterdbgrades:
24h;提示用户输入成绩
errordb13,10,error!
13,10,24h;用户输入的格式出错showdbrank:
24h
countdw0;统计输入的成绩个数
crdb13,10,24h;换行
dataends
stacksegmentstack
db400dup(0)
stackends
codesegment
assumecs:
code,ds:
data,ss:
stack
start:
movax,data
movds,ax
moves,ax
callinput
callrankp
calloutputmovah,01h
int21h
movax,4ch
int21h
;input程序段
;以学号为序从键盘输入一个班的学生成绩,各个成绩之间用逗号格开,最后以回车符结束。
;然后把一个班的成绩存入grade数组。
inputprocnear
leadx,enter
movah,9
int21h;提示用户输入
movsi,0
movcount,0;将输入用户的输入个数置0
_enter:
;对用户的输入进行监视,对错误输入立即进行出错处理calldecibin;调用decibin;对用户输入进行处理
inccount
cmpdl,,;及,比较,相同则保存成绩,不同出错je_store
cmpdl,0dh;及回车键进行比较,回车则成绩输入结束je_endenter
jne_error;出错处理:
显示出错信息
_store:
;保存成绩
movgrade[si],bx
addsi,2
jmp_enter
_error:
leadx,error
movah,9
int21h
_endenter:
;用户结束成绩输入
movgrade[si],bx
movdx,offsetcr;换行
movah,9
int21h
ret
inputendp
;rankp程序段
;从grade数组取得一个班的成绩,以学号为序计算出该班每个学生的名次存入rank数组。
;算法为:
一个学生的名次等于成绩高于该生的学生人数加1
rankpprocnear
movdi,count
movbx,0
_loop:
movax,grade[bx];取学生成绩
movwordptrrank[bx],0;初始化rank[bx]的值为0movcx,count
leasi,grade;第一个学生的成绩_next1:
cmpax,[si];比较两个成绩
jg_jump;成绩大于被比较的跳过incwordptrrank[bx]
_jump:
addsi,2;取下一个被比较成绩的地址loop_next1
addbx,2;下一个成绩
decdi;未比较成绩个数减1jne_loop
ret
rankpendp
;output程序段
;从rank数组取得一个班的学生名次。
把一个班的学生名次以学号为序在终端显示出来;调用子模块binidec,以便把rank数组中的二进制数转成十进制数并在终端上显示出来.调用子模块crlf完成回车,换行功能.
outputprocnear
leadx,show
movah,09h
int21h
movsi,0
movdi,count
_next2:
movbx,rank[si];将成绩保存到bx中callbinidec;调用binidec
movdl,,
movah,02hint21h;显示,
addsi,02h;取下一个成绩名次decdi
jnz_next2
movdx,offsetcr;换行
movah,9
int21h
ret
outputendp
;decibin程序段
;从键盘取得一个十进制数。
把该数转换成二进制数并存入bx寄存器中。
decibinprocnear
movbx,0
_catch:
movah,01h
int21h
movdl,al
subal,30h
jl_endchange;小于则结束sfvof=1cmpal,39h
jg_endchange;大于则结束
cbw
xchgax,bx;ax及bx值交换movcx,10
mulcx;无符号数乘法指令,(ax)<----(al)*(cx)
xchgax,bx
addbx,ax;(bx)<------(bx)+(ax)jmp_catch
_endchange:
ret
decibinendp
;binidec程序段
;把bx寄存器中的二进制数转换成10进制数,并在终端屏幕上显示出来。
调用dec_div来作除法运算并显示字符。
binidecprocnear
pushbx
pushcx
pushsi
pushdi;压栈
movcx,10
calldec_div;调用dec_div
movcx,1
calldec_div;调用dec_div
popdi
popsi
popcx
popbx;出栈
ret
binidecendp
;dec_div程序段
;把bx中二进制数除以相应的十的幂,并在屏幕上显示一位商。
余数保存在bx寄存器中。
dec_divprocnear
movax,bx
movdx,0
divcx
movbx,dx
movdl,al
adddl,30h
movah,02h
int21h;显示
ret
dec_divendp
codeends
endstart
运行结果:
1、思考题:
(1)写出4位bcd码转二进制数的算法。
设ax寄存器中存放着4位bcd码
bcdto2procnear
pushbx
pushcx
pushdx
movbx,ax;保存ax中的bcd码到bx
movax,0;结果单元清0
movcx,4;共处理4位bcd码
retry:
pushcx
movcl,4
rolbx,cl;最高1位bcd码移到bx中的低半字节popcx
mulw10;累加和axx10->dx:
axpushbx
andbx,000fh;取出bx中的1位bcd码
addax,bx;累加到ax中
popbx
loopretry
popdx
popcx
popbx
ret
bcdto2endp
(2)写出ax中进二制数转bcd码的算法。
w1000dw1000,100,10,1;十进制数千,百,十,个位权值;入口参数:
ax=二进制数。
出口参数:
ax=压缩bcd码
ax2tobcdprocnear
xorbx,bx;bcd码暂存单元清0
movsi,offsetw1000;权值首地址送si
movcx,4;循环次数4->cx
retry:
pushcx
movcl,4
shlbx,cl
movdx,0;dx:
ax组成被除数
divwordptr[si];除以权值,商,余数在ax,dx中
orbx,ax;压缩bcd码
movax,dx;余数送ax
popcx
addsi,2;地址加2,指向下一权值
loopretrymovax,bx;bcd码由bx->axret
ax2tobcdendp
实验九综合程序设计
设有十个学生成绩分别是76,69,84,90,73,88,99,63,100和80分。
试编制一个子程序,统计低于60分,60~69分,70~79分,80~89分,90~99分和100分的人数,并输出显示统计结果。
源程序:
datasegment
s1dbbelow60:
$
s2db60~69:
$
s3db70~79:
$
s4db80~89:
$
s5db90~99:
$
s6db100:
$
xxdb76,69,84,90,73,88,99,63,100,80
countequ$-xx
numberdb6dup(0);存放每个数据段的人数
enterdb0dh,0ah,$;回车换行
dataends
stacksegmentstack
db10dup(?
)
stackends
codesegment
assumecs:
code,ds:
data,ss:
stack
start:
movax,data
movds,ax
callgrade
callshow
movah,4ch
in