四川大学水利水电学院农水系
研究生课程--土壤分析方法
实验报告二
实验名称: 土壤水量转换 探究
实验地点: 水电学院灌排实验室
年 级: 2012级硕士研究生
姓 名: 胡中科
学 号:
实验时间: 2012 年 10 月 25 日
第二篇:四川大学微机原理实验报告
《微机原理与接口技术实验报告》
学 院: 电气信息学院
班 级: 109班
老 师:
学 号:
姓 名:
实验一 汇编语言程序的上机步骤
一、实验目的:
1、了解汇编语言程序的执行流程。
2、熟悉和使用DEBUG调试工具,分析和读懂一些与硬件相关的小程序。
3、通过对程序的分析,理解计算机程序的执行过程。
4、了解并逐步熟悉汇编语言的编辑方法及特点.
5、复习8086汇编语言的段结构、常用的指令与伪指令、存储空间的分配等。
6、掌握汇编语言的编辑、汇编及连接的过程。
7、了解并逐步掌握运用DEBUG进行调试汇编语言程序
二、实验内容:
以文件名为1.asm源程的序为例,学习汇编语言的上机步骤。汇编语言程序MASM软件由EDIT.COM编辑器,汇编MASM.EXE程序,连接LINK.EXE程序以及DUEBUG.EXE调试程序四个部分组成。汇编语言编制完成后,在计算机上的操作过程就分为四个阶段。
1. 编辑EDIT.COM:首先输入源程序:在记事本里录入,注意在保存时文件格式必须选择所有文件,文件后缀名为.ASM, 即保存时文件名为XXX.asm。
2.用汇编程序MASM.Exe对源程序.ASM文件汇编,生成目标文件.OBJ:双击MASM软件中的MASM.Exe文件框,在命令行后键入源程序名XXX.asm,(如果源程序与MASM软件在同一路径下,可以只键入文件名,而不要后缀)
3.连接LINK.EXE双击MASM软件中的LINK.Exe文件框,在命令行后键入目标文件名XXX.OBJ(如果源程序,目标文件与MASM软件在同一路径下,可以只键入文件名,而不要后缀)如果连接没有错误,就会产生一个XXX.EXE的可执行文件,如果.OBJ文件有错误,连接时会指出错误的原因。
4.运行和调试DEBUG.exe运行可执行文件,即双击XXX.EXE文件框即可,或在DOS下运行此程序,E:\XXX.EXE。
三、程序流程图:
四、程序清单与注释:
DATA SEGMENT
NUM1 DB 35,35H
NUM2 DW 35,35H
NUM3 DB 4 DUP (34,3 DUP (34H))
NUM4 DB '34AB'
NUM5 DW '34','AB'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET NUM1
MOV AL,[BX]
MOV BX,OFFSET NUM5
MOV AX,[BX]
MOV AH,4CH
INT 21H
CODE ENDS
END START
五、运行结果:
将以上程序在笔记本中保存为xueyuan1.ASM
编译后显示编译成功:
运行结果如下:
运行可执行文件出现此界面后“闪退”
六、实验心得:
通过本次实验,我了解了一个汇编程序在计算机上的执行步骤,如何实现一个汇编程序的编辑、连接、运行。能看懂一些十分简单的汇编小程序。汇编语言是一种面向机器的“低级”语言,是计算机能够提供给用户的最快而最有效的语言,也是能够利用计算机所有硬件特性并能直接控制硬件的唯一语言。要真正理解计算机的工作过程,理解计算机程序的执行过程,就必须学习汇编语言。也正是因为如此,汇编语言程序设计是计算机专业和电子,自动控制等相关专业的重要课程。
实验二 汇编语言程序设计
------------- 循环结构程序
一、实验目的:
1.理解8086各种指令的功能。
2.进一步学习程序的调试。
3.掌握循环结构程序的设计编程。
二、实验内容:
用“冒泡“法对一组数300,250,280,240,260,按从小到大的顺序排列。
提示:用冒泡的方法对一组数据元素排序,它的基本方法是:将相邻的两个元素通过比较进行排序,通过多次,多遍的邻元素排序,实现整个一组数的排序。
对于5(N)个元素,整个排序通过4遍(=N-1)邻元素排序完成。每一遍的排序由若干次邻元素的排序组成。
4遍排序中,邻元素的排序依次为4,3,2,1遍。完成第一遍排序后,最大数沉底,已经到达它应占据的位置,不需要参加下一遍的排序。
外循环的次数为CX=4次(N-1),内循环的次数为4,3,2,1(DEC CX)
要求:
1. 编制程序,从键盘输入300,250,280,240,260这五个数,并思考如何输入任意五个数,五个数可以有一位数,二位数,三位数,四位数,五位数,混合输入比较大小;
2. 对这组数用冒泡法进行排序,并输出原始数据及排序后数据,两两数据之间用空格分隔;
3. 利用DEBUG调试工具,用D0命令,查看排序前后,内存数据的变化,以及会用调试命令查看程序运算中寄存器中的值;
4. 去掉最大和最小的两个值,求出其余值的平均值,并输出最大值,最小值和平均值;
5. 用压栈PUSH和出栈POP指令“先进后出”的特点,设计算法将平均值按位逐个输出(即输出263);
6. 用移位指令将平均值以二进制串的形式输出。
7. 设计程序要有模块化的思想,用子程序实现不同的功能;
8. 所有数据输出前要用字符串的输出指令,进行输出提示(如:zui da zhi shi : 300等),所有数据结果能清晰地显示在电脑屏幕上。
三、程序流程图:
子程序有:SRZH(输入转化)子程序,XS(显示)子程序,PAIXU(排序)子程序。
四、程序清单与注释:
DSEG SEGMENT
SR DB 40,?,20 DUP(?)
VAR DW 5 DUP(0)
AVG DW ?
M DW 10
P DW 3
D DW 2
SHURU DB 'QING SHU RU SHU JU:','$'
XS1 DB 0DH,0AH,'YUAN SHI SHU JU:','$'
XS2 DB 0DH,0AH,'PAI XU HOU SHU JU:','$'
XS3 DB 0DH,0AH,'ZUI DA ZHI SHI:','$'
XS4 DB 0DH,0AH,'ZUI XIAO ZHI SHI:','$'
XS5 DB 0DH,0AH,'PING JUN ZHI SHI:','$'
XS6 DB 0DH,0AH,'ER JIN ZHI PING JUN ZHI SHI:','$'
DSEG ENDS
STACK SEGMENT
DW 100 DUP (?)
STACK ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG,SS:STACK,ES:DSEG
START: MOV AX,DSEG
MOV DS,AX
MOV ES,AX
MOV DX,OFFSET SHURU ;显示输入的提示符
MOV AH,09H
INT 21H
LEA DX,SR
MOV AH,0AH ;输入待排序的字符
INT 21H
CLD
MOV CX,5
LEA SI,SR
ADD SI,2
LEA DI,VAR
LOOPS: CALL SRZH ;调用子程序SRZH进行转化
LOOP LOOPS ;循环5次
MOV DX,OFFSET XS1 ;显示未排序的提示符
MOV AH,09H
INT 21H
MOV CX,5
LEA SI,VAR
LOOP1: CALL XS ;调用子程序XS进行未排序的数据显示
LOOP LOOP1 ;循环5次
CLD
MOV CX,4
MOV DX,1
LOOP2: CALL PAIXU ;调用子程序PAIXU进行排序
INC DX
LOOP LOOP2
MOV DX,OFFSET XS2
MOV AH,09H
INT 21H
MOV CX,5 ;计数寄存器CX置5才能显示5个数
LEA SI,VAR
LOOP3: CALL XS ;调用子程序XS进行排序后结果显示
LOOP LOOP3
MOV DX,OFFSET XS3 ;输出最大值
MOV AH,09H
INT 21H
LEA SI,VAR
ADD SI,8 ;SI要进行加8处理后指向排在最后的最大值
CALL XS
MOV DX,OFFSET XS4 ;输出最小值
MOV AH,09H
INT 21H
LEA SI,VAR
CALL XS
MOV DX,OFFSET XS5 ;输出去掉最大最小值的平均值
MOV AH,09H
INT 21H
MOV AX,[SI]
MOV BX,[SI+2] ;取第二个数据
ADD AX,BX
MOV BX,[SI+4] ;取第三个数据(这样相加相当于去掉了最大最小值)
ADD AX,BX
CWD
IDIV P ;把相加和除以三来求得平均值
LEA SI,AVG
MOV [SI],AX ;把求得的平均值存入AVG
CALL XS
MOV DX,OFFSET XS6 ;输出2进制的平均数
MOV AH,09H
INT 21H
MOV CX,16
LEA SI,AVG
MOV AX,[SI]
LP2: CWD
IDIV D ;采用不断除以二并压入栈的方式得到数据的二进制表示方式
PUSH DX
LOOP LP2
MOV CX,16
LP3: POP DX
ADD DL,30H ;将数据弹出站并且加30H进行ASCII的转换显示
MOV AH,2
INT 21H
LOOP LP3
MOV AH,4CH
INT 21H
SRZH PROC ;输入转化子程序
MOV BX,2 ;BX取2,可以循环3次,相当于把3个字节的数转化为1个字
MOV DX,0
ZH1: MOV AX,0
LODSB ;从SR串中读出数据
SUB AL,30H
ADD DX,AX
MOV AX,DX
MUL M
MOV DX,AX
DEC BX
JNZ ZH1
MOV AX,DX
STOSW ;把字数据以16进制存入VAR数据串中
INC SI
INC SI ;跳过3位数后面的空格或逗号
RET ;输入转化子程序结束
SRZH ENDP
XS PROC ;显示子程序
LODSW
MOV BX,3 ;数据在十进制时的是三位数所以计数部分BX置三
ZL1: CWD
IDIV M ;采用除以16的方法不断得到每一位数
PUSH DX ;将每一位压入栈
DEC BX
JNZ ZL1
MOV BX,3
ZL2: POP DX ;压完一个数后立即出栈进行显示
ADD DL,30H
DEC BX
MOV AH,2
INT 21H
JNZ ZL2
MOV DL,20H ;每个数据间由空格隔开
MOV AH,2
INT 21H
RET ;显示子程序结束
XS ENDP
PAIXU PROC ;排序子程序
PUSH CX
MOV CX,5
SUB CX,DX
MOV SI,0
RECMP: MOV AX,VAR[SI]
CMP AX,VAR[SI+2]
JLE NOCH
XCHG AX,VAR[SI+2]
XCHG AX,VAR[SI]
NOCH: INC SI
INC SI
LOOP RECMP
POP CX
RET ;排序子程序结束
PAIXU ENDP
CSEG ENDS
END START
五、运行结果:
六、实验心得:
因为很容易出错,编辑的错误很容易找,通过masm.exe和edit.exe就能找到。难的是算法和逻辑上的错误,看了很多遍程序总觉得没有错误,但是就是1个小问题就导致全部出错,比如我的这个程序里的SRZH(输入转化)子程序最后是有2行的INC SI,相当于SI加了2,就直接跳过数中间的空格或者逗号,但是如果只加了1行的话,程序能运行,但是最后输出的全是乱码。
实验三 8253定时器/计数器与接口实验
------乐曲程序
一、实验目的:
学习8253计数器2输出方波信号用以驱动扬声器发声的原理,通过程序设置计数器2的输出波形的频率和延续时间,控制扬声器的音调和发生长短。
二、实验内容:
1.设计程序让微机演奏一段两只老虎的乐曲。
2.思考如何让PC机演奏一遍,两遍以及数遍这段两只老虎的乐曲,并修改程序实现。
三、程序流程图:
四、程序清单与注释:
DATAS SEGMENT
DATAS ENDS
STACK SEGMENT PARA STACK 'STACK'
SSS DW 100 DUP(?) ;堆栈段代码
STACK ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AH,1
INT 21H
MOV AH,0
SUB AX,30H
MOV CX,AX
AGAIN:
PUSH CX
MOV AX,DATAS
MOV DS,AX
MOV CX,2
A: MOV BX,262 ;两只老虎
CALL YINYUE
MOV BX,294
CALL YINYUE
MOV BX,330
CALL YINYUE
MOV BX,262
CALL YINYUE
MOV BX,50
CALL DELAY
LOOP A
MOV CX,2
A1: MOV BX,330 ;跑得快
CALL YINYUE
MOV BX,349
CALL YINYUE
MOV BX,392
CALL YINYUE
MOV BX,250
CALL DELAY
LOOP A1
MOV CX,2
A2: MOV BX,392 ;一只没有耳朵,一直没有尾巴
CALL YINYUE1
MOV BX,440
CALL YINYUE1
MOV BX,392
CALL YINYUE1
MOV BX,349
CALL YINYUE1
MOV BX,330
CALL YINYUE
MOV BX,262
CALL YINYUE
MOV BX,50
CALL DELAY
LOOP A2
MOV CX,2
A3: MOV BX,294 ;真奇怪
CALL YINYUE
MOV BX,196
CALL YINYUE
MOV BX,262
CALL YINYUE
MOV BX,250
CALL DELAY
LOOP A3
POP CX
DEC CX
CMP CX,0
JNZ AGAIN
MOV AH,4CH
INT 21H
YINYUE PROC NEAR
MOV AX,34DCH ;输出音符的特定频率
MOV DX,12H
DIV BX
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
IN AL,61H ;开扬声器
OR AL,3
OUT 61H,AL
PUSH CX ;延时1s
MOV BX,500
DEL1:MOV CX,2800
DEL2:LOOP DEL2
DEC BX
JNZ DEL1
POP CX
IN AL,61H ;关扬声器
AND AL,0FCH
OUT 61H,AL
RET
YINYUE ENDP
YINYUE1 PROC NEAR
MOV AX,34DCH ;输出音符的特定频率
MOV DX,12H
DIV BX
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
IN AL,61H ;开扬声器
OR AL,3
OUT 61H,AL
PUSH CX ;延时0.5s
MOV BX,250
DEL1:MOV CX,2800
DEL2:LOOP DEL2
DEC BX
JNZ DEL1
POP CX
IN AL,61H ;关扬声器
AND AL,0FCH
OUT 61H,AL
RET
YINYUE1 ENDP
DELAY PROC NEAR ;子程序DELAY1,延时0.2s
PUSH CX
DEL1:MOV CX,2800
DEL2:LOOP DEL2
DEC BX
JNZ DEL1
POP CX
RET
DELAY ENDP
CODES ENDS
END START
五、运行结果:
六、实验心得
通过本次实验,我第一次用8253通过电脑发声,了解了其编程过程,学到了很多新的知识。我理解了汇编语言中编程的基本步骤,掌握了通过地址对数据赋值的方法。掌握芯片的使用方法,了解了计算机编程过程中的相关知识。特别是能够是主板发出声音,我觉得很有成就感,自己编的小调尽管十分粗糙,我还是从中得到了快乐。