微机原理实验报告清零程序.docx
《微机原理实验报告清零程序.docx》由会员分享,可在线阅读,更多相关《微机原理实验报告清零程序.docx(9页珍藏版)》请在冰豆网上搜索。
微机原理实验报告清零程序
竭诚为您提供优质文档/双击可除
微机原理实验报告清零程序
篇一:
微机原理实验报告
微机原理与应用课程实验报告
实验分工:
报告人
同组人
实验时间:
20XX.12.10
课程设计
一、题目要求
(1)在数据段首址为0100h开始的内存区1按从大到小的顺序顺次存入二进制数15~0共16个字节的数据;
(2)将上述源区内容传送到目的内存区2(首址为1100h)中;
(3)检验上述传送过程是否正确,如有错误,在紧跟内存区2后的第一个字节
开始写入AscII码“eRRoR”,否则写入“oK”。
(4)用冒泡法将上述内存区2的数据,按从小到大的次序重新排列,排列后存放在内存区3(开始地址为2100h)。
(5)将上述内存区2和内存区3的第100个数据分别乘以2,并转为bcD码,保存在各自存储区的末尾。
再将上述两个bcD码相乘,其结果保存在内存区1的末尾处。
二、实验程序框图
三、程序代码
codesegment
assumecs:
code
DATA1db16dup(?
)
DATA2dbeRRoR
DATA3dboK
;在数据段首址为0100h开始的内存区1按从大到小的顺序顺次存入二进制数15~0共16个字节的数据
start:
movax,0100h;规定目标程序存放单元的偏移量
movds,ax;数据段地址
moves,ax
movsi,offsetDATA1;偏移地址
movcx,0010h;循环次数
movbx,0100h
moval,ofh
s1:
movcs:
[si],al
mov[bx],cs:
[si]
incsi
incbx
decal
loops1
nop
;将内存区1数据搬移到内存区2中
movcx,16
movsi,0100h
movbx,1100h
s2:
moval,[si]
mov[bx],al
incbx
loops2
nop
;对比内存区1的数据与内存区2的数据是否相同mov
cx,16
movsi,0100h
movbx,1100h
comp:
movax,[si]
movdx,[bx]
cmpax,dx
jneerro
incsi
incbx
loopcomp
;数据如果都相同,说明上述传输过程正确movsi,offsetDATA3
movdi,1110h
movbl,0
movcx,2
enteroK:
movbl,cs:
[si]
mov[di],bl
incsi
incdi
loopenteroK
nop
jmps3
;如果有一个数据不相同,说明上述传输过程不正确
err:
movsi,offsetDATA2
movdi,1110h
movbl,0
movcx,5
entereRR:
movbl,cs:
[si]
mov[di],bl
incdi
loopentereRR
;将内存区2数据搬移到内存区3中
s3:
movsi,1100h
movcx,0010h
movbx,2100h
moval,0
movcx,16
fil:
moval,[si]
mov[bx],al
incsi
incbx
loopfil
nop
;用冒泡法将内存区3的数据按从小到大重新排列s4:
movbl,0
movcx,16
movsi,2110h
decsi
deccx
again:
moval,[si]
cmpal,[si-1]
jaenext
xchgal,[si-1]
mov[si],al
movbl,1
next:
decsi
loopagain
cmpbl,0
jnestart1
nop
movsi,1109h
moval,[si]
movcl,2
mulcl;结果在al中
movdx,0
movbx,10
divbx
shlal,4
addal,dl;把二进制数转换成bcD码mov[1112h],al
movsi,2109h
moval,[si]
movcl,2
mulcl;结果在al中
movdx,0
movbx,10
divbx
shlal,4
addal,dl;把二进制数转换成bcD码mov[2110h],al
;两个bcD码相乘,其结果保存在内存区1的末尾处。
movsi,1112h
movah,[si]
movcl,4
shrah,cl
moval,ah
movdl,10
muldl;结果在al中
movdl,[si]
篇二:
微机原理实验报告
华北电力大学
科技学院
课程名称:
微机原理实验学生姓名:
牛玺童班级:
电气
学号:
实验报告11k6111904010415
实验一数据转换实验
一、实验目的
(1)初步掌握在pc机上建立、汇编、链接和运行8086/88汇编语言程序的过程。
(2)通过对两个验证性试验的阅读、调试、掌握不同进制数及编码相互转换的程序设计方法。
(3)完成程序设计题,加深对数码转换的理解,了解简单程序设计方法。
二、实验内容
1.十六进制数转换为AscII码
设二字节十六进制数存放于其实地址为3500h的内存单元中,把他们转换成AscII码后,再分别存入起始地址为350A的四个内存单元中。
从书上AscII码表中可知十六进制数加30h即可得到0h~9h的AscII码,而要得到Ah~Fh的AscII码,则需再加7h。
请根据所给流程图理清思路,总结出对应的若干要点。
将流程图与参考程序相互。
根据分析的结果将运行时内存的变化列写出来。
学习并使用mAsm或wAVe仿真软件分析程序运行过程中相关寄存器及相应内存的变化情况来验证自己的猜想,以巩固命令的学习,提高编程能力。
1.1程序流程图
图1-1-1
1.2实验程序
DATAssegmenT
;此处输入数据段代码
DATAsenDs
sTAcKssegmenT
;此处输入堆栈段代码
sTAcKsenDs
coDessegmenT
Assumecs:
coDes,Ds:
DATAs,ss:
sTAcKs
sTART:
moVAx,DATAs
moVDs,Ax
;此处输入代码段代码
moVcx,0004h;根据转换个数设定循环次数
;(两字节十六进制数如6b2c对应有四个用十六进制表示的AscII码表示,即四个字节)
moVDI,3500h;指向该两字节十六进制数起始地址,此时在调试窗口修改内存字节
moVDx,[DI];将地址3500h中的内容(6b2c)给Dx
A1:
moVAx,Dx;第一次时Dx=6b2c,
;因为想顺序取c、2、6、b,所以需要一个中间变量AnDAx,000Fh;取低四位,第一次取到c,
cmpAL,0Ah;判断AL属于0~9,还是A~F
JbA2;如果是0~9,则跳转到A2
ADDAL,07h;若属于A~F,再加上07h后也是再加上30h即得到转换。
A2:
ADDAL,30h;0~9的AscII码对应的十六进制比其
;本身(注意:
亦是十六进制)大30h
moV[DI+0Ah],AL;将转码后的c,即43h给350A
IncDI;将DI指向下一字节,用于存储转码后的值,第一次自增后要存?
2?
pushcx;功能是接下来要用到cx作为一个中间变量,
;而刚才已经使用并且接下来还会用到cx的值,
;也可以不用cx,用其他不用的寄存器或者直接立即数形式的。
moVcL,04h;若直接用立即数,可能不稳定,(原因不详)用一个中间变量。
shRDx,cL;右移四位,如第一次转码后,Dx=6b2c,;为下一次取低四位的2做好前提,将0010b移到低四位popcx;执行完后,cx又用于计数LoopA1;每一次转码后,执行完此句后,cx的值都要变化,;分别是3,2,1,0;正好四次。
moVAh,4chInT21h
coDesenDs
enDsTART
1.3实验过程与心得
1.3.1编程要点
1.数据在内存空间中的存储情况要清晰;
图1-1-2图1-1-3
如上图所示图1-2为处理前的存储情况,通过调试中的内存修改来实现并检查,图1-3为最后期待的转码结果,通过查询内存来检查。
2.基本功能的实现:
分两种情况去转码。
中间涉及到比较选择语句,可以通过标志位来理解学习Jb的实现条件是由于标志位的变化。
3.取与存两个“指针”的变化
篇三:
微机原理软件实验报告
信息与通信工程学院
微机原理软件实验报告
班级:
姓名:
班内序号:
学号:
日期:
实验一Debug的使用
一、实验目的:
1.掌握汇编程序的编辑,编译,连接和执行的全过程;
2.学习和掌握用Debug调试程序的方法.
二、实验内容:
1.用编辑软件,输入以下汇编语言源程序:
DATsegmenT
ADb20;(自定)
bDb15;(自定)
YDb3Dup(0)
ZDb0,0
DATenDs
sTAsegmenTsTAcK
Dw50Dup(?
)
sTAenDs
coDsegmenT
Assumecs:
coD,Ds:
DAT
sTARpRocFAR
pushDs
xoRAx,Ax
pushAx
moVAx,DAT
moVDs,Ax
moVAx,sTA
moVss,Ax
moVAL,A
moVZ,AL
moVZ+1,AL
cALLsub1
moVAL,b
moVZ,AL
moVZ+1,AL
cALLsub1
moVAL,A
moVZ,AL
moVAL,b
moVZ+1,AL
cALLsub1
ADDwoRDpTRY,Ax
ADcbYTepTR[Y+2],0
sTARenDp
sub1pRoc
moVAL,Z
moVAh,Z+1
muLAh
ADDwoRDpTRY,Ax
ADcbYTepTR[Y+2],0
ReT
sub1enDp
coDenDs
enDsTAR
2.通过编译,连接形成可执行文件.
3.用Debug将可执行文件调入,并进行调试.
(1)用D命令观察数据区在内存中的具体内容,记录单元A和b的具体地址.
(2)用u命令对目标代码反汇编,观察反汇编后的结果.注意发现源程序的起始位置,并记录这个起始地址.
(3)用T命令作单步跟踪调试.比较每条指令执行后的结果和原来的理解是否一致.得出程序运行的结果:
它们是写在什么单元,具体内容是什么;并判断结果是否正确.
(4)在子程序sub1的入口处设一断点,用g命令执行程序.在断点处观察堆栈的内容,比较堆栈的内容和程序返回地址是否一致.
(5)用e命令修改单元A,b的内容,重新执行程序,并记录结果.
(6)用m命令和A命令对程序进行修改:
将主程序中最后两条指令(ADD和ADc)修改为一条cALLsub1指令,重新执行程序.
(7)退出Debug.
4.重新使用编辑软件,把源程序最后一句中的sTAR去掉.再次生成可执行文件,并用Debug调入内存.当使用u命令时,显示的结果与前一次(未加sTAR)的结果有何不同?
三、预习题:
1.熟悉常用的Debug命令.
2.阅读并分析程序的功能.
3.若ss=2000h,sp=FFFFh,向堆栈中压入4字节数据后,如何用D命令显示
压入堆栈的内容?
答:
使用debug指令“d2000:
0000”即可显示压入堆栈的内容,这是因为sp+1会溢出,变成0000。
四、实验过程
如上图,通过masm和link命令程序编译连接成功。
进入debug中,用u命令查看反编译结果。
得出A的地址为:
0b88:
0000,值为1bh,即十进制的27D;b的地址为:
0b88:
0001,值为33,即十进制的51D。
Y的偏移地址为0002h,Z的偏移地址为0005h
。
DATA段基地址为0b88h。
sub1子程序段入口地址为003F。
如上图所示,用e命令将A和b的值由1eh,33h改为10h,20h,通过d命令重新查看A,b的数值,发现改变成功。
通过u命令查看反汇编结果,在cALLsub1即cALL003F处设置一个断点,单步调试。
上图为用t命令单步运行结果,执行sub1之后返回主程序时cs为
0b88
,
Ip为001A,压入堆栈的Ip值已经弹出,cs,Ip已经指向下一条指令。