信号与信息实验报告一C程序调用汇编子程序
单片机实验报告

单片机实验报告学院:姓名:学号:指导老师:目录第一章实验内容、目的及要求 (2)一、内容 (2)二、目的及要求 (3)第二章实验 (3)实验一数字量输入输出实验 (3)实验二定时器/计数器实验 (4)实验三A/D、D/A转换实验 (11)实验四串行通信设计 (20)第三章实验体会 (28)第一章实验内容、目的及要求一、内容实验一数字量输入输出实验阅读、验证C语言程序功能。
使用汇编语言编程,完成实验指导书之“3.1 数字量输入输出实验”基本实验项目。
实验二定时器/计数器实验阅读、验证C语言程序功能。
使用汇编语言编程,完成实验指导书之“3.3 定时/计数器实验”基本实验项目。
提高部分:定时器控制LED灯由单片机内部定时器1,按方式1工作,即作为16位定时器使用每0.05秒钟T1溢出中断一次。
P1口的P1.0-P1.7分别接八个发光二极管。
编写程序模拟时序控制装置。
开机后第一秒钟L1,L3亮,第二秒钟L2,L4亮,第三秒钟L5,L7亮,第四秒钟L6,L8亮,第五秒钟L1,L3,L5,L7亮,第六秒钟L2,L4,L6,L8亮,第七秒钟八个LED灯全亮,第八秒钟全灭,以后又从头开始,L1,L3亮,然后L2,L4亮……一直循环下去。
实验三A/D、D/A转换实验阅读、验证C语言程序功能。
使用汇编语言编程,完成实验指导书之“4.3 A/D转换实验”项目(P64)和“4.4 D/A转换实验”项目。
提高部分:(要求:Proteus环境下完成)小键盘给定(并显示工作状态),选择信号源输出波形类型(D/A 转换方式),经过A/D采样后,将采样数据用LED灯,显示当前模拟信号值大小及变化状态。
实验四串行通讯实验阅读、调试C语言程序功能。
使用汇编语言编程,完成实验指导书之“3.7 串口通讯实验”项目。
(要求:实验仪器上完成)提高部分:(要求:Proteus环境下完成)利用单片机实验系统,实现与PC机通讯。
功能要求:将从实验系统键盘上键入的数字,字母显示到PC机显示器上,将PC机键盘输入的字符(0-F)显示到单片机实验系统的数码管上。
《DSP原理及应用》课程实验报告

[《DSP原理及应用》课程实验报告](软、硬件实验)实验名称:[《DSP原理及应用》实验]专业班级:[ ]学生姓名:[ ]学号:[ ]指导教师:[ ]完成时间:[ ]目录第一部分.基于DSP系统的实验 (1)实验3.1:指示灯实验 (1)实验3.2:DSP的定时器 (3)实验3.5 单路,多路模数转换(AD) (5)第二部分.DSP算法实验 (13)实验5.1:有限冲击响应滤波器(FIR)算法实验 (13)实验5.2:无限冲激响应滤波器(IIR)算法 (17)实验5.3:快速傅立叶变换(FFT)算法 (20)第一部分.基于DSP系统的实验实验3.1:指示灯实验一.实验目的1.了解ICETEK–F2812-A评估板在TMS320F2812DSP外部扩展存储空间上的扩展。
2.了解ICETEK–F2812-A评估板上指示灯扩展原理。
1.学习在C语言中使用扩展的控制寄存器的方法。
二.实验设备计算机,ICETEK-F2812-A实验箱(或ICETEK仿真器+ICETEK–F2812-A系统板+相关连线及电源)。
三.实验原理1.TMS320F2812DSP的存储器扩展接口存储器扩展接口是DSP扩展片外资源的主要接口,它提供了一组控制信号和地址、数据线,可以扩展各类存储器和存储器、寄存器映射的外设。
-ICETEK–F2812-A评估板在扩展接口上除了扩展了片外SRAM外,还扩展了指示灯、DIP开关和D/A设备。
具体扩展地址如下:C0002-C0003h:D/A转换控制寄存器C0001h:板上DIP开关控制寄存器C0000h:板上指示灯控制寄存器详细说明见第一部分表1.7。
-与ICETEK–F2812-A评估板连接的ICETEK-CTR显示控制模块也使用扩展空间控制主要设备:108000-108004h:读-键盘扫描值,写-液晶控制寄存器108002-108002h:液晶辅助控制寄存器2.指示灯扩展原理3.实验程序流程图开始初始化DSP时钟正向顺序送控制字并延时四.实验步骤1.实验准备连接实验设备:请参看本书第三部分、第一章、二。
数字信号处理实验答案

数字信号处理实验答案第十章上机实验数字信号处理是一门理论和实际密切结合的课程,为深入掌握课程内容,最好在学习理论的同时,做习题和上机实验。
上机实验不仅可以帮助读者深入的理解和消化基本理论,而且能锻炼初学者的独立解决问题的能力。
本章在第二版的基础上编写了六个实验,前五个实验属基础理论实验,第六个属应用综合实验。
实验一系统响应及系统稳定性。
实验二时域采样与频域采样。
实验三用FFT对信号作频谱分析。
实验四IIR数字滤波器设计及软件实现。
实验五FIR数字滤波器设计与软件实现实验六应用实验——数字信号处理在双音多频拨号系统中的应用任课教师根据教学进度,安排学生上机进行实验。
建议自学的读者在学习完第一章后作实验一;在学习完第三、四章后作实验二和实验三;实验四IIR数字滤波器设计及软件实现在。
学习完第六章进行;实验五在学习完第七章后进行。
实验六综合实验在学习完第七章或者再后些进行;实验六为综合实验,在学习完本课程后再进行。
10.1 实验一: 系统响应及系统稳定性1.实验目的(1)掌握求系统响应的方法。
(2)掌握时域离散系统的时域特性。
(3)分析、观察及检验系统的稳定性。
2.实验原理与方法在时域中,描写系统特性的方法是差分方程和单位脉冲响应,在频域可以用系统函数描述系统特性。
已知输入信号可以由差分方程、单位脉冲响应或系统函数求出系统对于该输入信号的响应,本实验仅在时域求解。
在计算机上适合用递推法求差分方程的解,最简单的方法是采用MA TLAB语言的工具箱函数filter函数。
也可以用MA TLAB语言的工具箱函数conv 函数计算输入信号和系统的单位脉冲响应的线性卷积,求出系统的响应。
系统的时域特性指的是系统的线性时不变性质、因果性和稳定性。
重点分析实验系统的稳定性,包括观察系统的暂态响应和稳定响应。
系统的稳定性是指对任意有界的输入信号,系统都能得到有界的系统响应。
或者系统的单位脉冲响应满足绝对可和的条件。
系统的稳定性由其差分方程的系数决定。
数字信号处理实验(1-7)原始实验内容文档(含代码)

实验要求1.每个实验进行之前须充分预习准备,实验完成后一周内提交实验报告;2.填写实验报告时,分为实验题目、实验目的、实验内容、实验结果、实验小结五项;3.实验报告要求:实验题目、实验目的、实验内容、实验结果四项都可打印;但每次实验的实验内容中的重要代码(或关键函数)后面要用手工解释其作用。
实验小结必须手写!(针对以前同学书写实验报告时候抄写代码太费时间的现象,本期实验报告进行以上改革)。
实验一信号、系统及系统响应实验目的:1. 掌握使用MATLAB进行函数、子程序、文件编辑等基本操作;2. 编写一些数字信号处理中常用序列的3. 掌握函数调用的方法。
实验内容:1.在数字信号处理的基本理论和MATLAB信号处理工具箱函数的基础上,可以自己编写一些子程序以便调用。
(1)单位抽样序列δ(n-n0)的生成函数impseq.m(2)单位阶跃序列u(n-n0)的生成函数stepseq.m(3)两个信号相加的生成函数sigadd.m(4)两个信号相乘的生成函数sigmult.m(5)序列移位y(n)=x(n-n0)的生成函数sigshift.m(6)序列翻褶y(n)=x(-n)生成函数sigfold.m(7)奇偶综合函数evenodd.m(8)求卷积和2.产生系列序列,并绘出离散图。
(1) x1(n)=3δ(n-2)-δ(n+4) -5≤n≤5(2) x3(n)=cos(0.04πn)+0.2w(n) 0≤n≤50其中:w(n)是均值为0,方差为1 的白噪声序列。
3.设线性移不变系统的抽样响应h(n)=(0.9)^n*u(n),输入序列x(n)=u(n)-u(n-10),求系统的输出y(n).实验二 系统响应及系统稳定性1.实验目的(1)掌握 求系统响应的方法。
(2)掌握时域离散系统的时域特性。
(3)分析、观察及检验系统的稳定性。
2.实验原理与方法在时域中,描写系统特性的方法是差分方程和单位脉冲响应,在频域可以用系统函数描述系统特性。
单片机实验报告总结

单片机实验报告总结单片机实验报告总结单片机实验心得体会单片机实验心得体会时间过得真快,不经意间,一个学期就到了尾声,进入到如火如荼的期末考试阶段。
在学习单片机这门课程之前,就早早的听各种任课老师和学长学姐们说过这门课程的重要性和学好这门课程的关键~~多做单片机实验。
这个学期,我们除了在课堂上学习理论知识,还在实验室做了7次实验。
将所学知识运用到实践中,在实践中发现问题,强化理论知识。
现在,单片机课程已经结束,即将开始考试了,需要来好好的反思和回顾总结下了。
第一次是借点亮LED灯来熟悉keil软件的使用和试验箱上器材。
第一次实验体现了一个人对新事物的接受能力和敏感度。
虽然之前做过许多种实验。
但依旧发现自己存在一个很大的问题,对已懂的东西没耐心听下去,容易开小差;在听老师讲解软件使用时,思路容易停滞,然后就跟不上老师的步骤了,结果需要别人再次指导;对软件的功能没有太大的热情去研究探索,把一个个图标点开,进去看看。
所以第一次试验相对失败。
鉴于此,我自己在宿舍下载了软件,然后去熟悉它的各个功能,使自己熟练掌握。
在做实验中,第二个问题应该是准备不充分吧。
一开始,由于没有课前准备的意识,每每都是到了实验室才开始编程,完成作业,导致每次时间都有些仓促。
后来在老师的批评下,认识到这是个很大的问题:老师提前把任务告诉我们,就是希望我们私下把程序编好。
于是我便在上机之前把程序编好,拷到U盘,这样上机时只需调试,解决出现的问题。
这样就会节约出时间和同学讨论,换种思路,换种方法,把问题给吃透。
发现、提出、分析、解决问题和实践能力是作为我们这个专业的基本素质。
三是我的依赖性很大,刚开始编程序时喜欢套用书上的语句,却对语句的理解不够。
于是当程序出现问题时,不知道如何修改,眼前的程序都是一块一块的被拼凑整合起来的,没法知道哪里错了。
但是编程是一件很严肃的事情,容不得半点错误。
于是便只能狠下决心,坚持自己编写,即使套用时,也把每条语句弄懂。
单片机实验报告

单片机实验报告班级:09050541学号:0905054116姓名:王昆鹏实验1 P1口实验一、实验目的:1.学习P1口的使用方法。
2.学习延时子程序的编写和使用。
二、实验设备:CPU挂箱、8051CPU模块三、实验内容:1.P1口做输出口,接八只发光二极管,编写程序,使发光二极管循环点亮。
四、实验原理:P1口为准双向口,P1口的每一位都能独立地定义为输入位或输出位。
作为输入位时,必须向锁存器相应位写入“1”,该位才能作为输入。
软件延时,如果用c编程时,通过使用keil的软件模拟,调试观察子函数(delay)延时时间。
(具体延时可以自行设定)使用汇编语言的软件延时,可以计算其指令的周期数,大概估算其软件延时。
五、实验原理图:P1口输出、输入实验六、实验步骤:执行程序:P1.0~P1.7接发光二极管L1~L8。
七、程序框图:循环点亮发光二极管(具体延时可以自行设定)八、程序代码NAME T1_1ORG 0000HLJMP STARTORG 0030HSTART: MOV A,#0FEH //将1111 1110赋给A LOOP: RL A //A循环左移MOV P1,A //把A赋给端口P1LCALL DELAY //延时0.16sJMP LOOP //循环;延时函数DELAY: MOV R1,#200DEL1: MOV R2,#200DEL2: DJNZ R2,DEL2DJNZ R1,DEL1RETEND实验2 中断口实验一、实验目的:1.学习外部中断技术的基本使用方法。
2.学习中断处理程序的编程方法。
二、实验设备:CPU挂箱、8051CPU模块三、实验内容:通过设定两个中断使能和触发方式,并编写相应的中断服务子函数,改变led灯的变化情况。
当按下KEYBOARD的按键时8个led都灭,当把k1向上拉再复位后,4个led亮,4个灭。
四、实验原理:参考《单片机原理及接口技术》第三版,北京航空航天大学出版社。
PIC单片机实验报告
实验一循环点亮LED灯一、实验内容:将RE0-RE5配置为输出,连接6个LED灯;编写程序,调试并运行,下载到实验板上,实现循环点亮。
二、实验目的:学习PIC单片机I/O端口功能及特点,了解I/O端口引脚及连线,控制寄存器。
在开发板上实现循环点亮LED灯。
三、实验要求1.了解掌握PIC单片机的结构和功能。
2.应熟练掌握MPLAB开发环境的使用方法。
3.熟练掌握PIC单片机的程序编写方法。
4.掌握MPLAB IDE硬件调试的技巧。
四、实验准备:1、I/O引脚及连线:I/O端口特点:1、所有I/O 输入端口都是施密特触发器输入,以便增强抗干扰性。
2、外设复用:所有的器件引脚(除VDD、VSS、MCLR 和OSC1/CLKI之外),均为外设与I/O端口所共用。
3、如果外设使能,并且外设正在使用相关引脚时,该引脚将不再作为通用I/O 引脚使用。
4、优先级:I/O 与多个外设复用时I/O 引脚的名称定义了与该引脚相关的各个功能的优先级,如:I/O 引脚与两个外设复用(“外设A”和“外设B”)外设A 对引脚的控制具有最高优先权,若外设A 和外设B 同时使能,外设A将控制I/O 引脚5、电平变化通知引脚:电平变化通知引脚(CN)内接输入电平变化通知模块,使得dsPIC30F器件能够向处理器发出中断请求,以响应所选输入引脚上的状态变化。
I/O端口控制寄存器:所有的端口引脚,都有三个与端口引脚的操作直接相关的寄存器。
①TRISx:数据方向寄存器。
决定各个引脚是输入引脚还是输出引脚。
–若某个I/O 引脚的TRIS 位为“1”,则该引脚是输入引脚。
–某个I/O 引脚的TRIS 位为“0”,则该引脚被配置为输出引脚。
–复位以后,所有端口引脚被定义为输入。
②PORTx:I/O端口寄存器。
访问的是I/O引脚上的数据。
读的是端口引脚值;写端口引脚,写的是端口数据锁存器(LATx )。
③LATx:I/O端口锁存寄存器。
读的是数据锁存器里锁存的值;写锁存值,写的是端口数据锁存器(LATx )五、实验过程及结果:实验源程序:#include "p30f4011.h”int main(void){int led=0x01;unsigned long int i=0;TRISE =0x100;PORTE=led;while(1){PORTE =led;for (i=0;i<65000;i++){}; //延时led = led<<1; //当第6个LED灯亮后,重新从第1个LED灯点亮if (led == 0x40)led = 0x01;}return 0;}先编写程序,检验正确后,下载到实验板上并运行,实验板上6个LED灯开始循环点亮,通过修改程序,还可以改变延迟时间,即可控制LED灯点亮时间。
信号的分解与合成实验报告
信号的分解与合成实验报告一、实验目的本次实验的主要目的是深入理解信号的分解与合成原理,通过实际操作和观察,掌握信号在时域和频域的特性,以及如何将复杂信号分解为简单的基本信号,并重新合成原始信号。
二、实验原理1、信号的分解任何周期信号都可以用一组正弦函数和余弦函数的线性组合来表示,这就是傅里叶级数展开。
对于非周期信号,可以通过傅里叶变换将其表示为连续频谱。
2、信号的合成基于分解得到的各个频率成分的幅度和相位信息,通过逆过程将这些成分相加,可以合成原始信号。
三、实验设备与环境1、实验设备信号发生器示波器计算机及相关软件2、实验环境安静、无电磁干扰的实验室环境四、实验内容与步骤1、产生周期信号使用信号发生器产生一个周期方波信号,设置其频率和幅度。
2、观察时域波形将产生的方波信号输入示波器,观察其时域波形,记录波形的特点,如上升时间、下降时间、占空比等。
3、进行傅里叶级数分解通过计算机软件对观察到的方波信号进行傅里叶级数分解,得到各次谐波的频率、幅度和相位信息。
4、合成信号根据分解得到的谐波信息,在计算机软件中重新合成信号,并与原始方波信号进行比较。
5、改变信号参数改变方波信号的频率和幅度,重复上述步骤,观察分解与合成结果的变化。
6、非周期信号实验产生一个非周期的脉冲信号,进行傅里叶变换和合成实验。
五、实验结果与分析1、周期方波信号时域波形显示方波具有陡峭的上升和下降沿,占空比固定。
傅里叶级数分解结果表明,方波包含基波和一系列奇次谐波,谐波的幅度随着频率的增加而逐渐减小。
合成的信号与原始方波信号在形状上基本一致,但在细节上可能存在一定的误差,这主要是由于分解和合成过程中的计算精度限制。
2、改变参数的影响当方波信号的频率增加时,谐波的频率也相应增加,且高次谐波的相对幅度减小。
幅度的改变主要影响各次谐波的幅度,而对频率和相位没有影响。
3、非周期脉冲信号傅里叶变换结果显示其频谱是连续的,且在一定频率范围内有能量分布。
c51单片机实验报告
c51单片机实验报告C51单片机实验报告引言C51单片机作为一种常见的微控制器,广泛应用于各种电子设备中。
本实验报告旨在介绍C51单片机的基本原理、实验过程和结果分析,以及对其在实际应用中的潜力进行探讨。
一、C51单片机的基本原理C51单片机是一种高度集成的微处理器,由中央处理器、存储器、输入输出接口和时钟电路等组成。
其核心是Intel公司开发的8051系列单片机,具有高性能、低功耗和易于编程等优点。
C51单片机采用汇编语言进行编程,可以实现各种功能,如数据处理、控制和通信等。
二、实验过程本次实验选取了LED灯的控制作为示例,通过C51单片机控制LED灯的亮灭来展示其基本功能。
1. 实验材料准备准备工作包括C51单片机开发板、连接线、电源和LED灯等。
确保所有材料齐全并连接正确。
2. 编写程序使用汇编语言编写程序,通过控制特定的IO口来控制LED灯的亮灭。
程序需考虑到时序和逻辑关系,确保正确的控制信号发送到LED灯。
3. 烧录程序将编写好的程序通过烧录器烧录到C51单片机中,确保程序能够正确运行。
4. 运行实验将电源接入开发板,开启电源。
通过按下相应的按键或其他输入方式,触发C51单片机发送控制信号,从而控制LED灯的亮灭。
三、实验结果分析经过实验,我们成功地实现了通过C51单片机控制LED灯的亮灭。
通过改变程序中的控制信号,我们可以实现不同的灯光效果,如闪烁、流水灯等。
这说明C51单片机具有良好的可编程性和控制能力。
此外,我们还发现C51单片机具有较高的稳定性和可靠性。
在实验过程中,单片机能够稳定地工作,并根据程序的要求正确地控制LED灯的状态。
这为其在实际应用中提供了良好的基础。
四、C51单片机在实际应用中的潜力C51单片机作为一种常见的微控制器,广泛应用于各种电子设备中。
其可编程性和控制能力使得它在工业自动化、家电控制、通信设备和电子产品等领域有着广阔的应用前景。
例如,在工业自动化领域,C51单片机可以用于控制机器人、自动化生产线和仪器设备等。
北京理工大学信号与系统实验实验报告
北京理工大学信号与系统实验实验报告信号与系统实验报告姓名:肖枫学号:1120111431班号:05611102专业:信息对抗技术学院:信息与电子学院12实验1 信号的时域描述与运算一、实验目的1. 掌握信号的MATLAB表示及其可视化方法。
2. 掌握信号基本时域运算的MATLAB实现方法。
3. 利用MATLAB分析常用信号,加深对信号时域特性的理解。
二、实验原理与方法1. 连续时间信号的MATLAB表示连续时间信号指的是在连续时间范围内有定义的信号,即除了若干个不连续点外,在任何时刻信号都有定义。
在MATLAB中连续时间信号可以用两种方法来表示,即向量表示法和符号对象表示法。
从严格意义上来说,MATLAB并不能处理连续时间信号,在MATLAB中连续时间信号是用等时间间隔采样后的采样值来近似表示的,当采样间隔足够小时,这些采样值就可以很好地近似表示出连续时间信号,这种表示方法称为向量表示法。
表示一个连续时间信号需要使用两个向量,其中一个向量用于表示信号的时间范围,另一个向量表示连续时间信号在该时间范围内的采样值。
例如一个正弦信号可以表示如下:>> t=0:0.01:10;>> x=sin(t);利用plot(t,x)命令可以绘制上述信号的时域波形,如图1所示。
如果连续时间信号可以用表达式来描述,则还可以采用符号表达式來表示信号。
例如对于上述正弦信号,可以用符号对象表示如下:>> x=sin(t);>> ezplot(X);利用ezplot(x)命令可以绘制上述信号的时域波形10.80.60.40.2-0.2-0.4-0.6-0.8-1012345678910Time(seconds)图1 利用向量表示连续时间信号3sin(t)10.5-0.5-1-6-4-20246t图 2 利用符号对象表示连续时间信号常用的信号产生函数函数名功能函数名功能 heaviside 单位阶跃函数 rectpuls 门函数 sin 正弦函数 tripuls 三角脉冲函数 cos 余弦函数 square 周期方波 sinc sinc函数 sawtooth 周期锯齿波或三角波 exp 指数函数2.连续时间信号的时域运算对连续时间信号的运算包括两信号相加、相乘、微分、积分,以及位移、反转、尺度变换(尺度伸缩)等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验分析:
1.C运行环境下寄存器的使用
⑴专用寄存器(使用目的固定,不可以随便使用)
SP(P6)和FP(P7):堆栈管理
L0~L3:循环缓冲长度寄存器
⑵调用保护寄存器
P3~P5 R4~R7
这些寄存器的值在函数调用前和返回后保持不变,因此要使用这些寄存器,子函数必须先保存,返回之前恢复。
⑶任意使用寄存器
P0~P2,R0~R2,两组循环控制寄存器
ASTAT(算术运算标志寄存器)
A0~A1,I0~I3,B0~B3,M0~M3
2.参数传递和局部堆栈存储分配
Blackfin DSP C/C++编译器的参数传递采用两种方法:参数较少时采用寄存器,参数较多时同时采用寄存器和堆栈
概念化参数列表这样映射到物理内存:前3个节点(每个节点1字长,即32位)依次使用R0,R1,R2。
后面的节点依次放到堆栈上。
当调用子函数时,编译器分配12个字节以上的上空间来容纳参数。
当参数列表的节点个数n≤3时,编译器在堆栈上分配3个字的空间;否则分配n个字的空间。
同时将参数列表放入所分配的空间(前3个节点放入R0,R1,R2,同时堆栈空间中也预留了前3个节点的位置)。
堆栈中为参数所分配的空间与所要传递的参数的对应关系是——参数列表从左到右依此对应堆栈空间从低地址到高地址。
如在C中调用汇编子函数:add (a,b,c,d,e),设若所有参数类型都是4字节的,并且在add的汇编代码中有寄存器入栈保护语句[--SP]=(R7:4,P5:3),即将R7~R4,P5~P3都压入堆栈保护,则堆栈状态如下:(下面示意图中每一对【】表示堆栈中的一个字单元,sp表示堆栈指针,堆栈空间地址为从左到右递增;示意图中空的三对【】表示为前三个参数预留的堆栈空间,但这三个参数却传递到
了R0~R2中)
【P5】【P4】【P3】【R7】【R6】【R5】【R4】【】【】【】【d】【e】
sp
此时,a => R0, b => R1, c => R2; 若要读取参数d和e时,需要计算堆栈空间分布:d=> [sp+40],e => [sp+44].
函数返回值的传递:
⏹返回值<=32,使用R0表示;
⏹32<返回值<=64,使用寄存器对R0, R1表示;
⏹返回值>64,调用者在调用之前分配返回值所需内存,用P0指向分配的空间,子函数用这个隐含的指针将返回值传递过来。
二、实验程序
C文件:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
extern int * add(int a,int b,int c,int d,int e),*shuzu(int *f,int *g);
void main()
{
int a,b,c,d,e;
int f[3],g[3];
int *result;
scanf("%d,%d,%d,%d,%d",&a,&b,&c,&d,&e);
result=add(a,b,c,d,e);
printf( "a+b+c = %d\n\n", *(result));
printf( "a+c+d+e = %d\n\n", *(result-1));
printf( "a-b = %d\n\n", *(result-3));
printf( "the ASTAT of :a-b = %d\n\n", *(result-2));//返回状态寄存器的值
scanf("%d,%d,%d,%d,%d,%d",&f[0],&f[1],&f[2],&g[0],&g[1],&g[2]);
result=shuzu(f,g);
}
汇编子程序文件:
.section L1_code;
.global _add;
.global _shuzu;
_add:
[--SP]=(R7:4,P5:3);//寄存器入栈保护
P0=0;
R3=R0-R1;//a-b
[P0++]=R3;//存储a-b
R3=ASTAT;
[P0++]=R3;//存储a-b后算术状态标志寄存器的状态到[P0++]
R3=0;
R3=R0+R2;//R3=a+b
R4=[SP+40];//R4=d
R3=R3+R4;//R3=a+b+d
R4=[SP+44];//R4=e
R3=R3+R4;//R3=a+c+d+e
[P0++]=R3;////存储a+c+d+e后算术状态标志寄存器的状态到[P0++] R3=0;
R3=R0+R1;
R3=R3+R2;//R3=a+b+c
[P0]=R3;////存储a+b+c后算术状态标志寄存器的状态到[P0]
R0=P0;
RTS;
_add.end:
_shuzu:
RTS;
_shuzu.end:
三、实验过程:
1.输入整数a,b,c,d,e.使a=1,b=2,c=3,d=4,e=5
2.程序运行结果如下:
3.a-b与a-b后算术状态标志寄存器ASTAT的状态关系
⑴若a-b为非负数-正=负(如1-2)或负-负=负(-3-(-1)),
a-b后算术状态标志寄存器ASTAT的状态34
⑵若a-b为负-非负数=负(如-1-3或-1231-0)
a-b后算术状态标志寄存器ASTAT的状态为38
⑶当a-b为正-非负数=正(12-0或112-1)或负-负=正(-11-(-231))
a-b后算术状态标志寄存器ASTAT的状态为36.
⑶若a-b为非负数-负=正(如343-(-12)或0-(-65))
a-b后算术状态标志寄存器ASTAT的状态为32
⑷若a-b=0,
a-b后算术状态标志寄存器ASTAT的状态为37.
4.讨论输入整数数组f[3],g[3],参数如何传递
输入数组f[3]={1,2,3},g[3]={4,5,6};
调用数组的函数shuzu(f,g)有两个参数,这两个参数将放在R0、R1两个节点里。
单步调试程序至result=shuzu(f,g);这个语句之后。
在Data Register File表里监测到R0地址为FF803FAC,R1地址为FF803FB8。
将R0地址输入到BLACKFIN Memory表中,可以看到从FF803FAC开始,每隔四位保存一个数据,分别是1,2,3。
即f[3]数组。
将R1地址输入到BLACKFIN Memory表中,可以看到从FF803FB8开始,每隔四位保存一个数据,分别是4,5,6。
即g[3]数组。
四、实验心得
通过这次实验,我了解了C与汇编混合编程的特点及规则,掌握了在C代码中调用汇编语言编写的子函数的方法,熟悉了C运行环境下寄存器的使用,学习了调用子函数时参数的传递和局部堆栈的存储分配。