1、微型计算机实验一实验报告深 圳 大 学 实 验 报 告 课程名称: 微型计算机与接口技术原理 实验项目名称: 熟悉 DEBUG的使用、寻址方式实践 学院: 计算机与软件学院 专业: 计算机科学与技术 指导教师: 胡庆彬 报告人: 学号:2012150 班级: 1 实验时间: 2014年11月 实验报告提交时间: 2014年11月 教务部制实验目的:1、熟悉DEBUG的使用2、加深对寻址方式的理解3、熟悉MASM的使用,掌握编程技巧实验步骤:Part 1(一) 熟悉 DEBUG的使用(熟悉DEBUG的常用命令 A, U, R , T ,D , E , G )DEGUG下的实践:1 在DEBUG状
2、态下 用 “E” 命令在偏移地址为0200H 开始的18H个单元输入 0,1,2 .,17H。 (1)写一段程序,把这24个单元的内容复制到偏移地址为0230H 开始的单元中。(2)写一段程序,把偏移地址为5000H 开始的40H个单元写入 AAH .2. 写一段程序把 1,2, . . . ,100共100个数写入偏移地址为0200H 开始的100个单元中。用条件转移指令完成这100个数相加,并把结果放入偏移地址为0300H 起的单元中。 (选做)(二)寻址方式实践(1) 用E 命令(E 2000:0000 )把内存2000:0000开始的10个单元的内容改写为:10,11,12,13,14
3、. ,19; 把内存2000:0040开始的10个单元的内容改写为:00,11,22,33,44. ,99(2) 用命令检查执行(1)的情况(3)用 命令输入如下指令,逐条执行并观察结果并解析之 。 MOV AX, 2000 MOV DS, AXMOV BX,4MOV SI, 40 MOV AL, 2MOV AL, BXMOV AL,SIMOV AL, BX+4MOV AL, SI+3MOV AL, BX+SIMOV AX, BX+SI+4MOV BX+SI+20,AL ; AL 的内容送何处?MOV BP,4MOV BP+2, AX ; AX 的内容送何处?找找INC AX MOV BX+2
4、,AX ; AX 的内容送何处?找找PUSH AX ; AX的内容送何处?观察SP 的变化PUSH BX ;BX的内容送何处?观察SP 的变化POP CX ;CX=? 观察SP 的变化(4)说明第条指令的寻址方式,确定第1条指令源操作数的物理地址Part 2一 在DEBUG状态下 用 “E” 命令在3000: 0010H 开始的10H个单元输入 0,1,2 .,0FH。 (1)写一段程序,用串指令把这16个单元的内容复制到4000:0020H 开始的单元中。(2)写一段程序,用串指令把物理地址为3000:0400H 开始的40H个单元写入 AAH ;3000:0450开始的30H个单元写入 5
5、5H二 熟悉 Masm for windows的使用。三 编写1个具有一定功能的小程序,完成它们的汇编,连接,运行和在DEBUG下的调试。(分析运行结果)题目可自拟实验结果:1 在DEBUG状态下 用 “E” 命令在偏移地址为0200H 开始的24H个单元输入 0,1,2 .,17H,(1)写一段程序,把这24个单元的内容复制到偏移地址为0230H 开始的单元中。在ASM平台上代码如下: MOV AX,2000H MOV DS,AX MOV BX,200H MOV CX,24 MOV SI,230H FIND: MOV AL,BX MOV SI,AL INC BX INC SI LOOP FI
6、ND 实验结果分析:这个程序完成了从偏移地址从200开始的24个内存单元的数值复制,初始偏移地址为SI=200H,要复制到偏移地址BX=230中,每复制一次,BX,SI都要做+1操作,循环,当做完CX=24次复制时,程序停止。(2)写一段程序,把偏移地址为5000H 开始的40H个单元写入 AAH .在ASM平台上代码如下:MOV AX,2000HMOV DS,AX MOV CX,40MOV SI,5000HMOV AL,0AAHFIND: MOV SI,ALINC SILOOP FIND 实验结果分析:先把要赋值的AAH赋值给AL,然后设置循环次数CX=40,偏移地址为5000H,从5000
7、H开始给内存单元赋值AAH,循环结束后完成40次赋值。2. 写一段程序把 1,2, . . . ,100共100个数写入偏移地址为0200H 开始的100个单元中。用条件转移指令完成这100个数相加,并把结果放入偏移地址为0300H 起的单元中。 (选做)在ASM平台上代码如下: MOV AX,2000H MOV DS,AX MOV CX,100 MOV AX,0 ;SUM MOV BX,1 JUMP:ADD AX,BX INC BL DEC CX JNZ JUMP MOV SI,300H MOV SI,AX 实验结果分析:1+2+3+.+100=1050,用16进制表示即13BA,结果正确(
8、按照数据的存储规则低位在前高位在后)。在本题目中,先给和赋初值0,BX=1100,一共计算CX=100次,每次相加后BL即BX的值增加1,最终能算出正确结果。二)寻址方式实践(1) 用E 命令(E 2000:0000 )把内存2000:0000开始的10个单元的内容改写为:10,11,12,13,14. ,19; 把内存2000:0040开始的10个单元的内容改写为:00,11,22,33,44. ,99(2) 用命令检查执行(1)的情况(3)用 命令输入如下指令,逐条执行并观察结果并解析之 。 MOV AX, 2000分析:执行第一条后,AX=2000. MOV DS, AX分析:执行第二条
9、,DS=2000MOV BX,4分析:使BX=0004MOV SI, 40分析:对SI赋值 MOV AL, 2分析:把偏移地址为0002的内存单元的内容,即把12赋给AL,则AX=2012MOV AL, BX分析:把偏移地址为0004的内存单元的内容,即把14赋给AL,则AX=2014MOV AL,SI分析:把偏移地址为0040的内存单元的内容,即把14赋给AL,则AX=2000MOV AL, BX+4分析:把偏移地址为BX+4=0008的内存单元的内容,即把18赋给AL,则AX=2018MOV AL, SI+3分析:把偏移地址为SI+3=0043的内存单元的内容,即把33赋给AL,则AX=2
10、033MOV AL, BX+SI分析:把偏移地址为BX+SI=0044的内存单元的内容,即把44赋给AL,则AX=2044MOV AX, BX+SI+4分析:把偏移地址为BX+SI+4=0048的内存单元的内容,即把88赋给AX,则AX=9988(按照低位在前高位在后的存储规则)MOV BX+SI+20,AL ; AL 的内容送何处?分析:把偏移地址为AL=0088的内存单元的内容,即把88赋给BX+SI+20=0064所在的内存单元,值为0088MOV BP,4分析:把4赋值给BP,BP=0004MOV BP+2, AX ; AX 的内容送何处?找找分析:把AX=9988赋值给BP+2=00
11、06所在的内存单元,此时由SS=140D提供段地址INC AX 分析:把AX的值+1,AX=9989MOV BX+2,AX ; AX 的内容送何处?找找分析:把AX=9989赋值给BX+2=0006所在的内存单元,DS提供段地址PUSH AX ; AX的内容送何处?观察SP 的变化分析:压栈,栈顶指针SP=SP-2=-2即FFFE。AX的内容送到SS:SP=140D:FFFE中,99在前,89在后,如图。PUSH BX ;BX的内容送何处?观察SP 的变化分析:压栈,栈顶指针SP=SP-2=-4即FFFC。BX的内容送到SS:SP=140D:FFFC中,04在前,00在后,如图。POP CX
12、;CX=? 观察SP 的变化分析:入栈,先把栈SS:SP=140D:FFFC中的数据送到BX中,顶指针SP=SP+2=-2即FFFE。(4)说明第条指令的寻址方式,确定第1条指令源操作数的物理地址 MOV SI, 40 立即数寻址 MOV AL, 2 直接寻址 2000:0002MOV AL, BX 寄存器间接寻址2000::0004MOV AL,SI 寄存器间接寻址 2000:0040MOV AL, BX+4 寄存器相对寻址2000:0008MOV AL, SI+3 寄存器相对寻址2000::0043MOV AL, BX+SI 基址变址寻址 2000:0044MOV AX, BX+SI+4
13、基址变址相对寻址2000:0048MOV BX+SI+20,AL 基址变址相对寻址 MOV BP,4 立即数寻址 Part 2一 在DEBUG状态下 用 “E” 命令在3000: 0010H 开始的10H个单元输入 0,1,2 .,0FH。 (1)写一段程序,用串指令把这16个单元的内容复制到4000:0020H 开始的单元中。 MOV AX,3000H MOV DS,AX MOV AX,4000H MOV ES,AX MOV SI,10H MOV DI,20H MOV CX,16;此处输入代码段代码 CLD REP MOVSBHLT 结果分析:由于串指令指定源串地址为DS:SI(支持段重设)
14、,目标串地址为ES:DI(不支持段重设),因此程序开始先设定DS,SI,ES,DI的值,然后设定传送次数CX=16,接着有CLD设定DF=0即传送方向从低地址向高地址进行,再在无条件循环REP下使用字节传送指令MOVSB即可完成复制。(2)写一段程序,用串指令把物理地址为3000:0400H 开始的40H个单元写入 AAH ;3000:0450开始的30H个单元写入 55H MOV AX,3000H MOV ES,AX MOV DI,400H MOV CX,40;此处输入代码段代码 MOV AL,0AAH CLD REP STOSB MOV DI,450H MOV CX,30;此处输入代码段代
15、码 MOV AL,55H CLD REP STOSB HLT 结果分析:STOSB指令把AL中的字节存到由ES:DI指向的存储单元中,因此需要先设定ES,DI的值,然后设定存储次数CX和存储方向DF,在无条件循环REP下实现两次地址不同的地址存储。三 编写1个具有一定功能的小程序,完成它们的汇编,连接,运行和在DEBUG下的调试。(分析运行结果)题目可自拟定义12个数,把它们的和放到SUM中;找出它们中最大和最小的数,分别放到MAX和MIN单元中。DATAS SEGMENT ARRAY DW 2,1,4,8,5,3,7,6,9,12,10,11 SUM DW 0 MAX DW 0 MIN DW
16、 0 ;此处输入数据段代码 DATAS ENDSSTACKS SEGMENT STACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART: MOV AX,DATAS MOV DS,AX MOV CX,12 LEA SI,SUM ;由于输出结果为ASCII码,此处直接记录地址方便调试 LEA SI,MIN ;记录地址 LEA SI,MAX ;记录地址 LEA SI,ARRAY;此处输入代码段代码 MOV AX,0 ADDING:ADD AX,SI ADD SI,2 LOOP ADDING MOV SUM,AX ;MOV AH,
17、09 ;MOV DX,OFFSET SUM; ;INT 21H MOV CX,12 ;求最大值 LEA SI,ARRAY MOV AX,SI DEC CX MAX1: ADD SI,2 DEC CX JCXZ MINN CMP SI,AX JL MAX1 MOV AX,SI JMP MAX1 MINN: ;求最小值 MOV MAX,AX MOV CX,12 LEA SI,ARRAY MOV AX,SI DEC CX MIN1: ADD SI,2 DEC CX JCXZ ENDING CMP SI,AX JG MIN1 MOV AX,SI JMP MIN1 ENDING: MOV MIN,AX
18、MOV AH,4CH INT 21HCODES ENDS END START经过记录,SUM,MAX,MIN的偏移地址分别为0018,001A,001C.以下用D查看相关结果:由上图可以知道,这12个数相加的和为4E(即10进制的78),最大值为C(10进制的12),最小值为1,结果正确。程序主要思路:先对12个数求和,不断地把SI指向的内存单元的数值累加到AX中,得到最终结果。第二步求最大值,用AX存储,通过没比较一次CX减少1,共比较11次,每次把大的数值存储在AX中,最后把AX中的数值赋给MAX。同理,第三部对12个数求最小值时,用AX存储,通过没比较一次CX减少1,共比较11次,每次把
19、小的数值存储在AX中,最后把AX中的数值赋给MIN。实验结论:通过这次实验,我能比较熟练地操作使用DEBUG了。常见的寻址方式有以下几种:立即寻址,直接寻址,寄存器寻址,寄存器间接寻址,寄存器相对寻址,基址变址寻址,基址变址相对寻址,隐含寻址。通过本次实验,能比较熟练地在MASM平台上编写程序了。实验心得:做第一部分时,用到寄存器间接寻址,而用SI,DI,BX来指定有效地址时,段地址由DS提供,因此在代码中需要对DS进行设定。在ASM平台上写程序时,把AAH赋值给AL,注意要写成MOV AL,0AAH而不是MOV AL,AAH,否则会出错。做1100求和的时候,要注意不能直接ADD AX,BL,因为BL8位AX16位,因此写成ADD AX,BX,而这么写的前提是BH=0,即提前赋值使得BX=0.使用串指令时要注意操作数的大小使用不同的指令。在求数组的最大值最小值时,一开始没有把CMP比较命令和JL跳转命令连在一起写,导致结果错误,原因是夹在条命令之间的命令对SF或者ZF做修改导致程序没有按照人的意愿跳转。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1