东华大学微机系统及原理实验报告.docx
《东华大学微机系统及原理实验报告.docx》由会员分享,可在线阅读,更多相关《东华大学微机系统及原理实验报告.docx(44页珍藏版)》请在冰豆网上搜索。
东华大学微机系统及原理实验报告
创作编号:
BG7531400019813488897SX
创作者:
别如克*
微机系统及应用实验
实验报告
实验一DEBUG的启动及其基本命令的使用
实验内容:
6:
设堆栈指针SP=2000H,AX=3000H,BX=5000H;请仿照例程的格式编一程序段将AX和BX的内容进行交换。
请用堆栈作为两寄存器交换内容的中间存储单元,用DEBUG调试程序进行汇编与调试。
写出在DEBUG状态下编写、运行步骤6所要求的程序过程(要求包含源程序)以及调试所中遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。
程序清单:
STACKSEGMENTSTACK
DB2003HDUP(0)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,SS:
STACK
START:
MOVAX,STACK
MOVSS,AX
MOVSP,2000H
MOVAX,3000H
MOVBX,5000H
PUSHAX
MOVAX,BX
POPBX
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
运行及调试:
进入调试后,运行正常。
进行反汇编调试:
通过追踪指令观察SP、AX、BX变化
可知对SP、AX、BX赋值正确。
将AX入栈后
用显示内存单元内容的命令D观察堆栈段中SP为1FFF,2000的内容
[1FFF]=00,[2000]=30说明已经AX=3000已经放入到堆栈段中。
结果可以看出:
AX=5000,BX=3000
结果完成正确!
实验二内存操作数及寻址方法
实验内容:
1、设堆栈指针SP=2000H,AX=3000H,BX=5000H;请编一程序段将AX和BX的内容进行交换。
请用堆栈作为两寄存器交换内容的中间存储单元,用字处理程序编辑程序,用masm.exe和link.exe对源程序进行汇编程和连接,用DEBUG调试程序。
2、用masm和link对以下程序进行汇编和连接,调试程序在DEBUG调试程序状态下进行。
用单步执行的方法,分析每条指令源地址的形成过程,当数据传送完毕时,AX中的内容是什么。
程序清单如下:
DATASEGMENT
ORG0300H
ADB12H,23H,34H,45H,56H,67H,78H,89H,9AH
DATAENDS
PROGNAMSEGMENT
ASSUMECS:
PROGNAM,DS:
DATA
创作编号:
BG7531400019813488897SX
创作者:
别如克*
START:
MOVAX,DATA
MOVDS,AX
MOVAX,BX
MOVAX,0300H
MOVAX,[0300H]
MOVAX,[BX]
MOVSI,2
MOVAX,0001[BX]
MOVAX,[BX][SI]
MOVAX,0001[BX][SI]
MOVAH,4CH
INT21H
PROGNAMENDS
ENDSTART
对源程序文件汇编,生成目标文件
将目标文件LINK后,生成可执行文件如下:
进入debug调试
单步追踪执行:
AX=0B91,为数据段的首地址。
AX不变,将数据段的首地址送至DS。
执行MOVAX,BX
AX同BX,清零。
执行MOVAX,0300H
AX=0300
执行MOVAX,[0300H]
AX=0300
可知MOVAX,0300H与MOVAX,[0300H]得到同样结果
AX均为0000.
将原文中的指令清单改为
DATASEGMENT
ADB12H,23H,34H,45H,56H,67H,78H,89H,9AH
ORG0300H
BDB0BH,0CH
DATAENDS
PROGNAMSEGMENT
ASSUMECS:
PROGNAM,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAX,BX
MOVAX,0300H
MOVAX,[0300H]
MOVAX,[BX]
MOVSI,2
MOVAX,0001[BX]
MOVAX,[BX][SI]
MOVAX,0001[BX][SI]
MOVAH,4CH
INT21H
PROGNAMENDS
ENDSTART
单步执行后:
创作编号:
BG7531400019813488897SX
创作者:
别如克*
可知:
随着程序进行,AX发生变化。
实验三算术运算指令
实验内容
编写三个完整的汇编语言源程序,完成以下计算。
其中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←余数
实验前要做好充分准备,包括汇编程序清单、调试步骤、调试方法,以及对程序结果的分析等
1、程序说明。
说明程序的功能、结构。
2、调试说明。
包括上机调试的情况、上机调试步骤、调试所遇到的问题是如何解决的,并对调试过程中的问题进行分析,对执行结果进行分析。
3、写出源程序清单和执行结果。
(1)Z←W+(Z-X)
汇编程序清单
DATASEGMENT
XDW10
ZDW20
WDW10
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAX,Z
SUBAX,X
ADDAX,W
MOVZ,AX
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
进入debug调试:
使用追踪指令T单步执行:
执行结果是将20放入AX中。
AX=0014H
执行结果AX=0014H-000AH=000A,结果正确。
执行结果显示:
AX=0014H,即为20,正确。
然后将结果保存至Z存储字中。
最后观察数据组中的数据;
显示为X=10,Z=20,W=10。
程序运行结果正确
(2)Z←W-(X+6)-(R+9)
汇编程序清单:
DATASEGMENT
WDW100
XDW20
RDW30
ZDW?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAX,W
MOVBX,X
ADDBX,6
SUBAX,BX
MOVBX,R
ADDBX,9
SUBAX,BX
MOVZ,AX
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
对程序进行汇编后调试:
单步执行:
创作编号:
BG7531400019813488897SX
创作者:
别如克*
此时,对DS的段基址赋值为数据组的首地址
此时,对AXBX分别赋值为100,20
(3)Z←(W*X)/(Y+6),R←余数
汇编程序清单:
DATASEGMENT
XDW10H
ZDW?
WDW10H
YDW3H
RDW?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAX,W
IMULX
MOVBX,Y
ADDBX,6
IDIVBX
MOVZ,AX
MOVR,DX
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
编译执行结果如下:
单步执行结果如下:
执行结果可得:
商的整数部分z所指向的字单元内容为001CH,余数本分R指向的字单元内容为0004H。
实验四查表程序设计
实验内容:
用查表的方法将一位十六进制数转换成与它相应的ASCII码,并将结果存放到ASCI单元中。
汇编程序清单:
DATASEGMENT
TABLEDB30H,31H,32H,33H,34H,35H,36H,37H
DB38H,39H,41H,42H,43H,44H,45H,46H
HEXDB0AH
ASCIDB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVBX,OFFSETTABLE
MOVAL,HEX
XLAT
MOVASCI,AL
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
对程序进行编译进入debug调试
使用t追踪指令观察数据变化
ASCI所指向的字节单元的内容正是十六进制数0AH的ASCII值41。
实验五系统功能调用
实验内容:
试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。
汇编程序清单:
CODESEGMENT
ASSUMECS:
CODE
START:
MOVAH,1
INT21H
SUBAL,20H
创作编号:
BG7531400019813488897SX
创作者:
别如克*
MOVDL,AL
MOVAH,2
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
对源程序编译并进入debug状态
调试结果正确。
实验六分支程序设计:
实验内容
假设有一组数据:
5,-4,0,3,100,-51,请编一程序,判断:
每个数大于0,等于0,还是小于0;并输出其判断结果。
即:
1当x>0
y=0当x=0
-1当x<0
汇编程序清单:
DATASEGMENT
TABLEDB5,-4,0,3,100,-51
GDB'1',13,10,'$'
ZDB'0',13,10,'$'
LDB'-1',13,10,'$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEASI,TABLE
MOVCL,6
COMP:
CMPBYTEPTR[SI],0
JGGREAT
JZEQUAL
LEADX,L
JMPSHORTDISP
GREAT:
LEADX,G
JMPSHORTDISP
EQUAL:
LEADX,Z
DISP:
MOVAH,9
INT21H
INCSI
LOOPCOMP
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
对源程序进行编译并进入调试状态
分布调试:
从结果可知:
经过第一次循环,DX所代表的要输出的字符串的地址0006H即为数据段中Z字符串的EA,所以输出内容为1。
且SI自增1,CL减1。
以下循环原理同上。
全部运行的:
程序运行正确。
思考题:
程序中的原始数据是以怎样的形式存放在数据区中的?
请用DEBUG调试程序观察并分析。
答:
程序中的原始数据是以补码的十六进制的形式存放在数据区中的。
实验七循环程序设计
实验内容与要求
1.编制程序计算S=1+2·3+3·4+4·5+……+N(N+1)+……直到N(N+1)大于200为止,并将结果由屏幕上显示出来。
其程序的流程图如图7.1所示。
2.将从3000H内存单元开始的100个字节存储单元全部清0。
本实验要求在DEBUG调试状态下进行,包括汇编程序、运行程序、检查结果。
程序框图
图7.1程序框图
实验步骤
实验内容一:
1)按程序流程图编制实验程序。
2)输入源程序。
3)汇编、连接程序,执行程序,检查结果。
实验内容二:
1)输入源程序并检查无误。
2)对内存单元3000H开始的100个存储单元用E命令输入任意数。
3)程序的执行可用DEBUG的G命令,也可用T命令单步跟踪执行。
4)用D命令检查执行结果。
实验内容1的程序清单:
DATASEGMENT
STRDB5DUP(0)
DB'$'
DATAENDS
CODESEGMENT
创作编号:
BG7531400019813488897SX
创作者:
别如克*
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,1
MOVBL,2
LOP:
MOVAL,BL
INCBL
MULBL
ADDDX,AX
CMPAX,200
JBELOP
MOVAX,DX
LEADI,STR+4
LOP2:
MOVCL,10
DIVCL
ADDAH,30H
MOV[DI],AH
ANDAX,00FFH
DECDI
CMPAL,0
JNELOP2
LEADX,STR
MOVAH,9
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
程序运行及结果:
程序循环体如下图:
结束循环:
下部分程序为利用除10取余法将计算结果用十进制在屏幕上显示:
计算结果在DS的存储:
实验内容与要求
(2)将从3000H内存单元开始的100个字节存储单元全部清0。
本实验要求在DEBUG调试状态下进行,包括汇编程序、运行程序、检查结果。
实验步骤
实验内容二:
1)输入源程序并检查无误。
2)对内存单元3000H开始的100个存储单元用E命令输入任意数。
3)程序的执行可用DEBUG的G命令,也可用T命令单步跟踪执行。
4)用D命令检查执行结果。
汇编程序清单:
CODESEGMENT
ASSUMECS:
CODE
START:
PUSHDS
MOVAX,0
PUSHAX
MOVBX,3000H
MOVCL,100
LOP:
MOVBYTEPTR[BX],0
INCBX
LOOPLOP
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
运行及调试:
E命令修改:
T追踪:
实验八子程序设计
1、程序说明:
编制一程序,要求键入一个班的学生成绩,并存放于50字的ERADE数组中,然后根据ERADE中的成绩,把学生名次填入50字的RANK数组中,再按学号顺序把名次从终端上显示出来。
提示:
1程序MAIN
功能:
根据输入的学生成绩,计算并显示出学生名次。
2子程序INPUT
功能:
接收一个班级学生的成绩,各成绩之间用空格隔开。
3子程序RANKP
功能:
计算一个班级学生的名次。
4
创作编号:
BG7531400019813488897SX
创作者:
别如克*
5子程序OUTPUT
功能:
输出(显示)一个班级的学生名次
6子程序DECIBIN
功能:
十进制转换二进制,存入BX
7子程序BINDEC
功能:
十进制转换二进制,并在屏幕上显示。
8子程序DEC_DIV
功能:
BX的内容除以CX的内容,并在屏幕上显示一位商。
源程序:
DATASEGMENT
GRADEDW50DUP()
RANKDW50DUP()
ENTERDB'Grades:
',24H;提示用户输入成绩
ERRORDB13,10,'Error!
',13,10,24H;用户输入的格式出错
SHOWDB'Rank:
',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
CALLOUTPUT
MOVAH,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]的值为0
MOVCX,COUNT
LEASI,GRADE;第一个学生的成绩
_NEXT1:
CMPAX,[SI];比较两个成绩
JG_JUMP;成绩大于被比较的跳过
INCWORDPTRRANK[BX]
_JUMP:
ADDSI,2;取下一个被比较成绩的地址
LOOP_NEXT1
ADDBX,2;下一个成绩
DECDI;未比较成绩个数减1
JNE_LOOP
RET
RANKPENDP
;OUTPUT程序段
;从rank数组取得一个班的学生名次。
把一个班的学生名次以学号为序在终端显示出来
;调用子模块binidec,以便把rank数组中的二进制数转成十进制数并在终端上显示出来.调用子模块crlf完成回车,换行功能.
OUTPUTPROCNEAR
LEADX,SHOW
MOVAH,09H
INT21H
MOVSI,0
MOVDI,COUNT
_NEXT2:
MOVBX,RANK[SI];将成绩保存到BX中
创作编号:
BG7531400019813488897SX
创作者:
别如克*
CALLBINIDEC;调用BINIDEC
CMPDI,1;将剩余的成绩个数与1比较,若为1则不显示','
JE_NOCOMMA
MOVDL,','
MOVAH,02H
INT21H;显示','
_NOCOMMA:
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=1
CMPAL,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
CODEEN