东华大学微机系统及原理实验报告.docx

上传人:b****7 文档编号:23611314 上传时间:2023-05-19 格式:DOCX 页数:44 大小:578.48KB
下载 相关 举报
东华大学微机系统及原理实验报告.docx_第1页
第1页 / 共44页
东华大学微机系统及原理实验报告.docx_第2页
第2页 / 共44页
东华大学微机系统及原理实验报告.docx_第3页
第3页 / 共44页
东华大学微机系统及原理实验报告.docx_第4页
第4页 / 共44页
东华大学微机系统及原理实验报告.docx_第5页
第5页 / 共44页
点击查看更多>>
下载资源
资源描述

东华大学微机系统及原理实验报告.docx

《东华大学微机系统及原理实验报告.docx》由会员分享,可在线阅读,更多相关《东华大学微机系统及原理实验报告.docx(44页珍藏版)》请在冰豆网上搜索。

东华大学微机系统及原理实验报告.docx

东华大学微机系统及原理实验报告

 

创作编号:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1