微机应用实习报告
学院:航空自动化学院
班级:091143C
学号:091143311
姓名:
指导老师:
实习时间:20xx年3月12日-20xx年3月16日
20xx年3月16日
实习内容
第一题:用switch……case开关结构得出各月份的季节。 程序如下:
>> month=input('please input a number\n');
switch (month)
case {3,4,5}
season='This month is spring';
case {6,7,8}
season='This month is summer';
case {9,10,11}
season='This month is autumn';
case {12,1,2}
season='This month is winter';
otherwise
season='wrong';
disp('wrong')
end
disp(['' season])
运行结果如下:
please input a number
8
This month is summer
>>
第二题:求积分?2
(x2+2y2+z2)dxdydz
程序如下:
>> clear;
syms x y z;
fun=x^2+2*y^2+z^2;
s=int(int(int(fun,z,sqrt(x*y),y*x^2),y,sqrt(x),x^2),x,2,3)
f=vpa(s,10) 3x2x2y
运行结果如下:s =
524526833/5940-21453984/38675*3^(1/2)+27000/1547*3^(1/4)+24/25*3^(3/4)+9067264/348075*2^(1/2)-18176/4641*2^(1/4)-64/225*2^(3/4)
f =87400.23106
>>
第三题:下面是某班级学生的期末成绩,要对其进行如下操作,请写出相应的命令。
①求各门课平均值;
②求每名学生总成绩并排名; ③求各门课的最高分,最低分。
程序如下:
>> clear;
a=[76 71 82 62]; b=[54 73 82 90]; c=[60 63 70 72]; d=[96 81 75 86]; e=[a;b;c;d]; zong=[0 0 0 0]; disp('各科平均分'); pingjun=(a+b+c+d)/4 for j=1:length(e(:,1)) for i=1:length(e(1,:))
zong(j)=zong(j)+e(j,i); end end
disp('每名同学总成绩'); zong xu=zong; a=sort(xu); xu=fliplr(a); b=0;
for i=1:length(zong)
for j=1:length(xu)
if(zong(i)==xu(j)) mingci(i)=j; b=1;
end
if(b==1)
b=0;
break;
end
end
end
disp('名次');
mingci
sort(e);
disp('各科最低分');
zuidi=ans(1,:)
disp('各科最高分');
zuigao=ans(length(e(:,1)),:) 运行结果如下:
各科平均分
pingjun =
71.5000 72.0000 77.2500 每名同学总成绩
zong =
291 299 265 338
名次
mingci =
3 2 4 1
各科最低分
zuidi =
54 63 70 62
各科最高分
zuigao =
96 81 82 90 >>
第四题:解方程组Ax=B ??6x1?3x2?4x3?3?
?2xx?
1?52?7x3??4
??
?8x1?4x2?3x3?7??
程序如下: 77.5000
>> syms x1;syms x2;syms x3;
[x1,x2,x3]=solve('6*x1+3*x2+4*x3=3','-2*x1+5*x2+7*x3=-4','8*x1-4+x2-3*x3=7') 运行结果如下:
x1 =
107/150
x2 =
4/3
x3 =
-33/25
第五题:列出一个求fibonnaci数的程序。它是一个数列,从
[1,1]开始,由数列的最后两个元素之和生成新的元素,以此类推。
程序如下:
>> syms n;
a=[10];
n=3;
a(1)=1;
a(2)=1;
while(n<=24)
a(n)=a(n-2)+a(n-1);
n=n+1;
end
disp(a);
运行结果如下:
Columns 1 through 6
1 1 2 3 5 8
Columns 7 through 12
13 21 34 55 89 144
Columns 13 through 18
233 377 610 987 1597 2584
Columns 19 through 24
4181 6765 10946 17711 28657 46368
>>
第六题:编写一个求素数的程序;只能被自己和一整除的数。 程序如下:
>> a=[];
i=1;n=1;
while(n<=218)
if(isprime(n)==1)
a(i)=n;
i=i+1;
end
n=n+1;
end
disp(a)
运行结果如下:
Columns 1 through 13
2 3 5 7 11 13 17 19 23 29 31 37
Columns 14 through 26
43 47 53 59 61 67 71 73 79 83 89 97
Columns 27 through 39
103 107 109 113 127 131 137 139 149 151 157 163
Columns 40 through 47
173 179 181 191 193 197 199 211
>>
第七题:运用protel画图工具作发射和接收电路图。 一:发射电路 41 101 167
绘图结果:
二:接收电
路
实习心得:20xx年3月12日-20xx年3月16日为期一个星期的微机应用实习,让我学到了很多。这次实习的内容虽然都是以前已经学过的,比如软件matlab在数字信号处理实习中应用过,软件protel在模拟电子技术课程设计里面用过,编程的知识在单片机、C语言、微机原理等课程中都学过,但是刚开始老师给了我们题目之后,我发现遇到了很多难题。比如说matlab的使用,编程中的某些语句,比如循环语句、条件语句的使用,protel中文件的建立都或多或少的有点生疏了,在这次实习中都重新温习了一遍。不仅如此,实习中也学到了很多新知识。比如积分符号等一些数学公式的输入,让我学会了应用数学公式编辑软件。程序中积分的代码,矩阵以及线性方程组的解法,数据的统计与分析,protel中各种元件的画法以及编辑新的元件的方法等等……一种经历就是一种提高,实习的机会就是一个锻炼的机会,我很高兴能有这种机会并很好地利用它来充实自己!!!
第二篇:民航大学微机原理实验报告及试验程序
微机原理与接口技术
实验报告
实验环境:Windows XP SP3
实验软件:masm,link,debug,edit。
Test 1:debug命令及汇编指令和寻址的应用。
NO.1设堆栈指针SP=2000H,AX=3000H,BX=5000H;请编一程序段将AX和BX的内容进行交换。要求:用3种方法实现。
方法一
CODE SEGMENT
ASSUME CS:CODE
START: MOV AX,3000H
MOV BX,5000H
MOV CX,AX
MOV AX,BX
MOV BX,CX
CODE ENDS
END START
方法二
CODE SEGMENT
ASSUME CS:CODE
START: MOV AX,3000H
MOV BX,5000H
XCHG AX,BX
CODE ENDS
END START
方法三
CODE SEGMENT
ASSUME CS:CODE
START: MOV AX,3000H
MOV BX,5000H
PUSH AX
PUSH BX
POP AX
POP BX
CODE ENDS
END START
NO.2分别执行以下指令,比较寄存器寻址,寄存器间接寻址和相对寄存器寻址间的区别。
MOV AX,BX 寄存器寻址,将BX内容送AX
MOV AX,[BX] 寄存器间接寻址,将DS:BX内存单元内容送AX
MOV AX,10[BX] 寄存器相对寻址,将DS:BX+10内存单元内容送AX
NO.3已知有如下程序段:
MOV AX,1234H
MOV CL,4
在以上程序段的基础上,分别执行以下指令:
ROL AX,CL AX=4123H
ROR AX,CL AX=3412H
SHL AX,CL AX=4120H
SHR AX,CL AX=0412H
SAR AX,CL AX=0041H
RCL AX,CL AX=0410H
RCR AX,CL AX=0041H
NO.4设有以下部分程序段:
TABLE DW 10H,20H,30H,40H,50H
ENTRY DW 3
┇
LEA BX,TABLE
ADD BX,ENTRY
MOV AX,[BX]
┇
要求:(1)将以上程序段补充成为一个完整的汇编程序。
(1) DATA SEGMENT
TABLE DW 10H,20H,30H,40H,50H
ENTRY DW 3
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START: MOV AX,DATA
MOV DS,AX
LEA BX,TABLE
ADD BX,ENTRY
MOV AX,[BX]
MOV AH,4CH
INT 21H
CODE ENDS
END START
(2)AX=3000H
Test2:汇编语言程序的调试与运行
NO.1实验内容:求内存单元中所定义的两个字节变量的连续内容之和。
源代码如下:
方法一:
DATA SEGMENT
A DB 5CH,85H
B DB 43H,0ABH
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,SEG DATA
MOV DS,AX
MOV SI,0
MOV AL,A[SI]
ADD AL,B[SI]
MOV A[SI],AL
INC SI
MOV AL,A[SI]
ADC AL,B[SI]
MOV A[SI],AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
方法二:定义字
DATA SEGMENT
A DW 5C85H
B DW 43ABH
C DW ?
C=A+B
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AH,4CH
INT 21H
CODE ENDS
END START
方法三:直接寻址
DATA SEGMENT
A DB 5CH,85H
B DB 43H,0ABH
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,SEG DATA
MOV DS,AX
MOV AL, [1000]
ADD AL,[1002]
MOV [1000],AL
INC SI
MOV AL,[1000]
ADC AL,[1002]
MOV [1000],AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
分析总结:本程序一采用了变址寻址方式,通过SI作为变址寻址寄存器,经由si改变来使加法指令寻址地址变化,从而实现两个字节之间相加。两个自己之间分别通过ADD与ADC指令进行进位的衔接。程序二在DATA定义中直接使用赋值语句将A,B的和放入C中。程序三于程序以类似,只不过将A[SI]的寻址方式变为[1000]的直接寻址,把其地址值直接拿来使用。
程序运行结果如上图所示
NO.2 编写计算表达式2*(X+Y-50)/Z值的程序,将上与玉树分别放在A,B中。(XY均为32位有符号数,Z为16位有符号数。A,B为字)
原代码如下
data segment
X dw 1234H,5678H
Y dw 1753H,1320H
Z dw 1002H
A dw ?
B dw ?
data ends
code segment
assume CS:code,DS:data
start:
mov ax,seg data
mov ds,ax
mov si,0
mov cx,0050H
mov bx,X[si]
add bx,Y[si]
sub bx,cx
mov X[si],BX \完成括号内加减法内容
mov BX,X[si+2H]
adc BX,Y[si+2H]
mov X[si+2H],BX
shl X[si],1 \左移乘2
rcl X[si+2H],1
mov ax,X[si+2h]
cwd
idiv Z[si]
mov cl,02H
sal ax,cl
mov A[si],ax
mov ax,X[si]
add ax,dx
cwd \位拓展
div Z[si] \除
add A[si],ax \按要求保存结果
mov B[si],dx
mov ah,4cH
int 21H
code ends
end start
分析总结:实验在32位数加减乘除运算是遇到困难。同时在有符号除法处遇到溢出困难。经过对字分开运算后在整合,问题得到解决
Test 2:分支结构程序设计
NO.1实验内容:编写程序,实现将大写字母转换为小写字母的程序。
源代码如下:
data SEGMENT
msg DB 'I am a student$'
LEN EQU $-msg
DATA ENDS
code SEGMENT
assume CS:code,DS:data
START:
mov ax,data
mov ds,ax
mov bx, offset msg
MOV CX,LEN \获取字符串长度
mov dl,'a' \设置大小比较值
lop:MOV AL,[bx]
CMP al,dl \比对从字符串中读取的某个字符与a的ASCLL码的大小来判断是否需要转换
jb next \如不需转化,直接跳转至next
sub al,20h
mov [bx],al
next:inc bx \计数部分自加一以统计字符串是否读完
loop lop \读完跳出
mov dx,offset msg
mov ah,09h
int 21h \保存并显示出修改后的字符串
mov ah,4ch
int 21h
code ends
end start
程序运行结果如上图
Test 4:循环程序设计
NO.3 数据段开始区域中,连续存放着十个无符号数,变成虚找出这十个数中最大的一个数,并存在该数据区的后面。
原代码如下:
data segment
num db 11h,99h,55h,99h,33h,22h,44h,66h,88h,10h
len equ $-num
data ends
code segment
assume cs:code,ds:data
start:
mov dx,seg data
mov ds,dx
mov si,0
mov cx,len
sub cx,1 \读取字符串长度后减1得出所需循环次数
mov al,[si]
lop:clc \进位清零
mov bl,[si+1]
cmp bl,al \与之前读取的数比较
inc si
jb next
mov al,bl \若大于之前的数,则保存后者
next:loop lop \循环,与下一个数进行比较
mov num[si+1],al \将最后得出的最大数保存
mov ah,4ch
int 21h
code ends
end start
程序运行结果如上图所示
Test 6:DOS中断功能调用程序设计
NO.1 编写一个程序使键盘输入的一个字符,将ASCLL码显示。
CODE SEGMENT
ASSUME CS:CODE
MOV AH,09H
MOV AH,1
INT 21H \从键盘输入字符
MOV DL,AL
mov ah,02h
int 21h
mov ah,4ch \输出ASCLL码,结束程序
int 21h
code ends
end start
NO.2 编程,判断键盘输入字符。若是数字显示该数字,若不是则显示“It’s not a number!”
DATA SEGMENT
INFOR1 DB 0AH,0DH,"Please Press any key to input a number:$"
INFOR2 DB 0AH,0DH, " It’s not a number! $"
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET INFOR1
MOV AH,09H
MOV AH,1
INT 21H \从键盘输入字符
CMP AL,'9' \和9比大小
JB NEXT \不符合要求跳转NEXT
CMP '0', AL \和0比大小
JB NEXT \不符合要求跳转NEXT
mov dl,al
mov ah,02h
int 21h
mov ah,4ch \符合要求输出字符,结束程序
int 21h
NEXT:
MOV DX,OFFSET INFOR2 \不符合要求,输出字符串It’s not a number!
MOV AH,09H
INT 21H
mov ah,4ch
int 21h \结束程序
code ends
end start
实验分析及总结:
实验过程中,我发现了这样一些问题:
1. 没有彻底的理解课上的知识
2. 课下没有自己亲手操作汇编程序,上手生疏
3. 对一些语法,寻址方式的应用掌握不够精确
4. 程序的精简化合理化布局能力还应加强
在今后的学习中,我将加强课上听讲的认真程度,不遗漏任何知识点;同时课下利用好自己的电脑资源,多进行亲手操作及演练。“眼过千遍不如手过一遍”我将发挥自己在编程上的一些优势,来学好微机原理与接口技术这门课程