微机实验报告(DOC)
- 格式:doc
- 大小:1.78 MB
- 文档页数:34
微机实验报告学生姓名专业班学号指导老师年月日注:红色为程序修改部分实验一1、用命令A 汇编下列指令,判断指令正误并说明原因。
(1)ROR AX,8(2)LEA DI,[AX](3)MOV DS,2010(4)PUSH AL(5)OUT 900,AL(6)MOV [BX],0答:(1)ROR 为右移指令,每次移位只能移一个位。
(2)不能对累加器去偏移地址。
(3)立即数不能直接发送给段寄存器。
此程序正确应该改为:MOV AX,2010MOV DS,AX(4)字压入堆栈指令,它允许将 16 位的源操作数压入堆栈。
(5)OUT 指令是把累加 AL/AX 中的内容输出到指定的端口。
(6)错在不知道 0 是以字节型数据存储到[BX]还是以字型数据存储到[BX]。
2、说明可读写内存 RAM 和只读内存 ROM 的区别。
答:ROM 和 RAM 是计算机内存储器的两种型号,ROM 表示的是只读存储器,即:它只能读出信息,不能写入信息,计算机关闭电源后其内的信息仍旧保存,一般用它存储固定的系统软件和字库等。
RAM 表示的是读写存储器,可其中的任一存储单元进行读或写操作,计算机关闭电源后其内的信息将不在保存,再次开机需要重新装入,通常用来存放操作系统,各种正在运行的软件、输入和输出数据、中间结果及与外存交换信息等,我们常说的内存主要是指 RAM。
3、说明命令 T 和 P 的差别。
答:两个都是单步执行指令。
区别在于遇到调转程序 call 指令时,T 指令会跳到 call 指令中去一步一步的执行;而 p 指令遇到 call 指令时,它一下子全部执行后就跳出来,而不会一步一步的去执行。
指出任务 6 中程序段的出错原因,给出修改后的程序段。
4、利用T,P,G 命令,执行下列指令段,注意它们的不同之处。
(1) MOV DI,300MOV SI,400MOV CX,3CLDREP MOVSBINT 3--T 指令---G 指令---P 指令(2) MOV AH,2MOV DL,41INT 21INT 3---P 指令---G 指令实验总结:指令异同T一步一步执行G执行一段代码执行指令操作P在执行的过程中跳过循环(7)先在CS:200 处汇编一条RET 指令,再在CS:100 处汇编。
MOV BX,200CALL BXINT 3然后从MOV BX,200 处开始执行。
7、给出任务 7 中调试好的程序。
用命令 A 汇编下列程序段,并将程序写到硬盘上,然后调试程序段,观察程序段能否完成指定功能,若不能,说明原因,并修改程序。
(8)完成将DS:2000 开始的 5 个字节内存内容相加,并把相加的结果存放在DS2005 内存单元中。
MOV CX,5MOV AL,0MOV BX,2000nest: ADD AL,[BX]INC BXDEC CXLOOP nestMOV [BX],ALINT 3(9) 以双重循环来实现延时,然后再给AX 赋值。
MOV AX,0again1:MOV SI,3again2:MOV DI,3DEC DIJNZ again2DEC SIJNZ again1MOV AX,100INT 3SI 减为零8、回答问题思考。
a)、假设某内存单元的内容为 CCH,试问该内容如看作一条指令、看作无符号数、看作带符号数,那将分别表示什么?不查看教材中的指令系统代码,如何在DEBUG 下知道 CCH 表示一条什么指令?答:CC 指令:INT3 调试断点;无符号数:204带符号数:-52b)、在指令 MOV[BX,AX 中,操作数[BX]的寻址方式是什么?在 DEBUG 下执行完该指令后,如何查看执行结果?答:指令MOV[BX],AX 中,操作数[BX]的寻址方式是:寄存器间接寻址方式。
在DEBUG 下执行完该指令后,输入R 即可。
c)、可否随意在 DEBUG 提示符“-”后不带参数发出命令 G?什么情况下使用命令 G 时,可不用“=”给出执行的首地址?答:不带参数的 G 命令是指从当前 CS:IP 处开始运行,直到遇到返回指令、结束指令等才停止。
因此,除非你已知当前 CS:IP 就是你想开始的位置,同时在你所运行的程序中,有结束或返回指令,否则可能会转到不可预知的地方。
“=”而号可以在不管当前 IP 为什么的情况下指定起始地址,这大减少了出错的机率。
d)、分析出现死机的几种情况。
如何理解死机现象?试从计算机的工作原理进行解释。
答:情况有:1、散热不良 2、移动不当 3、设备不匹配 4、内存条故障 5、硬盘故障 6、硬件资源冲突 7 内存容量不够 8、病毒感染 9、初始化文件遭破坏 10、启动的程序太多 11、内存中冲突理解:死机就是 cpu 进入了死循环,不能中断退出到原来的管理进程。
通常一个进程去调用一个进程,就会把原来进程的内存地址放入堆栈,去执行新进程,执行完,就从堆栈找到原进程的地址,回到原进程继续执行。
死机的情况很多,多半是内核和驱动的问题造成的,通常应用程序不会让它做底层的事情,你总是可以在任务管理器里把它给中断的。
实验二汇编语言程序结构1.伪操作学习编辑下列源文件:data var0 var1 var2 var3 var4 data codestart: SEGMENTDB10101010B,‘TsingHua’ DW ‘efgh’DB-374,-1DW-1,9080HDDffeeddccHENDSSEGMENTASSUME CS:code,DS:dataMOVAX,dataMOVDS,AXMOVCX,var0LEA AX,var1ENDSENDstartcode三、实验内容有如下程序段,程序源文件名设为 EA1.asm:dataSEGMENTstringDB‘how are you doing?’,‘$’D_wordDW1234h,5678hDataENDSCodeSEGMENTASSUMECS:code,DS:datamainPROCFARBegin:PUSH DSMOVAX,0PUSH AXMOVAX,dataMOVDS,AXMOVSI,OFFSET stringMOVBL,stringRETmainENDPcodeENDSEND begin经汇编、连接后,形成 EA1.exe,在 DEBUG 下装入此文件,用 t 查看程序。
8.结束实验前,演示编程任务(1)(2)(3)(4)的运行结果,请指导,,,教师检查。
四、问题思考1.汇编语言程序中语句 END 后的标号作用是什么?答:END START 表示程序结束。
end 叫做结束语句,2.采用附录 2 介绍返回 DOS 的方法二中,可否将语句 main proc far 中的 far 属性去掉,为什么?答:不能;3.一个段的大小为多少?一定是 64KB 吗?如何在 DEBUG 下查看程序在内存的存放情况?画出编程任务 4 各段在内存的存放情况。
答:最大为64k,在dubug 中输入d 就是看内存存放情况的实验三1)显示 AL 中两位十六进制数程序B、程序清单CODE SEGMENTASSUME CS:CODESTART: MOV AL,3EHMOV BL,ALMOV DL,ALMOV CL,4SHR DL,CLCMP DL,9JBE NEXT1 ADD DL,7NEXT1: ADD DL,30HMOV AH,2INT 21H ;显示高位ASCII 码MOV DL,BLAND DL,0FHCMP DL,9JBE NEXT2ADD DL,7NEXT2: ADD DL,30HMOV AH,2INT 21H ;显示低位ASCII 码MOV AH,4CHINT 21HCODE ENDS ;返回DOSEND START2) 显示键入字符程序CMP AL,0DHJZ DONECMP AL,'0'JB NEXTCMP AL,'9'JA NUMBMOV DL,ALMOV AH,2INT 21HJMP START NUMB:CMP AL,41HJB NEXTCMP AL,5AHJA CHAR DISP:MOV DL,'C'MOV AH,2INT 21H NEXT: JMP START CHAR:CMP AL,61HJB NEXTCMP AL,7AHJA NEXTJMP DISP DONE: MOV AH,4CHINT 21HCODE ENDSENDSTART实验四1)偶校验程序清单:a、程序流程图开始将DS;SI 指向数据内存单元AL=(DS;SI)的偏移地址YAL=?‘$’NY是否为偶INC SIN偶数存储中(DS;SI)=ALINC DL结束b、程序:DSEG SEGMENTSTRN DB 'ASCDEfghijkLMNOPQuvw','$'N DB 00hDSEG ENDSCSEG SEGMENTASSUME CS: CSEG, DS: DSEGSTART: MOV AX, DSEGMOV DS, AXLEA SI, STRNAGAIN: MOV AL, [SI] CMP AL, '$'JE DONETEST AL, 0FFHJPE NEXTOR AL, 80HMOV [SI], ALINC DLNEXT: INC SIJMP AGAIN DONE: MOV N, DL MOV AH, 4CHINT 21HCSEG ENDSEND START实验结果:a、程序流程图:开始显示被加数和加数将加数和被加数由ASCII 码转化为十六进制b、程序清单:DATA SEGMENTDAT1 DB 70H, 80H, 90H, 0A0H, 0A1H, 0A2H, 0A3HDB 74H, 65H, 56HDAT2 DB 45H, 67H, 89H, 01AH, 02BH, 03CHDB 4DH, 05EH, 06FH, 04HDAT3 DB 10 DUP(?)DATA ENDSCSDE SEGMENTASSUME CS:CSDE,DS:DATA START:MOV AX,DATAMOV DS,AXLEA SI,DAT1LEA DI,DAT2LEA BX,DAT3MOV CX,10XOR AL,ALAGAIN:MOV AL, [SI]ADC AL, [DI]MOV [BX], ALINC SIINC DIINC BXLOOP AGAINMOV AH, 4CHINT 21HCSDE ENDSEND START计数值5CX清除最低位进位执行ADC 带进位加法指令AAA 调整结果送被加数存储区调整偏移量N CX-1=0?Y将十六进制结果转化为ASCII 码表示的字符串显示结果的和结束实验结果:实验五1)码型转换程序清单:a、程序流程图:开始MOV AX,DATAMOV DS,AXMOV CX,10LEA BX,BUFYNMOV AL,[BX]结束CX=?0MOV DL,ALPUSH CXMOV CL,4SHR DL,CLPOP CXY NCX-1<=9ADD DL,30HMOV AH,2INT 21HMOV DL,ALAND DL,OFHY<=9?ADD DL,30H MOV AH,2 INT 21HADD DL,7ADD DL,30HMOV AH,2INT 21HNADD DL,7ADD DL,30HMOV AH,2INT 21H INC BXDATA SEGMENTBUF DB 0ABH,0CDH,0DEH,01H,02H,03H DB 3AH,4BH,5CH,6FHDATA ENDSb、实验清单:CODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV CX,10LEA BX,BUFAGAIN: MOV AL, [BX]CALL HEXASCINC BXLOOP AGAINMOV AH,4CHINT 21HHEXASC PROC NEARMOV DL,ALPUSH CXMOV CL,4SHR DL,CLPOP CXCALL DISPMOV DL,ALAND DL,0FHCALL DISPRETHEXASC ENDPDISP PROCCMP DL,9JBE NEXTADD DL,7NEXT: ADD DL,30HMOV AH,2INT 21HRETDISP ENDPCODE ENDSEND START程序运行结果为:开始MOV AX,DATA MOV DS,AX LEA DX,BUF MOV AH,9INT 21HLEA SI,BUF MOV CL,[SI+2] MOV CH,0INC SIPOP AXMOV DL,CHARMOV AH,2INT 21HMOV DL,ALAND DL,OFHY<=9?NMOV AL,CHAR MOV AH,0 PUSH SI PUSH CX PUSH AX ADD DL,30HMOV AH,2INT 21ADD DL,7ADD DL,30HMOV AH,2INT 21PUSH BPMOV BP,SPMOV SI,[BP+10]MOV CX,[BP+6]XOR AH,AH结束YCX=?0CX-1NYAL=?[SI]INC AHINC SIINC SINMOV AL,AHMOV[BP+10],AXPOP BPB、程序清单:DATA SEGMENTCHAR DB "b"BUF DB "Qbbbbbbbaaaaaaa$"N EQU $-BUFDATA ENDSscode segmentassume cs: scodeCHECK PROC FARPUSH BPMOV BP,SPMOV SI,[BP+10]MOV CX,[BP+8]MOV AX,[BP+6]XOR AH,AHAGAIN: CMP AL,[SI]JNE NEXT1INC AHNEXT1: INC SILOOP AGAINMOV AL,AHMOV [BP+10],AXPOP BPRET 4CHECK ENDPscode endsMCODE SEGMENTASSUME CS: MCODE, DS: DATA START: MOV AX,DATAMOV DS,AXLEA DX,BUFMOV AH,9INT 21HLEA SI, BUFMOV CL, [SI+1]MOV CH, 0INC SIINC SIMOV AL,CHARMOV AH,0PUSH SIPUSH CXPUSH AXCALL CHECK MOV DL,CHAR MOV AH,2INT 21HPOP AXMOV DL,ALAND DL, 0FHCMP DL,9JBE NEXTADD DL,7NEXT: ADD DL,30H MOV AH,2INT 21HMOV AH,4CHINT 21HMCODE ENDS END START程序运行如下:实验六1)转换字符串小写字母为大写字母:A、程序清单:NEXTRN DNTOUP: FAR PUBLICSTRING1, STRING2 DATASEGMENTSTRING1DB 'This is a Book','$'STRING2DB 80 DUP (0)DATAENDSCODESEGMENTASSUME CS: CODE, DS: DATA START:MOV AX, DATAMOVDS, AXCALL DNTOUPMOV AH, 4CHINT 21HCODEENDSENDSTARTPUBLICDNTOUPEXTRNSTRING1: BYTE, STRING2: BYTE CODESEGMENTASSUMECS: CODEDNTOUPPROC FARMOVBX,0CYCLE:MOVAL, STRING1 [BX]CMPAL,24HJZ DONECMPAL,61HJB NEXT debugCMPAL, 7AHJA NEXTSUB AL,20HNEXT:MOVSTRING2 [BX],ALNC BXJMP CYCLEDONE:MOVAL,'$'MOVSTRING2[BX],ALMOVDL, 0DHMOVAH, 2INT 21HMOVDL, 0AHMOVAH, 2INT 21HLEA DX, STRING1MOVAH, 9INT 21HMOVDL, 0DHMOVAH, 2INT 21HMOVDL, 0AHMOVAH, 2INT 21HMOVDX, OFFSET STRING2MOVAH,9RETDNTOUP CODE END ENDP ENDS程序运行如下:2)查找指定字符,并返回地址值A、程序清单:EXTRN FINDC:FARPUBLIC STRINDATA SEGMENTSTRIN DB 'LINK DISPLAY SUBR OUNTINE $' ADDR DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AXMOV AH,1INT 21HCALL FINDCMOV ADDR,DIMOV DL,ALPUSH AXMOV CL,4SHR DL,CLCMP DL,9JBE JUMPADD DL,7 JUMP:ADD DL,30HMOV AH,2INT 21HMOV AH,4CHINT 21HCODE ENDSEND START;FINDC.ASM 为子模块程序名PUBLIC FINDCEXTRN STRN:BYTECODE SEGMENTASSUME CS:CODE FINDC PROC FARLEA DI,TRIN AGAIN:CMP BYTE PRT[DI],'$'JZ DONECMP AL,[DI]JNZ NEXTDONE1:RETNEXT:INCDIJMP AGAIN DONE:MOV DI,0FFFFHJMP DONE1FINDC ENDPCODE ENDSEND实验七1、统计小写字母个数A、流程图:开始提示输入字符串回显示输入的字符串取字符串进行判断Y所取字符的ASCII 码是否大于97 小于122?N压栈并DX+1存入该字符并BX+1字符个数减1N字符个数是否为0?Y存入字符个数显示所有字符的个数、小写字母及小写字母的个数。