微机原理实验报告

  • 格式:docx
  • 大小:109.86 KB
  • 文档页数:8

下载文档原格式

  / 8
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

汇编语言程序设计实验

一、实验内容

1.学习并掌握IDE86集成开发环境的使用,包括编辑、编译、链接、

调试与运行等步骤。

2.参考书例4-8,P165 (第3版161页)以单步形式观察程序的

执行过程。

3.修改该程序,求出10个数中的最大值和最小值。以单步形式观

察,如何求出最大值、最小值。

4.求1到100 的累加和,并用十进制形式将结果显示在屏幕上。

要求实现数据显示,并返回DOS状态。

二、实验目的

1.学习并掌握IDE86集成开发环境的使用

2.熟悉汇编语言的基本算法,并实际操作

3.学会利用IDE86进行debug的步骤

三、实验方法

1.求出10个数中的最大值和最小值

(1)设计思路:利用冒泡法,先对数据段的10个数字的前2个比

较,把二者中大的交换放后面。在对第二个和第三个数比较,把

二者中较大的交换放后面,依此类推直到第十个数字。这样第十

位数就是10个数里面最大的。然后选出剩下9个数字里面最大

的,还是从头开始这么做,直到第九个数字。以此类推直到第一

个数字。

(2)流程图

2.求1到100 的累加和,并用十进制形式将结果显示在屏幕上。

要求实现数据显示,并返回DOS状态

(1)设计思路:结果存放在sum里面,加数是i(初始为1),进行

100次循环,sum=sum+I,每次循环对i加1.

(2)流程图:

四、

1.求出10个数中的最大值和最小值

DSEG SEGMENT

NUM DB -1,-4,0,1,-2,5,-6,10,4,0 ;待比较数字

DSEG ENDS

CODE SEGMENT

ASSUME DS:DSEG,CS:CODE

START:MOV AX,DSEG

MOV DS,AX

LEA SI,NUM

MOV DX,SI

MOV CL,9 ;大循环计数寄存器初始化

NEXT1:MOV BL,CL ;大循环开始,小循环计数器初始化MOV SI,DX

NEXT2:MOV AL,[SI+1]

CMP [SI],AL ;比较

JGGONE ;如果后面大于前面跳到小循环末尾CHANGE:MOV AH,[SI] ;交换

MOV [SI+1],AH

MOV [SI],AL

JMP GONE

GONE:add SI,1

DEC BL

JNZ NEXT2

LOOP NEXT1;小循环结束

MOV AX,21H;返回DOS

INT 21H

CODE ENDS

END START

2.求1到100 的累加和,并用十进制形式将结果显示在屏幕上。

要求实现数据显示,并返回DOS状态

DSEG SEGMENT

ANS DB 4 DUP(0)

SUM DW 0

JIA DW 1

TEN DW 10

ZERO DW 0

DSEG ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DSEG

START:MOV AX,DSEG

MOV DS,AX

MOV AX,SUM

BEGIN:ADD AX,JIA ;1到100加和开始

INC JIA

CMP JIA,101

JNZ BEGIN

MOV SUM,AX;结果放sum

MOV DX,0

LEA SI,ANS

ADD SI,4

GO: SUB SI,1 ;16进制变10进制循环开始

DIV TEN ;除以10

MOV BYTE PTR [SI],DL;余数从后往前放在sum

MOV DX,0

CMP AX,ZERO ;商为零结束

JNZ GO

MOV CX,4

LEA SI,ANS

DEC SI

GONE: INC SI;循环显示开始

MOV DL,[SI]

ADD DL,30H;取sum数字加30H变为ASCALL码

MOV AH,2

INT 21H ;显示

LOOP GONE

MOV AH,4CH

INT 21H

CODE ENDS

END START

五、实验结果

1.求出10个数中的最大值和最小值

原来的ds段:

比较之后的ds段:

2.求1到100 的累加和,并用十进制形式将结果显示在屏幕上。

要求实现数据显示,并返回DOS状态

运行完16进制转10进制的ds段

最后显示结果:

六、实验中遇到的问题及解决方法

在第四个实验中遇到了不少问题:

首先是16进制转10进制,当把AX赋值为5050,用DIV 10的命令时总会出现错误提示:“divide bv zero”,后来不论如何尝试都不可以,然后思索之后发现5050/10=505>2^16(16位二进制数字最大表

示范围),因此需要用32进制除以16进制的除法运算。最后结果正确。

然后,在把16进制数字除以10的余数放在ans(数据段里面用于存放转换之后的10进制数)里面的时候,发现应该是“05000500”的段总是变成“05000000”,后来在反复单步调试之后发现:MOV [SI],DX 语句会一次性改变4位16进制数,导致错误的发生。改正代码为:MOV BYTE PTR [SI],DL之后成功解决。

七、心得体会

通过本次实验课,我们基本掌握了IDE86集成编译环境的使用方法,包括写代码、编译、连接、调试这四个步骤。更重要的是通过开发环境下面的单步运行,深刻理解了一些算法的过程。同时通过编译课堂上学习的代码,发现自己犯下的错误,并一步步解决问题,从而掌握了汇编语言调试的能力。我认为学习汇编语言就需要不断的犯错,从发生错误到单步运行解决问题,这是一个不可多得的学习过程。同时对于这种过程化的低级语言,我们必须要分模块进行调试,遇到问题先看看先面的环节结果正确吗,这样一步步仔细观察就一定可以发现问题。