北京工业大学微机原理实验报告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命令输入新数据后运行程序,观察并记录运行结果。