北京工业大学微机原理实验报告2.docx
《北京工业大学微机原理实验报告2.docx》由会员分享,可在线阅读,更多相关《北京工业大学微机原理实验报告2.docx(14页珍藏版)》请在冰点文库上搜索。
北京工业大学微机原理实验报告2
微机原理实验报告
—实验二熟悉汇编程序建立
及其调试方法
姓名:
学号:
一、实验目的
1、熟悉汇编语言源程序的框架结构,学会编制汇程序。
2、熟悉汇编语言上机操作的过程,学会汇编程序调试方法。
二、实验内容
1、学习编写汇编语言源程序的方法,了解数据存放格式。
2、阅读给出的程序,找出程序中的错误。
3、通过调试给出的汇编语言源程序,了解并掌握汇编语言程序的建立、汇编、链接、调试、修改和运行等全过程。
三、实验预习
1、阅读实验指导第一章的内容,了解汇编语言程序建立、汇编、链接、调试的全过程。
2、下面的汇编语言源程序有错误的,试给程序加注释。
通过调试手段找出程序中的错误并修改之。
写出程序的功能,画出程序流程图。
(1)程序修改前:
STACKSG:
SEGMENTPARASTACK‘STACK’;不能有冒号
DB256DUP(?
)
STACKSGENDS
DATASG:
SEGMENTPARA‘DATA’;不能有冒号
BLOCKDW0,-5,8,256,-128,96,100,3,45,6,512
DW23,56,420,75,0,-1024,-67,39,-2000
COUNTEQU20
MAXDW?
DATASGENDS
CODESG:
SEGMENT;不能有冒号
ASSUMESS:
STACKSG,CS:
CODESG
ASSUMEDS:
DATASG
ORG100H
BEGINMOVDS,DATASG;BEGIN:
应改为MOVAX,DATASG
MOVDS,AX
LEASI,BLOCK
MOVCX,COUNT
DECCX
MOVAX,[SI]
CHKMAXADDSI,2;应加冒号CHKMAX:
CMP[SI],AX
JLENEXT
MOVAX,[SI]
DECCX;删除
NEXT:
LOOPCHKMAX
MOVMAX,AX
MOVAH,4CH
INT21H
CODESGENDS
ENDBEGIN
(2)程序修改后:
STACKSGSEGMENTPARASTACK‘STACK’
DB256DUP(?
)
STACKSGENDS
DATASGSEGMENTPARA‘DATA’
BLOCKDW0,-5,8,256,-128,96,100,3,45,6,512
DW23,56,420,75,0,-1024,-67,39,-2000
COUNTEQU20
MAXDW?
DATASGENDS
CODESGSEGMENT
ASSUMESS:
STACKSG,CS:
CODESG
ASSUMEDS:
DATASG
ORG100H
BEGINMOVAX,DATASG
MOVDS,AX
LEASI,BLOCK
MOVCX,COUNT
DECCX
MOVAX,[SI]
CHKMAX:
ADDSI,2
CMP[SI],AX
JLENEXT
MOVAX,[SI]
NEXT:
LOOPCHKMAX
MOVMAX,AX
MOVAH,4CH
INT21H
CODESGENDS
ENDBEGIN
(3)程序注释:
STACKSGSEGMENTPARASTACK'STACK'
DB256DUP(?
)
STACKSGENDS;定义堆栈段
DATASGSEGMENTPARA'DATA';数据段定义
BLOCKDW0,-5,8,256,-128,96,100,3,45,6,512
DW23,56,420,75,0,-1024,-67,39,-2000;定义变量BLOCK包含20个字
COUNTEQU20;COUNT=20
MAXDW?
;定义字变量MAX并不赋值
DATASGENDS
CODESGSEGMENT;代码段定义
ASSUMESS:
STACKSG,CS:
CODESG;说明STACKSG是堆栈段
ASSUMEDS:
DATASG;CODESG是代码段,DATASG是数据段
ORG100H
BEGIN:
MOVAX,DATASG
MOVDS,AX;DS指向DATASG
LEASI,BLOCK;取BLOCK的有效地址给SI
MOVCX,COUNT;CX=20
DECCX;CX=CX-1
MOVAX,[SI];将DS:
[SI]里的值送到AX
CHKMAX:
ADDSI,2;SI=SI+2
CMP[SI],AX;比较DS:
[SI]与AX值的大小
JLENEXT;如果DS:
[SI]的值小于AX里的值,则跳转到NEXT
MOVAX,[SI];将DS:
[SI]的值送到AX
NEXT:
LOOPCHKMAX;循环CHKMAX
MOVMAX,AX;将AX的值送到变量MAX
MOVAH,4CH;结束
INT21H
CODESGENDS
ENDBEGIN
(4)程序的流程图:
Y
N
N
Y
(5)程序的功能:
找出20个数中的最大值并保存。
四、实验步骤
1、建立汇编语言源程序,对建立的汇编语言源程序进行编译、链接。
2、运行DEBUG调试程序,装入被调试程序,用U命令查看调入的程序,记录代码段基值和数据段基值,用R命令查看并记录下当前寄存器内容。
代码段段基值:
164F数据段段基值:
162C
AX=0000BX=0000CX=0536DX=0000SP=0100BP=0000
SI=0000DI=0000DS=162CES=162CSS=163CCS=164FIP=0100
3、用D命令查看并记录下内存中数据存放格式。
(注:
在教室没有做完,回来用自己电脑做的,所以段基值不一样)
4、用T命令单步运行程序,观察各条指令执行结果,以及对寄存器、标志位、内存单元的影响,若找出程序中的错误,用Q命令退出DEBUG环境,修改汇编语言源程序,重复上述步骤,直至整个程序无误。
5、若将LEASI,BLOCK语句改为LEASI,BLOCK+2*COUNT-2,并将ADDSI,2改为SUBSI,2,重新运行程序,观察运行结果:
1)建立汇编语言源程序,对建立的汇编语言源程序进行编译、链接。
2)运行DEBUG调试程序,装入被调试程序,用U命令查看调入的程序,记录代码段基值和数据段基值,用R命令查看并记录下当前寄存器内容。
代码段段基值:
164F数据段段基值:
162C
AX=0000BX=0000CX=0536DX=0000SP=0100BP=0000
SI=0000DI=0000DS=162CES=162CSS=163CCS=164FIP=0100
3)用D命令查看并记录下内存中数据存放格式
4)用T命令单步运行程序,观察各条指令执行结果,以及对寄存器、标志位、内存单元的影响。
和之前的结果一样。
6、若重新给出一组数据,可用E命令输入新数据后运行程序,观察并记录运行结果。
(注:
在教室没有做完,回来用自己电脑做的,所以段基值不一样)
7、若要求找出数据区中最小数,程序将如何修改,试上机调试。
(将JLENEXT改为JGENEXT)
DATASEGMENTPARA'DATA'
BLOCKDW0,-5,8,256,-128,96,100,3,45,6,512
DW23,56,420,75,0,-1024,-67,39,-2000
COUNTEQU20
MAXDW?
DATAENDS
STACKSEGMENTPARASTACK'STACK'
DB256DUP(?
)
STACKENDS
CODESEGMENT
ASSUMESS:
STACK,CS:
CODE
ASSUMEDS:
DATA
ORG100H
BEGIN:
MOVBX,DATA
MOVDS,BX
LEASI,BLOCK
MOVCX,COUNT
DECCX
MOVAX,[SI]
CHKMAX:
ADDSI,2
CMP[SI],AX
JGENEXT
MOVAX,[SI]
DECCX
NEXT:
LOOPCHKMAX
MOVMAX,AX
MOVAH,4CH
INT21H
CODEENDS
ENDBEGIN
实验结果如下:
(注:
在教室没有做完,回来用自己电脑做的,所以段基值不一样)
五、实验习题与思考
1.在装入被调试程序后,如何知道分配给该用户程序的数据段在内存中的位置?
答:
在DEBUG环境中用R命令进行检验。
2.数据区以什么形式存放用符号数的?
答:
以补码形式存放有符号数。
3.修改前、后程序在执行时有何区别(提示:
观察数据指针的变化)
答:
修改前SI递增(顺序比较),修改后SI递减(倒叙比较)。
4.程序执行完毕,结果存放在何处?
答:
内存MAX中。
5.总结一下CS,IP,SS,DS,ES被设置的区别?
答:
CS,DS,SS,ES都用ASSUME伪指令来设置,IP通过ORG伪指令来设置。
6.观察伪指令PARA和ORG的作用。
答:
PARA用来说明本段的段的起始地址能被16整除,即DS:
0000下一行是DS:
0010。
ORG用来指定当前位置的偏移地址。