北京工业大学微机原理实验报告2

  • 格式:doc
  • 大小:390.22 KB
  • 文档页数:13

微机原理实验报告

—实验二 熟悉汇编程序建立

及其调试方法

姓名:

学号:

一、 实验目的

1、熟悉汇编语言源程序的框架结构,学会编制汇程序。

2、熟悉汇编语言上机操作的过程,学会汇编程序调试方法。

二、 实验内容

1、学习编写汇编语言源程序的方法,了解数据存放格式。

2、阅读给出的程序,找出程序中的错误。

3、通过调试给出的汇编语言源程序,了解并掌握汇编语言程序的建立、汇编、链接、调试、修改和运行等全过程。

三、 实验预习

1、阅读实验指导第一章的内容,了解汇编语言程序建立、汇编、链接、调试的全过程。

2、下面的汇编语言源程序有错误的,试给程序加注释。通过调试手段找出程序中的错误并修改之。写出程序的功能,画出程序流程图。

(1)程序修改前:

STACKSG: SEGMENT PARA STACK ‘STACK’ ;不能有冒号

DB 256 DUP(?)

STACKSG ENDS

DATASG: SEGMENT PARA ‘DATA’ ;不能有冒号

BLOCK DW 0,-5,8,256,-128,96,100,3,45,6,512

DW 23,56,420,75,0,-1024,-67,39,-2000

COUNT EQU 20

MAX DW ?

DATASG ENDS

CODESG: SEGMENT ;不能有冒号

ASSUME SS:STACKSG , CS:CODESG

ASSUME DS:DATASG

ORG 100H

BEGIN MOV DS, DATASG ;BEGIN: 应改为 MOV AX , DATASG

MOV DS, AX

LEA SI ,BLOCK MOV CX, COUNT

DEC CX

MOV AX , [SI]

CHKMAX ADD SI,2 ;应加冒号CHKMAX:

CMP [SI] , AX

JLE NEXT

MOV AX , [SI]

DEC CX ;删除

NEXT: LOOP CHKMAX

MOV MAX ,AX

MOV AH, 4CH

INT 21H

CODESG ENDS

END BEGIN

(2)程序修改后:

STACKSG SEGMENT PARA STACK ‘STACK’

DB 256 DUP(?)

STACKSG ENDS

DATASG SEGMENT PARA ‘DATA’

BLOCK DW 0,-5,8,256,-128,96,100,3,45,6,512

DW 23,56,420,75,0,-1024,-67,39,-2000

COUNT EQU 20

MAX DW ?

DATASG ENDS

CODESG SEGMENT

ASSUME SS:STACKSG , CS:CODESG

ASSUME DS:DATASG

ORG 100H

BEGIN MOV AX , DATASG

MOV DS, AX

LEA SI ,BLOCK

MOV CX, COUNT

DEC CX

MOV AX , [SI]

CHKMAX: ADD SI,2

CMP [SI] , AX

JLE NEXT

MOV AX , [SI]

NEXT: LOOP CHKMAX

MOV MAX ,AX

MOV AH, 4CH INT 21H

CODESG ENDS

END BEGIN

(3)程序注释:

STACKSG SEGMENT PARA STACK 'STACK'

DB 256 DUP(?)

STACKSG ENDS ;定义堆栈段

DATASG SEGMENT PARA 'DATA' ;数据段定义

BLOCK DW 0,-5,8,256,-128,96,100,3,45,6,512

DW 23,56,420,75,0,-1024,-67,39,-2000 ;定义变量BLOCK包含20个字

COUNT EQU 20 ;COUNT=20

MAX DW ? ;定义字变量MAX并不赋值

DATASG ENDS

CODESG SEGMENT ;代码段定义

ASSUME SS:STACKSG , CS:CODESG ;说明STACKSG是堆栈段

ASSUME DS:DATASG ;CODESG是代码段,

DATASG是数据段

ORG 100H

BEGIN: MOV AX, DATASG

MOV DS, AX ;DS指向DATASG

LEA SI ,BLOCK ;取BLOCK的有效地址给SI

MOV CX, COUNT ;CX=20

DEC CX ;CX=CX-1

MOV AX , [SI] ;将DS:[SI]里的值送到AX

CHKMAX : ADD SI, 2 ;SI=SI+2

CMP [SI] , AX ;比较DS:[SI]与AX值的大小

JLE NEXT ;如果DS:[SI]的值小于AX里的值,则跳转到NEXT

MOV AX , [SI] ;将DS:[SI]的值送到AX

NEXT: LOOP CHKMAX ;循环CHKMAX

MOV MAX ,AX ;将AX的值送到变量MAX

MOV AH, 4CH ;结束

INT 21H

CODESG ENDS

END BEGIN

(4)程序的流程图:

Y

N

N

Y

(5)程序的功能:

找出20个数中的最大值并保存。 从内存取数

SI=SI+2

[SI]>AX ?

AX=[SI]

CX—1

保存最大值 CX=0?开始

结束

四、实验步骤

1、建立汇编语言源程序,对建立的汇编语言源程序进行编译、链接。

2、运行DEBUG调试程序,装入被调试程序,用U命令查看调入的程序,记录代码段基值和数据段基值,用R命令查看并记录下当前寄存器内容。

代码段段基值:164F 数据段段基值:162C

AX=0000 BX=0000 CX=0536 DX=0000 SP=0100 BP=0000

SI=0000 DI=0000 DS=162C ES=162C SS=163C CS=164F IP=0100

3、用D命令查看并记录下内存中数据存放格式。

(注:在教室没有做完,回来用自己电脑做的,所以段基值不一样)

4、用T命令单步运行程序,观察各条指令执行结果,以及对寄存器、标志位、内存单元的影响,若找出程序中的错误,用Q命令退出DEBUG环境,修改汇编语言源程序,重复上述步骤,直至整个程序无误。

5、若将LEA SI,BLOCK语句改为LEA SI,BLOCK+2*COUNT-2,并将ADD

SI,2改为SUB SI,2,重新运行程序,观察运行结果:

1)建立汇编语言源程序,对建立的汇编语言源程序进行编译、链接。

2)运行DEBUG调试程序,装入被调试程序,用U命令查看调入的程序,记录代码段基值和数据段基值,用R命令查看并记录下当前寄存器内容。

代码段段基值:164F 数据段段基值:162C

AX=0000 BX=0000 CX=0536 DX=0000 SP=0100 BP=0000

SI=0000 DI=0000 DS=162C ES=162C SS=163C CS=164F IP=0100

3)用D命令查看并记录下内存中数据存放格式

4)用T命令单步运行程序,观察各条指令执行结果,以及对寄存器、标志位、内存单元的影响。

和之前的结果一样。

6、若重新给出一组数据,可用E命令输入新数据后运行程序,观察并记录运行结果。