1、武大微机原理实验报告汇总 4000字word版本 25页本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!= 本文为word格式,下载后可方便编辑和修改! = 武大微机原理实验报告汇总 (4000字)微型计算机原理与接口技术实验报告【实验名称】 汇编语言程序的编辑与调试 【实验目的】学习汇编源程序的编辑、编译、链接、执行全过程。学习编辑文件、TASM、TLINK的使用方法以及汇编语言的语法规则。 学习使用TD对程序进行调试的方法。 【实验步骤】1、将程序1输入并存储为hello.asm文件 2、编译与链接首先对源代码进行编译,指令为:C:TASM HEL
2、LO / zi 生成HELLO.OBJ 编译如果报错,需要回到编辑窗口修改源代码,存盘后重新编译 编译成功后,链接生成可执行文件C:TLINK HELLO / v / 3 生成HELLO.EXE 3、 启动调试工具TD (Turbo Debugger)键入:C:TD HELLO成功启动TD之后,TD进入MODULE显示模式,屏幕上显示HELLO-ASM源程序,一个三角形符号指示出了标号为BEG的那条指令是启动指令。 4、 动态调试(按照以下的步骤学习掌握TD的用法) (1) 连续执行程序 按F9键(即Run | Run),即可从BEG开始连续执行程序。 (2) 查看执行结果按Alt+F5键(即
3、Window | User screen),临时切换到DOS屏幕,可查看程序的执行结果,即5行HELLO。注意:Alt键要多按一会儿,直到快捷键提示区更换提示内容之后再按F5键。按任意键可以恢复MODULE窗口内容。(3) 使光标重新指向启动指令当程序运行结束(三角形光标消失),按Ctr1+F2(Run|Program rest)可以重新装入程序并使光标指向启动指令。 (4) 程序的单步执行单步操作一次仅执行了一条指令,有3个单步操作命令,它们的区别仅在于跟踪的情况不同。 F8 (Run | Step over) 单步操作。执行CALL和INT n指令的时候,不跟踪相关的子程序。不眼踪的含义是
4、指在进入相关子程序后,自动地连续执行子程序指令直到返回。所以,宏观上看不到跟踪的效果。 F7 (Run | Trace into) 单步操作。执行CALL指令能够跟踪子程序,随即暂停,等待用户的下一步操作。但是在遇到INT n指令时与F8一样,进入服务程序后立即自动地连续执行服务程序直到返回。 Alt+F7 (Run | Instruction trace)单步操作。真正意义上的单步操作,执行CALL和INT n指令进入相关子程序之后立即停止,等待用户的下一步操作。实践证明:用Alt+F7跟进服务程序以后,如果再执行单步操作,很容易使系统瘫痪。因此,请读者慎用。编者认为:Alt+F7的用途在于
5、跟进中断服务程序以后,可以了解服务程序的结构,如果服务程序是系统设计的 (如INT 21H,INT 10H等),应当用F8操作。 (5) 断点的设置和取消 按、键,使光标指向欲设置断点的指令,再按F2键 (Breakpoints | Toggle),则红色光条覆盖光标处的指令,表示断点设置成功,重复上述操作,可以设置多个断点。将光标移到红色光条覆盖的指令,再次按下F2键,红色光条消失,表明此处断点撤销。 设置断点的目的是使程序执行到断点指令时暂停,以便检查执行结果。 (6) 检查单步执行结果指令执行后一定会使目标寄存器和状态标志发生变化,欲查看执行效果,怎么办? 在CPU窗口调试时因为窗口中有
6、寄存器、标志寄存器显示窗口,所以,当前指令执行后,可以从相关的显示窗口中看到结果。 在MODULE窗口调试时选中View |Registers可弹出寄存器和标志寄存器显示窗口,就可以查看执行结果。 (7) 检查内存数据区的内容如果被调试程序要对数据段或附加段进行操作,怎样检查结果?关键问题是要找出用户程序的数据段或附加段。以例题1为例,说明这一操作的实现过程。 如果调试是在MODULE窗口进行首先选择View | Dump ,弹出内存数据显示窗口,接着再按Ctrl+S弹出一个对话框,用户键入HELLO-用单引号括起来的这一字符串是例1用户数据段中设置的内容,TD根据用户的提示立即找出并显示用户
7、程序数据区。做好以上准备工作之后,按F8键单步执行指令,就可以看到用户数据段内容的变化。例1中的语句 就是为此项调试而设置的。 如果调试是在CPU窗口进行首先按Tab键,使内存数据显示区成为活动区,接下来的工作则与在MODULE窗口的调试是相同的。 5、程序修改下面的程序采用比较法,将一个8位二进制数转换成十进制数显示,其设计方法拙劣,语法错误很多,希望以它为蓝本,练习源程序的编辑、编译、链接和调试。同学应照原样编辑源程序,汇编之后,必定给出若干错误信息,再根据错误提示,修改源程序,直到汇编后没有错误时为止,然后进行链接、执行。正确的执行结果是在屏幕上显示: 100 + 9 = 109【程序流
8、程图】 1,程序一2,程序二【源程序】1,程序一DATA MESGDATA CODEBEG:LL1:SEGMENT DB HELLO DB0 , 0 , 0; ENDS SEGMENTUSE16 ASSUME CS: CODE , DS: DATAMOV AX , DATA MOV DS , AX MOV ES , AX; MOVCX , 5MOV MESG+5 , 0DH; MOV MESG+6 , 0AH ; MOV MESG+7 , $; CALLDISPMOV MESG+5 , 0 MOV MESG+6 , 0 MOV MESG+7 , 0LOOP LL1 MOV AH , 4CH I
9、NT21HDISPPROC MOV AH , 9MOV DX , OFFSET MESG INT 21HRETDISP ENDP CODEENDS ENDBEG2,程序二DATA SEGMENT N1 DW 0809H , AB N2 DB 100SUN DB ? MESG DB 100+9= DB 30H , 30H , 30HDATA ENDS CODESEGMENTASSUME CS: CODE , DS: DATABEG: MOV DS , DATAMOV BX , OFFSET SUMMOV AH , N1 MOV AL , N2ADD AH , AL MOV BX , AHCALL
10、N2_10 MOV AH , 9MOV DX , OFFSET MESG INT 21H MOV AH , 4CHINT21H N2_10 PROCLAST:CMP BX , 100 JCNEXT1 SUB BX , 100INCBX+7; ; ; ; 此处应为N1 DB 9 ; 输入错误,SUN与后段代码SUM不一致; 应加上$以提示信息结束;MOV指令不允许将立即数直接送给段寄存器;AH为八位,BX为十六位寄存器,寄存位置不明;错误同上; 错误同上; 错误同上JCBX , 10; 错误同上 ; 错误同上 ; 错误同上 ; 错误同上NEXT2 BX+8 NEXT1 BX+9 , SUM;源操
11、作数和目的操作数不能同时为存储器NEXT1: CMP SUB INC JMPNEXT2: N2_10: CODEADD RETBX , 10ENDP ; 此处无需冒号 ENDS ENDBEG【实验结果与分析】程序二中错误代码出现在第2、4、6、10、15、23、25、26、28、30、31、33、35行。错误原因已附在各行末尾,修改后的代码如下:DATA N1 N2 SUM MESG DATA CODE BEG:SEGMENT DB DB DB DB DB ENDS SEGMENTASSUME CS: CODE , DS: DATA MOV MOV MOV MOV ADD MOV CALL M
12、OV MOV INT MOV INTN2_10 LAST:PROC CMP JCSUB INC JMPNEXT1:CMP JCAX , DATA DS , AX AH , N1 AL , N2 AH , ALBYTE PTR BX , AH N2_10 AH , 9DX , OFFSET MESG21H 21HAH , 4CH;BX , OFFSET SUMMOV9 100? 100+9=30H , 30H , 30H,$BYTE PTR BX , 100 NEXT1BYTE PTR BX , 100 BYTE PTR BX+7 LASTBYTE PTR BX , 10 NEXT2INC JM
13、PNEXT2:ADD RETN2_10 CODEENDP ENDS ENDBYTE PTR BX+8 NEXT1BYTE PTR BX+9 , ALMOV AL , SUMBEG【实验名称】 顺序程序设计【实验目的】学习汇编语言基本操作指令和伪指令的应用;了解编程的基本方法。 【实验内容】【实验1】编写程序,计算(a + b) 2 * (a AND b),结果送入S单元。S单元的内容在TD里面观察,在实验 报告 附上运行完毕后所有通用寄存器及段寄存器的值。 【实验2】 定义一个双字变量VOLUME,从键盘输入长方体的长(a),宽(b)和高(h),计算它的体积,a,b,c均为单字节变量,结果保存
14、在VOLUME中(注意判断溢出)。 要求:上述实验中的各变量 单元 要在数据区定义; 用 TD(或debug)调试,运行并修改各变量的值,观察结果存放单元。 【程序框图】 【实验1】 【实验2】【程序代码】【实验1】DATA SEGMENT A DB 40 B DB 50 S DB ? DATA ENDS CODE SEGMENTASSUME CS:CODE, DS:DATA BEG: MOV AX, DATA MOV DS, AX MOV BL, A ADD BL, B MOV BH, 0 ADC BH, 0 MOV AL, A AND AL, B MOV CL, 2 MUL CLSUB B
15、X, AX MOV S, BX MOV AH, 4CH INT 21H CODE ENDSEND BEG【实验2】DATA SEGMENT A DB ? B DB ? C DB ?VOLUME DD ? DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA BEG: MOV AX, DATA MOV DS, AX MOV AH, 1 INT 21H SUB AL,30H MOV A, AL MOV AH,1 INT 21H SUB AL,30H MOV B,ALMOV AH,1 INT 21H SUB AL,30H MOV C,AL MOV BL,B MUL
16、BL MOV BL,A MOV BH,0 MUL BXMOV WORD PTR VOLUME,AX MOV WORD PTR VOLUME+2,DX MOV AH,4CH INT 21H CODE ENDSEND BEG 【实验结果】【实验1】:程序运行后,运行结果S=26H,与预期相符。所有通用寄存器即段寄存器的值如下:AX=1B6F BX=000F CX=0206 DX=3002 DS=04BA CS=0000 【实验2】:程序运行时,取a=4,b=5,c=6,运行后,VOLUME=120,与预期相符所有通用寄存器即段寄存器的值如下:AX=1B6F BX=000F CX=0206 DX=3
17、002 DS=04BA CS=0000【实验名称】 循环实验的设计【实验目的】 学习并掌握循环程序的设计方法。 【实验内容】【实验1】用表格形式显示ASCII字符。实验要求:按15行16列的表格形式显示ASCII码为10H - 100H的所有字符,即以行为主的顺序及ASCII码递增的次序依次显示对应的字符。每16个字符为一行,每行中的相邻两个字符之间用空白符(ASCII为0)隔开。 提示:(1) 显示每个字符可使用功能号为02的显示输出功能调用,使用方法如下:mov ah , 02hmov dl , 输出字符的ASCII码 int 21h本题中可把DI初始化为10H,然后不断使其加1(用INC
18、指令) 以取得下一个字符时ASCII码。(2) 显示空白符时,用其ASCII码0置入DI寄存器。每行结束时,用显示回车(ASCII为0dh)和换行符(ASCII为0ah)来结束本行并开始下一行。(3) 由于逐个显示相继的ASCII字符时,需要保存并不断修改dl寄存器的内容,而显示空白、回车、换行符时也需要使用DI寄存器,为此可使用堆找来保存相继的ASCII字符。具体用法是:在显示空白或回车、换行符前用指令 push dx把DI的内容保存到堆栈中去。在显示空白或回车、换行符后用指令pop dx恢复DI寄存器的原始内容。【实验2】编程计算:S=1+2+3+N 100的最大项数N以及对应的和S。 实
19、验要求: 将最大项数与和数分别存入N和SUM单元,用TD调试,运行程序并检查结果; 将结果在屏幕上以16进制数显示。显示格式:MAX N = H SUM = H。【程序框图】【实验1】【实验2】【实验1】【程序代码】CODE SEGMENT MAIN PROC FARASSUME CS:CODE BEG:MOV AH,02HMOV DL,10H ;设置初始输出为ASCII的10h MOV BL,15 ;输出显示为15行 E:MOV CX,16 ;设置循环次数,16,表示输出显示为16列 l:INT 21H ;显示输出PUSH DX ;推入堆栈MOV AH,02H MOV DL,0INT 21H
20、MOV AH,02HMOV DL,0INT 21H ;显示空白符POP DX ; 将栈顶元素推出 INC DL ; 设置下一个元素LOOP l ; 循环输出每行的16个ASCII元素PUSH DX ; 将下一行的首元素推入堆栈MOV AH,02HMOV DL,0DHINT 21HMOV AH,02HMOV DL,0AHINT 21H ; 输出换行POP DX ; 将栈顶元素推出DEC BLCMP BL,0 ;比较确定是否已经输出15行元素JNE E ; 若还未完成输出,则跳转至e,继续进行下一行元素的输出JE EXIT ; 否则退出程序 EXIT:MOV AX,4C00HINT 21H MAI
21、N ENDP CODE ENDSEND BEG【实验2】DATA SEGMENTN DB? ;开辟一个字节单元 SUM DB?MESG1 DBMAX N=,$ MESG2 DBSUM =,$ DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA;段分配BEG: MOV AX,DATA ;段基址DS MOV DS,AXMOV MOV L1: INC ADD CMP JBE SUB MOV MOV MOV MOV INT MOV AND ROR CMP JLADD NEXT: ADD MOV MOV INT MOV AND CMP JLADD NEXT1: ADD
22、 OV MOV INT MOV INT MOV MOV BL,0H ;给BL和AL赋初始值0 AL,0H BL AL,BL AL,64H L1 ;无符号数=跳转AL,BL ;所得AL大于100,故要减去BL N,BL ;最大项数N单元 SUM,AL ;和数SUM单元 AH,9;9号功能调用,输出字符串 DX,OFFSET MESG1 21HAL,N ;2号功能调用,输出两个空格 AL,0F0H ;屏蔽低四位 AL,4 ;右移4位 AL,10 ;与10比较 NEXT ;小于跳转NEXT AL,7 ;否则加7 AL,30HAH,02H DL,AL 21H AL,NAL,0FH ;屏蔽高4位 AL,
23、10 NEXT1AL,7 AL,30H AH,02H DL,AL 21HDL,H ;显示出H 21HAH,02H DL,0DHINT 21H ;回车 MOV AH,02H MOV DL,0AHINT 21H ;换行MOV AH,9 ;9号功能调用,输出字符串 MOV DX,OFFSET MESG2 INT 21HAND AL,0F0H ;屏蔽低四位 ROR AL,4 ;右移4位 CMP AL,10JLNEXT2 ADD AL,7 NEXT2: ADD AL,30HMOV AH,02H MOV DL,ALINT 21H MOV AL,SUMAND AL,0FH JLNEXT3ADD AL,7 N
24、EXT3: ADD AL,30H MOV AH,02H MOV DL,AL INT 21HMOV DL,HINT 21HMOV AH,4CH INT 21HCODE ENDS END BEG【实验1】实验一运行后显示结果为;与10比较 ;小于跳转NEXT ;否则加7;屏蔽高4位 ;显示出H ;返回DOS操作系统【调试结果】与预期相符 【实验2】实验二运行后结果为“MAX =0DH SUM =5BH”,与预期相符。【实验名称】 分支程序设计【实验目的】学习分支程序的结构,掌握具有分支结构程序的设计方法。 【实验内容】【实验1】分类统计字符个数COUNT_CHAR。【实验2】显示月份名direct
25、。试编写一程序,根据用户键入的月份数在屏上显示该月份的英文缩写名【程序代码及框图】【实验1】 DATA SEGMENT STRING LABEL BYTE MAX DB 80 ACTDB ?STOKN DB 80 DUP(?) DIGIT DB 0 LETTER DB 0 OTHER DB 0MESS1 DB PLEASE INPUT CHARS:,0DH,0AH,$ MESS2 DB 0DH,0AH,$ MESS3 DB DIGIT:,0H,$ MESS4 DB LETTER:,0H,$ MESS5 DBOTHER:,0H,$MESS6 DB H,0DH,0AH,$ N DB 3 DATA
26、ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA COUNT_CHAR PROC FAR PUSH DS SUB AX,AX PUSH AXMOV AX,DATA MOV DS,AX LEA DX,MESS1 MOV AH,09 INT 21HLEA DX,STRING MOV AH,0AH INT 21HLEA DX,MESS2 MOV AH,09H INT 21HLEA SI,STOKN SUB CH,CH MOV CL,ACT AGAIN: MOV AL,SI CMP AL,30H JL OTHER1 CMP AL,3AH JL DIGIT1 CMP AL,4
27、1H JL OTHER1 CMP AL,5BH JL LETTER1 CMP AL,61H JL OTHER1 CMP AL,7BH JLLETTER1OTHER1: INC OTHER INC SILOOP AGAIN JMP PRINT DIGIT1: INC DIGIT INC SILOOP AGAIN JMP PRINTLETTER1:INC LETTER INC SILOOP AGAIN PRINT: MOV CH,2 MOV BL,DIGIT LEA DX,MESS3 MOV AH,09 INT 21H ROTATE: MOV CL,4 ROL BL,CL MOV AL,BL AN
28、D AL,0FH ADD AL,30H CMP AL,3AH JL PRINT1 ADD AL,7H PRINT1: MOV DL,AL MOV AH,2 INT 21H DEC CH JNZ ROTATE LEA DX,MESS6 MOV AH,09 INT 21H DEC N CMP N,2 JZ LETTER2 CMP N,1 JZ OTHER2 JMP EXIT LETTER2: LEA DX,MESS4 MOV AH,09 INT 21H MOV CH,2MOV BL,LETTER JMP ROTATE OTHER2: LEA DX,MESS5 MOV AH,09 INT 21HMO
29、V CH,2MOV BL,OTHER JMP ROTATE EXIT: RETCOUNT_CHAR ENDP CODE ENDSEND COUNT_CHAR【实验2】 DATA SEGMENTMESG1 DB PLEASE INPUT THE NUMBER FOR MONTH,0DH,0AH,$ MESG2 DB ERROR!,0DH,0AH,$NUM DB 3 COUNT DB ? STORE DB 2 DUP(?) MONTAB DB JAN , FEB , MAR , APR , MAY , JUN DB JUL , AUG , SEP , OCT , NOV , DEC MONTH D
30、B 3 DUP(?),0DH,0AH,$ DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATAMOV DS,AX MOV ES,AX MOV DX,OFFSET MESG1 MOV AH,09H INT 21HMOV DX,OFFSET NUMMOV AH,0AH INT 21HCMP COUNT,0 JZ EXITCMP COUNT,2 JZ NEXTMOV AL,STOREXOR AL,30H MOV AH,0 JMP GOONNEXT: MOV AH,STORE MOV AL,STORE+1XOR AX,3030HCMP AH,0JZ GOON CMP AH,1JNZ LASTSUB AH,AH ADD AL,10 GOON: CMP AL,0JZ LASTCMP AL,12 JA LAST DEC AL MOV BL,3MUL BL LEA SI,MONTAB ADD SI,AX LEA DI,MONTH MOV CX,3CLD REP MOVSBDISP: MOV DX,OFFSET MONTH MOV AH,09H INT 21HJMP START LAST: MOV DX,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1