Lab1_体系结构实验报告
lab1

實驗1. 庫倫作用力 ---自然界的四個作用力之一一、簡介1789年法國工程師庫倫提出了庫倫定律,靜電力的大小與距離平方成反比、與電量成積成正比,其形式恰與"重力引力"的形式相同,從此電磁學的發展有了定量的數學形式,也開啟了所謂"統一場論"的研究。
本實驗乃利用庫倫力平衡(Coulomb Balance)裝置去檢驗庫倫作用力中,電磁力與距離、電荷的關係,並由此得到庫倫常數(Coulomb constant)k 。
二、原理1789年法國工程師庫倫提出了庫倫定律,靜電力的大小與距離平方成反比、與電量成積成正比,其形式可寫成:221R Q Q k F =(1)其中,F 為庫倫靜電力,Q 1及Q 2分別為電荷之電量,R 為兩電荷之間距。
本實驗的原理可用圖一來說明:首先我們將兩石墨球充電帶有電荷,其中一個小球固定在軌道上,另一小球則透過轉矩可帶動鋼絲細線扭轉,兩者組成所謂的庫倫力平衡(Coulomb Balance)裝置。
當兩小球靠近時,靜電力將造成細鋼線的扭轉形變,產生一個扭轉角q ,力越大扭轉角越大,呈現性正比關係,裝置上有一個轉盤可讓我們解讀轉角大小。
我們也可以以外加力來扭轉細剛絲,當反扭力與庫倫作用力達成平衡時,細鋼線之扭力等於電荷間之靜電力,所以可利用計算扭力的方式來求得帶電荷球之間的作用力,即21R Q Q k F k e tor ==q (2)又,小球可視為球型電容a C o e p 4=,a 為小球半徑。
所以在外加電壓為V 的情況下,小球所被充電的電荷為:V a CV Q o e p 4==(3)其次,式(1)中的tor k ,可利用重力所產生之力矩與Torsion wire 之扭力平衡關係求得。
我們將庫倫平衡儀傾倒,在石墨球上而放上小砝碼(質量為m),利用重力帶動細鋼絲扭轉,故可得到gtor mgk q =(4)因此,將式(3)及(4)代入式(2),則可得到靜電常數Coulumb constantk 為202)4(aV R mg k e g pe q q =(5)並由這些量測可驗證庫倫力與電荷和距離之間的關係。
软件体系结构实验一实验报告

protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// The one and only window has been initialized, so show and update it.
m_pMainWnd->ShowWindow(SW_SHOW);
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
#include "Hotel_MIS.h"
#include "MainFrm.h"
#include "Hotel_MISDoc.h"
标准实验报告(参考)

南昌航空大学实验报告二零一年月日课程名称: C 语言实验名称:lab1 Sequence Structure班级:姓名:同组人:指导教师评定:签名:一、实验目的和要求1.熟悉TC的开发环境;2.明确C语言程序的基本结构,掌握C语言程序的书写格式;3.理解程序的顺序控制结构。
二、实验题目⒈在自己的系统上运行“Hello, World”,再让程序遗漏一些部分,观察出现的错误信息。
⒉输入两个城市之间的距离(以千米为单位),将其转换为以英里为单位的距离⒊输入两个数,交换它们的值。
⒋输入以华氏为单位的温度,将其转换为以摄氏为单位的温度。
⒌输入某员工的基本工资(以元为单位,工资为整数值),如果他的住房补贴是基本工资的20%,岗位补贴是基本工资的40%,计算该员工的总工资。
三、程序清单(及流程图)1、在自己的系统上运行“Hello,World”,再让程序遗漏一些部分,观察出现的错误信息。
预习:调试后:#include < stdio.h >int mian(void){print(“hello,world”)return 0;} #include < stdio.h >int main(void){printf(“hello,world”);return 0;}调试过程:在第一题的调试中,出现了以下错误提示信息:(1)undefined symbol …_main‟ in module COS主要原因是把main错写为mian。
(2)statement missing …;‟ in function main主要原因是print(“hello,world”)后分号;没有输入。
(3)undefined symbol …_print‟ in module hello.c主要原因是把输出函数printf错写为print。
……2、……3、……四、实验结果1、调试无错误后,分别用下列数据作为输入可得到以下结果:可以在屏幕上输出hello world的字符串。
OS-lab1实验报告

OS-lab1实验报告lab1实验报告⼀、实验思考题Thinking 1.1也许你会发现我们的readelf程序是不能解析之前⽣成的内核⽂件(内核⽂件是可执⾏⽂件)的,⽽我们之后将要介绍的⼯具readelf则可以解析,这是为什么呢?(提⽰:尝试使⽤readelf -h,观察不同)答:通过readelf -h读取vmlinux和testELF的结果如下图所⽰:vmlinux:testELF:从Data属性⼀栏中可以看到vmlinux为⼤端存储⽽testELF为⼩端存储,我们的readelf程序只能对⼩端存储进⾏解析,所以⽆法解析内核⽂件。
Thinking 1.2内核⼊⼝在什么地⽅?main 函数在什么地⽅?我们是怎么让内核进⼊到想要的 main 函数的呢?⼜是怎么进⾏跨⽂件调⽤函数的呢?答:内核⼊⼝在0x8000_0000,main函数在0x8001_0000。
通过执⾏跳转指令jal跳转到main函数。
跨⽂件调⽤函数时,会先将需要的参数保存在寄存器a0-a3中,然后执⾏跳转指令跳转⾄函数执⾏,将返回值保存在寄存器v0-v1中。
⼆、实验难点图⽰本次实验中⽐较难的地⽅,我认为是如何读懂已有的代码。
⽐如对于Exercise 1.2,如果不提前仔细了解ELF的⽂件⼤体结构。
乍⼀看kerelf.h的代码是很迷茫的。
这样“冗长”的⼀个结构体到底是什么意思,结构体中的各个变量代表着什么属性,只有结合注释和理论的知识才能理解,从⽽加以运⽤。
对于Exercise 1.5,这⼀点就更加明显了。
想要完成Exercise 1.5,需要阅读三个代码⽂件,了解printf函数的具体实现过程,需要了解这三个⽂件之中与printf实现相关的函数功能以及具体实现⽅法,⽐如printf.c中的myoutput函数和printf函数,这两个函数与我们需要补写的内容密切相关。
了解了这两个函数之后再去读print.c的函数内容,才能⽐较好的理解lp_Print函数的具体实现过程。
系统结构 第一、二次试验报告

实验一熟悉模拟器WinDLX的使用一、实验目的1. 熟练掌握WinDLX模拟器的操作和使用,熟悉DLX指令集结构及其特点。
2. 加深对计算机流水线基本概念的理解。
3.了解DLX基本流水线各段的功能以及基本操作。
二、实验平台WinDLX模拟器三、实验任务用WinDLX模拟器执行下列两个程序:求阶乘程序求最大公倍数程序分别以步进、连续、设置断点的方式运行程序,观察程序在流水线中的执行情况,观察CPU中寄存器和存储器的内容。
熟练掌握WinDLX的操作和使用。
1.用WinDLX模拟器执行求阶乘程序(1)用WinDLX模拟器执行求阶乘程序。
这个程序说明浮点指令的使用。
该程序从标准输入读入一个整数,求其阶乘,然后将结果输出。
该程序中调用了中的输入子程序,这个子程序用于读入正整数。
(2)输入数据“3”,采用单步执行方法,完成程序并通过使用WinDLX,总结WinDLX的特点。
(3)注意观察变量说明语句所建立的数据区,理解WinDLX指令系统。
(4)分别以步进、连续、设置断点的方式运行程序,观察程序在流水线中的执行情况,观察CPU中寄存器和存储器的内容。
熟练掌握WinDLX的操作和使用。
2.用WinDLX模拟器求最大公约数程序(1)用WinDLX模拟器执行程序。
该程序从标准输入读入两个整数,求他们的greatest common measure,然后将结果写到标准输出。
该程序中调用了中的输入子程序。
(2)给出两组数6、3和6、1,采用单步和连续混合执行的方法完成程序,注意中间过程和寄存器的变化情况,观察流水线工作情况。
然后单击主菜单上的execute/display dlx-i/o,观察结果。
(3 ) 分别以步进、连续、设置断点的方式运行程序,观察程序在流水线中的执行情况,观察CPU中寄存器和存储器的内容。
实验结果:1、(1)导入和代码(2)单步执行流水线:寄存器的值:由图可知:PC寄存器中存放下一条要执行的语句的地址,IMAR中存放当前执行的语句的地址。
系统结构实验一报告

实验一流水线及流水线中的冲突一、实验目的(1)加深对计算机流水线基本概念的理解。
(2)理解MIPS结构如何用5段流水线来实现,理解各段的功能和基本操作。
(3)加深对数据冲突、结构冲突的理解。
(4)加深对指令调度技术的理解并进一步理解指令调度技术对CPU 性能的改善。
二、实验平台实验平台采用指令集和流水线操作级模拟器MIPSsim。
通用寄存器:浮点寄存器:特殊寄存器:流水寄存器:第13个时钟周期的时钟周期图如下:各段指令为:(1)学号为单数的同学自己编写一段关于结构冲突的汇编语言程序,分析该段程序存在结构冲突的指令以及导致结构冲突的部件,记录由结构冲突引起的停顿时钟周期数,计算停顿周期数占总执行周期数的百分比。
分析结构冲突对CPU性能的影响。
编写的代码如下:.textmain:ADD.D $f2,$f0,$f1ADD.D $f3,$f0,$f1ADD.D $f4,$f0,$f1ADD.D $f5,$f0,$f1ADD.D $f6,$f0,$f1ADD.D $f7,$f0,$f1ADD.D $f8,$f0,$f1ADD.D $f9,$f0,$f1TEQ $r0,$r0由结构冲突引起的停顿周期数为:35个计算停顿周期数占总执行周期数的百分比为:67.30769%ADD.D $f3,$f0,$f1和ADD.D $f4,$f0,$f1指令间存在结构冲突,由于读f0和f1的值都要访存,又因为执行一条流水线时只能有有一条指令访存,所有产生结构冲突。
结构冲突降低了CPU的性能,是执行周期时间变长,并行性较差。
(2)加载样例schedule.s观察程序在流水线中的执行情况。
通过查看统计数据和时钟周期图,找出并记录程序执行过程中各种冲突发生的次数,发生写后读冲突的指令组合以及程序执行的总时钟周期数。
RAW停顿:12 占周期总数的百分比:41.37931%load停顿:3 占所有RAW停顿的百分比:25%浮点停顿:0 占所有RAW停顿的百分比:0%WAW停顿:0 占周期总数的百分比:0%结构停顿:0 占周期总数的百分比:0%控制停顿:0 占周期总数的百分比:0%自陷停顿:1 占周期总数的百分比:3.448276%停顿周期总数:13 占周期总数的百分比:44.82759%发生写后读冲突的指令:LW $r2,0($r1)和MUL $r24,$r26,$r14等程序执行的总时钟周期数为:29(3)采用指令调度技术对程序进行指令调度,消除冲突,将调度后的程序重新加载,执行该程序观察程序在流水线中的执行情况,记录程序执行的总周期数。
BUAAOS——Lab1实验报告

BUAAOS——Lab1实验报告lab1实验报告实验思考题1.1也许你会发现我们的readelf程序是不能解析之前⽣成的内核⽂件(内核⽂件是可执⾏⽂件)的,⽽我们之后将要介绍的⼯具readelf则可以解析,这是为什么呢?(提⽰:尝试使⽤readelf -h,观察不同)通过linux内置的readelf⼯具即使⽤readelf -h命令⾏分别对testELF⽂件和之前⽣成的内核⽂件vmlinux的elf⽂件头进⾏查看:可以很清楚的看出,之前⽣成的vmlinux内核⽂件为⼤端存储,⽽testELF为⼩端存储。
因此我们⾃⼰编写的readelf程序只能解析testELF⽽不能解析vmlinux内核⽂件,因为编写readelf程序使⽤c语⾔不能简单的读取⼤端存储的数据。
1.2内核⼊⼝在什么地⽅?main 函数在什么地⽅?我们是怎么让内核进⼊到想要的 main 函数的呢?⼜是怎么进⾏跨⽂件调⽤函数的呢?内核的⼊⼝的起始地址为0x80000000,main函数在0x80010000。
在⼊⼝函数本实验为start.S内部使⽤跳转指令jal跳转到指定的函数地址。
跨⽂件调⽤函数通过跳转指令来调⽤,同时在跳转之前需要将数据存⼊栈中。
实验难点图⽰本次课下实验的难点其实就是能否读懂现有代码以及学习如何调⽤现有的⼯具。
例如在编写readelf.c⽂件中,我们可以从ELF⼿册中得知每个elf⽂件头结构体的结构,以及它内部的数据,随后根据适当的处理得出每个Section的结构体,再从其中获取所需要的数据。
即思路可以概括为⼀下步骤:知道结构体中的数据typedef struct {unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */// 存放魔数以及其他信息Elf32_Half e_type; /* Object file type */// ⽂件类型Elf32_Half e_machine; /* Architecture */// 机器架构Elf32_Word e_version; /* Object file version */// ⽂件版本Elf32_Addr e_entry; /* Entry point virtual address */// ⼊⼝点的虚拟地址Elf32_Off e_phoff; /* Program header table file offset */// 程序头表所在处与此⽂件头的偏移Elf32_Off e_shoff; /* Section header table file offset */// 段头表所在处与此⽂件头的偏移Elf32_Word e_flags; /* Processor-specific flags */// 针对处理器的标记Elf32_Half e_ehsize; /* ELF header size in bytes */// ELF⽂件头的⼤⼩(单位为字节)Elf32_Half e_phentsize; /* Program header table entry size */// 程序头表⼊⼝⼤⼩Elf32_Half e_phnum; /* Program header table entry count */// 程序头表⼊⼝数Elf32_Half e_shentsize; /* Section header table entry size */// 段头表⼊⼝⼤⼩Elf32_Half e_shnum; /* Section header table entry count */// 段头表⼊⼝数Elf32_Half e_shstrndx; /* Section header string table index */// 段头字符串编号} Elf32_Ehdr;了解readelf.c⽂件中已有代码如何获取结构体中的数据仿照已有代码获取所需要的数据:e_shoff、e_shentsize、e_shnum再例如补全print.c⽂件中的代码,需要的也是这种思路:了解已有的specifier的处理过程查看已有的printNum、printChar等⽅法获取所需要的各种参数仿照已有的specifier的处理过程,对d、D进⾏处理同时需要充分熟悉有关C语⾔指针的知识⽽对于更多的细节,对于本次实验练习关系并不是很⼤,只需要⼤致了解内核启动和编译链接的过程。
清华大学操作系统实验lab1实验报告

练习1、理解通过make生成执行文件的过程。
[练习1.1] 操作系统镜像文件ucore.img 是如何一步一步生成的?在proj1执行命令make V=可以得到make指令执行的过程从这几条指令中可以看出需要生成ucore.img首先需要生成bootblock,而生成bootblock需要先生成bootmain.o和bootasm.o还有sign,这三个文件又分别由bootmain.c、bootasm.S、sigh.c来生成。
ld -m elf_i386 -N -e start -Ttext 0x7C00 obj/boot/bootasm.o obj/boot/bootmain.o –o obj/bootblock.o这句话用于生成bootblock,elf_i386表示生成elf头,0x7C00为程序的入口。
'obj/bootblock.out' size: 440 bytes这句话表示生成的bootblock的文件大小,因为大小不到512字节,所以需要给blootblock填充,填充的功能在sign.c中有所体现,最后两字节设置为了0x55,0xAAbuf[510] = 0x55;buf[511] = 0xAA;FILE *ofp = fopen(argv[2], "wb+");size = fwrite(buf, 1, 512, ofp);[练习1.2] 一个被系统认为是符合规范的硬盘主引导扇区的特征是什么?前面已经提到过:引导扇区的大小为512字节,最后两个字节为标志性结束字节0x55,0xAA,做完这样的检查才能认为是符合规范的磁盘主引导扇区。
Sign.c文件中有作检查:if (size != 512) {fprintf(stderr, "write '%s' error, size is %d.\n", argv[2], size);return -1;}练习2:使用qemu执行并调试lab1中的软件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2012年3月1日一、实验目的和要求1.understand the principles of ALU and master methods of ALU design2.understand the principles of ALU controller and master methods of ALUcontroller design3.understand the principles of register file and master methods of register filedesignso the task isfirst, design a ALU with ALU controllerthen, design a register file二、实验内容和原理2.1 ALU with ALU controllerWe input the operand r, s; both are 32 bit integer, and aluc is the control code that defines the operation.So we just make the code block, totally as ALU block, ALUC block, display block.Figure 1 the input and output diagramFigure 2 ALU operationsFigure 3 the truth table of operation cod eFigure 4 principle of ALU2.2 register fileThe process is similar to the 2.1, when we get the principle of register file , it can be easily coding.Figure 5 the input and outputFigure 6 The Circuit Integrating ALU三、实验过程和数据记录1.ALU and ALU ControllerHere is the code:Top block:module ALUC(input CCLK, input [1:0]BTN, input [3:0] SW, output LCDRS, LCDRW, LCDE, output [3:0] LCDDAT,output LED);wire [3:0] lcdd;wire rslcd, rwlcd, elcd;wire o_zf;wire [31:0] o_alu;wire [2:0] i_aluc;wire [1:0] alu_op;wire [3:0] func;reg [31:0] o_alu_old;reg [255:0] strdata;reg [31:0] i_r;reg [31:0] i_s;reg rst;assign LCDDAT[3] = lcdd[3];assign LCDDAT[2] = lcdd[2];assign LCDDAT[1] = lcdd[1];assign LCDDAT[0] = lcdd[0];assign LCDRS = rslcd;assign LCDRW = rwlcd;assign LCDE = elcd;assign LED = o_zf;assign func[0] = SW[0];assign func[1] = SW[1];assign func[2] = SW[2];assign func[3] = SW[3];assign alu_op[0] = BTN[0];assign alu_op[1] = BTN[1];initial beginstrdata = "1111 2222 ";i_r = 32'h1111;i_s = 32'h2222;rst = 0;o_alu_old = 0;enddisplay M0 (CCLK, rst, strdata, rslcd, rwlcd, elcd, lcdd); single_alu M1(i_r, i_s, i_aluc, o_zf, o_alu);single_aluc M2(alu_op, func, i_aluc);always @(posedge CCLK) beginif (o_alu_old != o_alu) beginstrdata[127:120] = 8'h30 + o_alu[15:12];strdata[119:112] = 8'h30 + o_alu[11:8];strdata[111:104] = 8'h30 + o_alu[7:4];strdata[103:96] = 8'h30 + o_alu[3:0];o_alu_old = o_alu;endelserst = 0;endendmoduledisplay:module display(input CCLK, reset,input [255:0]strdata, output rslcd, rwlcd, elcd,output [3:0] lcdd);wire [7:0] lcddatin;lcd M0 (CCLK, resetlcd, clearlcd, homelcd, datalcd, addrlcd,lcdreset, lcdclear, lcdhome, lcddata, lcdaddr,rslcd, rwlcd, elcd, lcdd, lcddatin, initlcd);genlcd M1 (CCLK, reset, strdata, resetlcd, clearlcd, homelcd, datalcd,addrlcd, initlcd, lcdreset, lcdclear, lcdhome,lcddata, lcdaddr, lcddatin); endmodulemodule genlcd(input CCLK, debpb0, input [255:0]strdata, output reg resetlcd,output reg clearlcd, output reg homelcd,output reg datalcd, output reg addrlcd,output reg initlcd, input lcdreset, lcdclear,input lcdhome, lcddata, lcdaddr,output reg [7:0] lcddatin);reg [3:0] gstate; // state register integer i;always@(posedge CCLK)beginif (debpb0==1)beginresetlcd=0;clearlcd=0;homelcd=0;datalcd=0;gstate=0;endelsecase (gstate)0: begininitlcd=1;gstate=1;end1: begininitlcd=0;gstate=2;end2: beginresetlcd=1;if (lcdreset==1)beginresetlcd=0;gstate=3;endend3: begininitlcd=1;gstate=4;end4: begininitlcd=0;gstate=5;end5: beginclearlcd=1;if (lcdclear==1)beginclearlcd=0;gstate=6;endend6: begininitlcd=1;gstate=7;end7: begininitlcd=0;i=255;gstate=8;end8: beginif(i>127)lcddatin[7:0]=8'b0000_0000;elselcddatin[7:0]=8'b0100_0000;addrlcd=1;if (lcdaddr==1)beginaddrlcd=0;gstate=9;endend9: begininitlcd=1;gstate=10;end10: begininitlcd=0;gstate=11;end11: beginlcddatin[7:0]=strdata[i-:8];datalcd=1;if (lcddata==1)begindatalcd=0;gstate=12;endend12: begininitlcd=1;gstate=13;end13: begininitlcd=0;gstate=14;end14: begini=i-8;if (i<0)gstate=15;else if (i==127)gstate=8;elsegstate=11;end15: gstate=15;default: gstate=15;endcaseendendmodulemodule single_alu(i_r,i_s,i_aluc,o_zf,o_alu);input [31:0] i_r; //i_r: r inputinput [31:0] i_s; //i_s: s inputinput [2:0] i_aluc; //i_aluc: ctrl inputoutput o_zf; //o_zf: zero flag outputoutput [31:0] o_alu; //o_alu: alu result outputreg o_zf;reg [31:0] o_alu;always @(i_aluc or i_r or i_s) begincase (i_aluc)3'b010:o_alu=i_r+i_s;3'b110:o_alu=i_r-i_s;3'b000:o_alu=i_r&i_s;3'b001:o_alu=i_r|i_s;3'b111:o_alu=i_r<i_s?1:0;/////////////////////////////////////////在此添加根据i_aluc的值对o_alu和o_zf进行赋值endcaseif(o_alu==0)o_zf=1;elseo_zf=0;endendmodulemodule single_aluc(aluop, func, aluc);input [1:0] aluop;input [5:0] func;output [2:0] aluc;reg [2:0] aluc;always @(aluop or func) begincase (aluop)2'b00:aluc=3'b010;2'b01:aluc=3'b110;default:begincase (func[3:0])4'b0000:aluc=3'b010;4'b0010:aluc=3'b110;4'b0100:aluc=3'b000;4'b0101:aluc=3'b001;4'b1010:aluc=3'b111;endcaseend//根据aluop和func的不同值,对aluc进行赋值。