微机原理实验报告—实验二熟悉汇编程序建立及其调试方法姓名:***学号:********一、实验目的1、熟悉汇编语言源程序的框架结构,学会编制汇程序。
2、熟悉汇编语言上机操作的过程,学会汇编程序调试方法。
二、实验内容1、学习编写汇编语言源程序的方法,了解数据存放格式。
2、阅读给出的程序,找出程序中的错误。
3、通过调试给出的汇编语言源程序,了解并掌握汇编语言程序的建立、汇编、链接、调试、修改和运行等全过程。
三、实验预习1、阅读实验指导第一章的内容,了解汇编语言程序建立、汇编、链接、调试的全过程。
2、下面的汇编语言源程序有错误的,试给程序加注释。
通过调试手段找出程序中的错误并修改之。
写出程序的功能,画出程序流程图。
(1)程序修改前:STACKSG:SEGMENT PARA STACK ‘STACK’ ;不能有冒号DB 256 DUP(?)STACKSG ENDSDATASG: SEGMENT PARA ‘DATA’;不能有冒号BLOCK DW 0,-5,8,256,-128,96,100,3,45,6,512DW 23,56,420,75,0,-1024,-67,39,-2000COUNT EQU 20MAX DW ?DATASG ENDSCODESG: SEGMENT ;不能有冒号ASSUME SS:STACKSG , CS:CODESGASSUME DS:DATASGORG 100HBEGIN MOV DS, DATASG ;BEGIN: 应改为MOV AX , DATASGMOV DS, AX LEA SI ,BLOCKMOV CX, COUNTDEC CXMOV AX , [SI]CHKMAX ADD SI,2 ;应加冒号CHKMAX: CMP [SI] , AXJLE NEXTMOV AX , [SI]DEC CX ;删除NEXT: LOOP CHKMAXMOV MAX ,AXMOV AH, 4CHINT 21HCODESG ENDSEND BEGIN(2)程序修改后:STACKSG SEGMENT PARA STACK ‘STACK’DB 256 DUP(?)STACKSG ENDSDATASG SEGMENT PARA ‘DATA’BLOCK DW 0,-5,8,256,-128,96,100,3,45,6,512DW 23,56,420,75,0,-1024,-67,39,-2000COUNT EQU 20MAX DW ?DATASG ENDSCODESG SEGMENTASSUME SS:STACKSG , CS:CODESGASSUME DS:DATASGORG 100HBEGIN MOV AX , DATASGMOV DS, AXLEA SI ,BLOCKMOV CX, COUNTDEC CXMOV AX , [SI]CHKMAX:ADD SI,2CMP [SI] , AXJLE NEXTMOV AX , [SI]NEXT: LOOP CHKMAXMOV MAX ,AXMOV AH, 4CHINT 21HCODESG ENDSEND 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,512DW 23,56,420,75,0,-1024,-67,39,-2000 ;定义变量BLOCK包含20个字COUNT EQU 20 ;COUNT=20MAX DW ? ;定义字变量MAX并不赋值DATASG ENDSCODESG SEGMENT ;代码段定义ASSUME SS:STACKSG , CS:CODESG ;说明STACKSG是堆栈段ASSUME DS:DATASG ;CODESG是代码段,DATASG是数据段ORG 100HBEGIN: MOV AX, DATASGMOV DS, AX ;DS指向DATASGLEA SI ,BLOCK ;取BLOCK的有效地址给SIMOV CX, COUNT ;CX=20DEC CX ;CX=CX-1MOV AX , [SI] ;将DS:[SI]里的值送到AX CHKMAX : ADD SI, 2 ;SI=SI+2CMP [SI] , AX ;比较DS:[SI]与AX值的大小JLE NEXT ;如果DS:[SI]的值小于AX里的值,则跳转到NEXT MOV AX , [SI] ;将DS:[SI]的值送到AXNEXT: LOOP CHKMAX ;循环CHKMAXMOV MAX ,AX ;将AX的值送到变量MAXMOV AH, 4CH ;结束INT 21HCODESG ENDSEND BEGIN(4)程序的流程图:N(5)程序的功能:找出20个数中的最大值并保存。
四、实验步骤1、建立汇编语言源程序,对建立的汇编语言源程序进行编译、链接。
2、运行DEBUG调试程序,装入被调试程序,用U命令查看调入的程序,记录代码段基值和数据段基值,用R命令查看并记录下当前寄存器内容。
代码段段基值:164F 数据段段基值:162CAX=0000 BX=0000 CX=0536 DX=0000 SP=0100 BP=0000SI=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 数据段段基值:162CAX=0000 BX=0000 CX=0536 DX=0000 SP=0100 BP=0000SI=0000 DI=0000 DS=162C ES=162C SS=163C CS=164F IP=0100 3)用D命令查看并记录下内存中数据存放格式4)用T命令单步运行程序,观察各条指令执行结果,以及对寄存器、标志位、内存单元的影响。
和之前的结果一样。
6、若重新给出一组数据,可用E命令输入新数据后运行程序,观察并记录运行结果。
(注:在教室没有做完,回来用自己电脑做的,所以段基值不一样)7、若要求找出数据区中最小数,程序将如何修改,试上机调试。
(将JLE NEXT改为JGE NEXT)DATA SEGMENT PARA 'DATA'BLOCK DW 0,-5,8,256,-128,96,100,3,45,6,512DW 23,56,420,75,0,-1024,-67,39,-2000COUNT EQU 20MAX DW?DATA ENDSSTACK SEGMENT PARA STACK 'STACK'DB256 DUP(?)STACK ENDSCODE SEGMENTASSUME SS:STACK,CS:CODEASSUME DS:DATAORG 100HBEGIN: MOV BX,DATAMOV DS,BXLEA SI,BLOCKMOV CX,COUNTDEC CXMOV AX,[SI]CHKMAX: ADD SI,2CMP [SI],AXJGE NEXTMOV AX,[SI]DEC CXNEXT: LOOP CHKMAXMOV MAX,AXMOV AH,4CHINT 21HCODE ENDSEND BEGIN实验结果如下:(注:在教室没有做完,回来用自己电脑做的,所以段基值不一样)五、实验习题与思考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用来指定当前位置的偏移地址。