实验六报告
生态毒理学报告_6 实验六
实验六硫氰酸钠对斑马鱼的蓄积毒性实验硫氰酸钠对斑马鱼的蓄积毒性实验一、实验目的1、了解蓄积毒性实验方法2、评价硫氰酸钠对斑马鱼的蓄积作用强度。
二、实验原理蓄积毒性作用(cumulative coefficient action)是当低于中毒剂量的环境毒物或外来化合物反复多次的与生物体持续接触,经一定时间后使生物体出现明显的中毒表现。
蓄积毒性实验分为:蓄积系数法、20天蓄积试验法和受试物生物半衰期测定法。
蓄积系数法(cumulative coefficient method)是一种常用来评价环境污染物蓄积作用的方法。
1、蓄积系数法蓄积系数法是一种用来评估毒物和污染物蓄积作用的方法。
蓄积系数(comulative coefficient,K),是分次给予受试物后引起50%受试动物出现某种毒效应的总剂量(以ED 50(n))表示),与一次给予受试物后引起50%受试动物出现同一毒效应的剂量(以ED 50(1)表示)的比值,即K=ED 50(n)/ED 50(1)若以死亡为毒效应指标,上式为K越小,受试化合物的蓄积毒性越大。
测定方法:固定剂量每天连续染毒法剂量定期递增染毒法1)固定计量法固定每天染毒剂量为1/20—1/5 LD50,连续染毒,直至实验动物半数死亡。
如果染毒剂量累计已达5个LD50动物死亡仍末达半数,实验均可告结束,计算蓄积系数,作出评价。
2)递增剂量法2、先测定LC50,然后对另一组动物每天染毒,以4天为一期,开始给予0.1LC50。
以后每期按1.5倍递增剂量,直至动物半数死亡,或实验已达20天,可结束实验,计算系数。
染毒时间/天每日染毒剂量/mg/L每四天染毒总剂量/mg/L累计染毒总剂量/mg/L注:表中的递增染毒剂量为ED50或LD502、20天蓄积试验法按LD 50的1/20、1/10、1/5、1/2及0(溶剂对照)随机分成5组。
每天对动物进行染毒,连续20 d,各组总剂量分别为1LD 50、2LD 50、4LD 50、10LD 50。
实验六金属材料剪切弹性模量G的测量
- 1 -实验六 金属材料剪切弹性模量G 的测量一、实验目的测定金属材料的剪切模量G ,并验证剪切虎克定律。
二、实验原理圆轴扭转时,若最大剪应力不超过材料的比例极限,则扭矩T 与扭转角φ存在线性关系PGI TL 0=φ 式中: 32I p =4d π为圆截面的极惯性矩,为试件的直径 d φ——距离为的两截面之间的相对扭转角0L T ——扭矩由上式可知,若材料符合虎克定律,则T —φ图在比例极限以下成线性关系。
当试件受一定的扭矩增量后,在标距内可量得相应的扭转角增量T Δ0L φΔ,于是由上式可求得G 的公式P I L T G ⋅Δ⋅Δ=φ0实验按照等增量分级加扭矩的方法进行,测得相应的T ΔφΔ,即可求得G RL P T δφΔ=Δ⋅Δ=Δ,,则 δπΔ⋅Δ⋅⋅⋅=4032d PR L L G式中:P Δ--载荷增量 --外载力臂1L δΔ--百分表位移增量 --受扭杆标距 0L R --测量臂长度如图6.1所示:- 2 -受扭杆标距L 0 外载力臂L 1测量臂长R砝码百分表图6.1 JY—2型扭角仪三、实验设备JY—2型扭角仪四、实验步骤1、测量试件的计算长度及直径,取三个直径的平均值作为计算直径;2、在试件上按计算长度安装扭角仪;3、将百分表调节至零点;4、加砝码,使产生扭矩T 及扭转角φ,每增加1㎏砝码后,在百分表上读一个相应的位移量δ,算出位移增量δΔ,注意加载要平稳,实验过程中勿碰仪器;5、重复做几次,卸下载荷;6、根据实验数据,计算剪切弹性模量。
G 五、实验要求1、了解实验目的、原理、步骤及通过实验所求得的数据;2、讨论分析测定的误差情况。
G- 3 -六、实验报告6.1表。
有机化学实验报告分馏
有机化学实验报告分馏有机化学实验六简单分馏有机化学实验六简单分馏实验六简单分馏一.实验目的:1. 了解分馏的原理和意义,分馏柱的种类和选用的方法。
2. 学习实验室里常用分馏的操作方法。
二.实验重点和难点:1. 简单分馏原理;2. 分馏的操作方法;实验类型:基础性实验学时:4学时三.实验装置和药品:主要实验仪器:酒精灯圆底烧瓶分馏柱冷凝管接液器温度计量筒锥形瓶(3个)主要化学试剂:甲醇和水的混合物(1:1) 50mL沸石四.实验装置图:五.实验原理:1. 分馏:是应用分馏柱将几种沸点相近的混合物进行分离的方法。
它在化学工业和实验室中分离液态的有机化合物的常用方法之一。
普通的蒸馏技术要求其组分的沸点至少要相差30℃,才能用蒸馏法分离。
但对沸点相近的混合物,用蒸馏法不可能将它们分开。
若要获得良好的分离效果,就非得采用分馏不可。
现在最精密的分馏设备巳能将沸点相差仅1--2℃的混合物分开,利用蒸馏或分馏来分离混合物的原理是一样,实际上,分馏就是多次蒸馏。
基本原理:2. 蒸馏是提纯液体物质和分离混合物的一种常用方法。
蒸馏时混合液体中各组分的沸点要相差30℃以上,才可以进行分离。
应用分馏柱将几种沸点相近的混合物进行分离的方法称为分馏。
它在化学工业和实验室中被广泛应用。
现在最精密的分馏设备已能将沸点相差仅1-2℃的混合物分开。
利用分馏来分离混合物的原理与蒸馏是一样的,实际上分馏就是多次蒸馏。
有机化学实验六简单分馏将几种具有不同沸点而又可以完全互溶的液体混合物加热,当其总蒸气压等于外界压力时,就开始沸腾气化,蒸气中易挥发液体的成分较在原混合液中为多。
为了简化,我们仅讨沦混合物是二组分理想溶液的情况,所谓理想溶液即是指在这种溶液中,相同分子间的相互作用与不同分子间的相互作用是一样的。
也就是各组分在混合时无热效应产生,体积没有改变。
只有理想溶液才遵守拉乌尔定律。
拉乌尔定律溶液中每一组分的蒸气压等于此纯物质的蒸气压和它在溶液中的摩尔分数的乘积。
最新实验六(实验报告)
最新实验六(实验报告)实验目的:本次实验旨在探究特定物质在不同条件下的反应特性,以及通过实验数据分析物质的性质和变化规律。
通过对实验过程的观察和结果的记录,加深对理论知识的理解,并提高实验操作技能。
实验材料:1. 试样:待测物质样品2. 试剂:所需的化学反应试剂3. 仪器:天平、烧杯、量筒、滴定管、温度计、pH计、光谱仪等实验步骤:1. 准备阶段:根据实验要求,准确称取适量的试样和试剂,准备好所有实验仪器。
2. 实验操作:按照实验指导书的步骤,进行化学反应操作,记录下每个步骤的具体条件,如温度、pH值、反应时间等。
3. 数据收集:对反应过程中产生的数据进行收集,包括但不限于颜色变化、沉淀形成、气泡产生等。
4. 结果分析:根据收集到的数据,分析反应过程中物质的变化,以及反应的动力学特征。
5. 结论撰写:根据实验结果,撰写实验结论,总结物质的性质和反应特点。
实验结果:1. 反应速率:通过观察和记录,发现在特定条件下,反应速率与预期相符,具体数据见附录。
2. 产物分析:实验中产生的主要产物为X和Y,通过光谱分析确认了其结构。
3. 副反应:在实验过程中,未观察到明显的副反应现象。
4. 影响因素:实验中发现温度和pH值对反应速率有显著影响。
实验讨论:本次实验中,反应的速率和产物与理论预测基本一致,但在实际操作中存在一定的误差,可能的原因包括实验操作的不精确、环境条件的波动等。
未来可以通过改进实验方法和控制实验条件来减少误差。
结论:通过本次实验,我们成功地研究了特定物质在不同条件下的反应特性,并通过数据分析得到了物质的性质和反应规律。
实验结果对理解相关化学反应机制具有重要意义,并为进一步的实验研究提供了基础。
实验六 SDS实验报告
实验六 SDS-PAGE测定蛋白质分子量生物111 杨明轩 1102040128一、研究背景及目的对于那些生物体内含量高、易于分离结晶获得纯品的蛋白,可以通过测定氨基酸序列,借助各种氨基酸的分子量求出蛋白的分子量,并与质谱等手段相互结合,得到精确可信的分子量。
但对于那些含量少,不易分离的蛋白,无法实现结晶,就必须借助其他手段测定其分子量。
要找到能够测定分子量的实验手段,首先要考虑那些能够将不同分子按照其各自的分子量分离的技术。
在众多的技术当中,密度梯度离心、层析、电泳都与物质的分子量有关。
其中,超速离心机造价高,使用过滤层析色谱测分子量要做标准曲线,柱长要求高,且这些方法不够准确。
因此,电泳技术成为了实现分子量测定这一目的的最佳选择。
但是,在活性电泳中,影响蛋白前迁移率的因素有蛋白质的电荷性质、分子大小和形状。
要测定分子量,就要消除电荷、分子形状对蛋白迁移率的影响,即使得各种蛋白的电荷、形状不存在显著差异。
对于电荷,使各分子不带电违背电泳的基本原理,而使各分子带点完全相同是无法实现的,因此考虑使其带上大量电荷,从而让分子之间的电荷差异可以忽略。
在活性电泳中,改变样品的带电情况依靠的是缓冲液pH的变化,显然不能够使分子大量带电,这就表明必须向电泳体系中引入其他物质,与蛋白分子定量等量结合,且不改变分子量差异造成泳动差异。
对于分子形状,考虑到功能性蛋白大多是球形粒子,要保持形状不变,就要实现对蛋白的包裹性结合。
而蛋白表面的电荷分布情况千差万别,依靠电荷性质无法结合形成稳定的复合物。
考虑到蛋白质中含有大量的疏水氨基酸,可以通过疏水作用结合,这就要造成蛋白变性,是疏水基团充分暴露出来,分子不能在维持球型而变成棒状,因此,所选择的物质还需要能够维持复合物形状的统一。
基于以上考虑,科学家选择了双亲性物质,既能通过疏水作用与蛋白定量结合成牢固的复合物,又能借助亲水性在溶液中良好分散。
新技术的发明常以原有技术作为基础。
实验六 (2)
大连理工大学本科实验报告课程名称:网络综合实验学院(系):软件学院专业:软件工程班级:0816学号:200892417 学生姓名:顾万利大连理工大学实验报告学院(系): 专业: 班级: 姓 名: 学号: 组: ___ 实验时间: 实验室: 实验台: 指导教师签字: 成绩:实验六:广域网协议配置一、实验目的两台路由器之间的PPP 和Frame Relay 协议配置二、实验原理和内容1、路由器的基本工作原理2、配置路由器的方法和命令3、PPP 的基本原理及配置4、Frame Relay 协议的基本原理及配置三、实验环境以及设备2台路由器、2台Pc 机、双绞线若干四、实验步骤(操作方法及思考题)1、请在用户视图下使用“reset saved-configuration ”命令和“reboot ”命令分别将两台路由器的配置清空,以免以前实验留下的配置对本实验产生影响。
2、在确保路由器电源关闭情况下,按照下图联线组建实验环境。
配置IP 地址,以及配置PC 202.0.0.2 的缺省网关为 202.0.0.1,PC 202.0.1.2 的缺省网关为 202.0.1.1。
202.0.0.2/24202.0.1.2/24192.0.0.1/24192.0.0.2/24202.0.0.1/24202.0.1.1/24S0S0E0E0交叉线交叉线AR18-12AR28-113、在两台路由器上都启动RIP,目标是使两台PC机之间能够ping通。
请将为达到此目标而在两台路由器上执行的启动RIP的命令写到实验报告中。
你们的两台PC机之间ping通了吗?在缺省情况下,两台路由器的串口之间使用的是哪种广域网协议?[Quidway]int e0/0[Quidway-Ethernet0/0]ip add 202.0.1.1 255.255.255.0[Quidway-Ethernet0/0]int s0/0[Quidway-Serial0/0]ip add 192.0.0.2 255.255.255.0[Quidway-Serial0/0]shutdown[Quidway-Serial0/0]undo shutdown[Quidway-Serial0/0]rip[Quidway-rip] network all//若上面的命令有错误尝试[Quidway-rip] network 0.0.0.0在缺省情况下,两台路由器的串口之间使用的是ppp4、PPP协议PAP验证配置:(1)配置AR18-12为验证方,AR28-11为被验证方,然后测试两台PC机之间是否能够ping通。
实验六:沉淀溶解平衡讨论报告
沉淀溶解平衡讨论报告完成日期:2012年11月3日作者:刘薇刘春宏刘树青徐璐颖戴安婧吴亦歌指导老师:王睿博一摘要本文主要围绕三个问题展开讨论。
一个是预测硫酸铁和硫酸铝与碳酸钠反应的产物,第二个是根据本实验1-2)讨论酸碱平衡对沉淀生成的影响,最后一个是设计一种制备碳酸铬,碳酸铝以及碳酸铁的方法。
二前言讨论背景:在沉淀溶解平衡过程中,反应受多种因素影响。
在不同的溶液组成条件下,沉淀生成的种类以及是否有沉淀生成都有可能不同。
讨论意义:加深对沉淀溶解平衡的理解,认识影响沉淀溶解平衡的因素,进而掌握制备沉淀的方法。
三内容(一)预测更换试剂后反应的产物由于碳酸钠水中溶液的碳酸根离子水解使溶液呈碱性(该反应的平衡常数是2.13×10^(-4))。
所以溶液中存在较多的氢氧根离子(大概是0.1M)。
另一方面,氢氧化铁的Ksp=4.0×10^(-38),是一个非常小的数值(同样氢氧化铝的Ksp=1.3×10^(-33)也是一个非常小的数值)。
所以溶液中很可能生成的是氢氧化物的沉淀。
再者,在水溶液中,若生成的是碳酸铁或者碳酸铝的话,由于碳酸根离子是弱酸的阴离子,铁离子和铝离子都是弱碱的阳离子,它们在水溶液中都会发生一定程度的水解反应,且相互促进,使得各自的水解程度增大,即发生双水解反应。
生成的碳酸铁或碳酸铝又转化成了氢氧化铁或氢氧化铝。
(注:碳酸铁双水解反应的平衡常数可以通过算该反应的ΔG,再通过van’t Hoff公式求出该反应的平衡常数。
至于氢氧化铁的G可以通过铁离子的水解方程求出。
)综上所述,我们预计以硫酸铁和硫酸铝代替铬钾矾与碳酸钠发生反应的产物是氢氧化铁和氢氧化铝。
(二)结合实验1-2)阐述酸碱平衡对沉淀生成的影响实验1-2)中硝酸锌与硫化氢反应生成硫化锌。
ZnS(S)≒Zn+(aq)+S2-(aq)反应中有硫离子生成,当溶液中有较多的氢离子时,氢离子会与硫离子结合生成硫化氢的弱电解质,从而使沉淀溶解的这一反应向沉淀溶解的方向进行,使得硫化锌沉淀溶解。
转氨作用实验报告
竭诚为您提供优质文档/双击可除转氨作用实验报告篇一:实验六纸层析法观察转氨基作用实验报告实验六纸层析法观察转氨基作用【实验名称】:纸层析法观察转氨基作用09救援一班第三大组李岚宇20XX222336室温:28°(一)实验目的:1、学习氨基酸纸层析的基本原理。
2、掌握氨基酸纸层析的操作原理。
(二)实验原理:转氨基作用是氨基酸代谢过程中的一个重要反应,在转氨酶的催化下,氨基酸的а-酮酸与α-酮基的互换反应称为转氨基作用。
转氨基作用广泛地存在于机体各组织器官中,是体内氨基酸代谢的重要途径。
氨基酸反应时均由专一的转氨酶催化,此酶催化氨基酸的α-氨基转移到另一α-酮基酸上。
各种转氨酶的活性不同,其中肝脏的丙氨酸氨基转移酶(ALT)催化如下反应:α—酮戊二酸+丙氨酸谷氨酸+丙酮酸本实验以丙氨酸和α-酮戊二酸为底物,加肝匀浆保温后,用纸层析法检查谷氨酸的出现,以证明转氨基作用。
纸层析属于分配层析。
以滤纸为支持物,滤纸纤维与水亲合力强,水被吸附在滤纸的纤维素的纤维之间形成固定相。
有机溶剂与水不相溶,把预分离物质加到滤纸的一端,使流动溶剂经此向另一端移动,这样物质随着流动相的移动进行连续、动态的不断分配。
由于物质分配系数的差异,而使移动速度就不一样,在固定相中,分配趋势较大的组分,随流动相移动的速度就慢,反之,在流动相分配趋势较大的成分,移动速度快,最终不同的组分彼此分离,物质在纸上移动的速率可以用比值Rf表示:ALT物质在一定的溶液中的分配系数是一定的,故比值Rf也相对稳定,因此在同一层析体系中可用Rf值来鉴定被分离的物质。
(三)实验材料与仪器:试剂:1、0.01mol/Lph7.4磷酸盐缓冲液。
2、0.2mol/Lna2hpo4溶液81ml与0.2mol/Lnah2po4溶液19ml混匀,用蒸馏水稀释20倍。
3(:转氨作用实验报告)、0.1mol/L丙氨酸溶液称取丙氨酸0.891克,先溶于少量0.01mol/Lph7.4磷酸盐缓冲液中,以1.0nnaoh仔细调至ph7.4后,加磷酸盐缓冲液至100ml。
实验六胶体溶液的制备与性质
韩山师院化学系化学专业物理化学实验课实验报告实验六胶体溶液的制备与性质实验目的:了解水溶胶的制备方法及胶体溶液的一些性质。
实验原理:分散相的粒子直径在10-9~10-7m之间的分散物系叫做胶体。
胶体物系的制备方法有两种:一种是分散法,使粒子较大的物质分散成胶体物系;另一种是凝聚法,使溶质分子原子或者离子自行结合成胶粒大小而形成溶胶。
本实验利用凝聚法制备Fe(OH)3溶胶和MnO2溶胶。
通常溶胶都具有比较稳定性质,如可以在密闭条件下保持比较长的时间而不会产生沉淀,原因在于胶粒具有一定的ζ电位和溶剂化膜,故当加入一定的电解质时,胶粒电性相反的溶胶或其它物质使ζ电位降低,溶剂化膜变薄时,胶体变得不稳定并发生聚沉。
本实验研究正溶胶Fe(OH)3和负溶胶MnO2的这些性质及渗析作用。
实验用品:仪器:酸式滴定管(50mL)、试管15支、烧杯(25mL×2,100mL×1)、量筒(100mL×1,50mL×1,10mL×1)丁达尔现象观察筒、试管架、锥形瓶(250mL×6)、移液管(25mL×1,2mL×2,1mL×4)玻璃棒、吸量管(10mL×1、2mL×2,1mL×1)、酒精灯、三脚架。
试剂:1mol/L盐酸、0.1mol/L KMnO4溶液、2.5mol/L KCl溶液、5% 氨水、0.01mol/L K2CrO4溶液、10% FeCl3溶液、1% H2O2溶液、0.001mol/L K3[Fe(CN)6]溶液、1mol/L Na2S2O3溶液实验内容及其现象记录:问题与讨论:1、用量筒量取190mL蒸馏水进行加热一定要沸腾后才能逐滴加入10mL10% FeCl3溶液。
2、在制取MnO2溶胶时,滴加H2O2时一定要慢慢滴加,充分搅拌,否则会产生沉淀,当用玻棒醮取该溶液点于滤纸时把滤纸染为粉红色,应注意要求外围的一小圈为粉红色,中间大部分是黄褐色,否则还得继续滴加1% H2O2溶液。
数值分析实验报告--实验6--解线性方程组的迭代法
1 / 8数值分析实验六:解线性方程组的迭代法2016113 张威震1 病态线性方程组的求解1.1 问题描述理论的分析表明,求解病态的线性方程组是困难的。
实际情况是否如此,会出现怎样的现象呢?实验内容:考虑方程组Hx=b 的求解,其中系数矩阵H 为Hilbert 矩阵,,,1(),,,1,2,,1i j n n i j H h h i j n i j ⨯===+-这是一个著名的病态问题。
通过首先给定解(例如取为各个分量均为1)再计算出右端b 的办法给出确定的问题。
实验要求:(1)选择问题的维数为6,分别用Gauss 消去法、列主元Gauss 消去法、J 迭代法、GS 迭代法和SOR 迭代法求解方程组,其各自的结果如何?将计算结果与问题的解比较,结论如何?(2)逐步增大问题的维数(至少到100),仍然用上述的方法来解它们,计算的结果如何?计算的结果说明了什么?(3)讨论病态问题求解的算法1.2 算法设计首先编写各种求解方法的函数,Gauss 消去法和列主元高斯消去法使用实验5中编写的函数myGauss.m 即可,Jacobi 迭代法函数文件为myJacobi.m ,GS 迭代法函数文件为myGS.m ,SOR 方法的函数文件为mySOR.m 。
1.3 实验结果1.3.1 不同迭代法球求解方程组的结果比较选择H 为6*6方阵,方程组的精确解为x* = (1, 1, 1, 1, 1, 1)T ,然后用矩阵乘法计算得到b ,再使用Gauss 顺序消去法、Gauss 列主元消去法、Jacobi 迭代法、G-S 迭代法和SOR 方法分别计算得到数值解x1、x2、x3、x4,并计算出各数值解与精确解之间的无穷范数。
Matlab 脚本文件为Experiment6_1.m 。
迭代法的初始解x 0 = (0, 0, 0, 0, 0, 0)T ,收敛准则为||x(k+1)-x(k)||∞<eps=1e-6,SOR方法的松弛因子选择为w=1.3,计算结果如表1。
实验六网络文件共享实验
实验六、网络文件共享实验(需报告)一、实验目的:通过本实验使同学们掌握网络文件共享的设置与使用方法。
二、实验内容及要求:(一):安装和设置“文件及打印共享服务”(已经空装不需要做)1:单击“控制面板”->打开“网络”,进入网络属性配置窗口2:在网络属性配置窗口中的“配置”选项卡中,点击“文件及打印共享”按钮,选中“允许其他用户访问我的文件”和“允许其他计算机使用我的打印机”,点“确定”,回到网络属性配置窗口,点“确定”,并在接下来的安装文件路径信息提示中,输入wind ows2000/windows XP安装光盘(或安装文件)所在的路径,继续安装即可完成。
重新启动之后即可使用。
(二):文件目录共享设置1:在D盘上新建3个文件夹(文件夹目录自定)2:分别将3个文件夹设置为:(1)只读共享;(win 9x中可以设置无需口令或需要口令)(2)完全共享;(win 9x中可以设置无需口令或需要口令)(3)隐藏共享:(共享名$)3:网络共享访问(1)打开“网上邻居”,进入共享所在的计算机,打开共享名即可(2)通过“开始”->"查找"->"计算机",输入要查找的计算机名,找到后双击该计算机即可查看该计算机上的共享。
(例如:计算机名:c014,则网络路径为\\c014)(3)通过“开始”->"运行",输入要查找的计算机的网络路径(例如计算机名为c014,有一个共享名为share1,则网络路径为\\c014\share1)(4)隐藏共享访问:通过“开始”->"运行",输入要查找的计算机的网络路径(例如计算机名为c014,有一个隐藏共享名为sh a re1,则网络路径为\\c014\share1$,$符一定要加,不然不能访问隐藏共享的文件夹)(5)在资源管理器或浏览器的地址栏中,输入要查找的计算机的网络路径也可以。
实验5-6报告
实验五加减法电路一、实验目的掌握一位全加器的实现逻辑,掌握多位可控加减法电路的实现逻辑,熟悉Logisim 平台基本功能,能在 logisim 中实现多位可控加减法电路。
二、实验内容在 Logisim 模拟器中打开 alu.circ 文件,在对应子电路中利用已经封装好的全加器设计8位串行可控加减法电路,其电路引脚定义如图所示,用户可以直接使用在电路中使用对应的隧道标签,其中 X,Y 为两输入数,Sub 为加减控制信号,S 为运算结果输出,Cout 为进位输出,OF 为有符号运算溢出位。
三、电路框架相关引脚说明:四、实验结果(1)请描述你的电路设计原理(文字),比如用到了整体哪些元件,元件的输入和输出分别是什么,使用该元件的作用或目的是什么。
电路设计原理:将8个一位全加器FA的进位链串联即可得到8位加法器,由于补码符号位也可以参与运算,所以此电路既可以用于有符号数运算,也可以用于无符号数运算,但二者在溢出检测上有一定区别,这里OF的判定以有符号数加法运算是否溢出为标准。
溢出检测:根据运算过程中,最高数据位的进位与符号位的进位位是否一致进行检测。
V= Cd xor Cf。
sub = 0,执行减法操作。
0和二进制数异或运算得到其本身,然后通过一位全加器FA执行加法运算。
sub = 1,执行减法操作。
1和二进制数异或运算相当于对二进制数进行取反操作,然后将sub = 1,传入FA进行+1操作。
(由[y]补求[-y]补,全部位取反后加一)。
高位进位的产生依赖于低位进位的输入,串行进位加法器的速度较慢。
输入:操作数1X的8位数据X7-X0,操作数2Y的八位数据Y7-Y0。
最低位进位Cin,加减法控制项Sub。
输出:运算结果S的八位数据S7-S0,最高位进位Cout,有符号运算溢出判断OF。
(2)改变输入组合如下所示9种情况,观察输出结果是否符合(贴图)。
1.X Y Sub S Cout OF2.1021031003.7f02081014.ff fe 0 fd 105.8182003116.10 df 131007.7f fe 181018.ff 021 fd 109.817e1031123456789实验六快速加法器设计电路一、实验目的掌快速加法器中先行进位的原理,能利用相关知识设计4位先行进位电路,并利用设计的4位先行进位电路构造4位快速加法器,能分析对应电路的时间延迟。
实验六 微生物细胞大小的测定
实验六微生物细胞大小的测定一、目的要求1.学会测微尺的使用和计算方法。
2.掌握酵母菌细胞大小测定的方法。
二、基本原理微生物细胞大小,是微生物的形态特征之一,也是分类鉴定的依据之一。
由于菌体很小,只能在显微镜下测量。
用来测量微生物细胞大小的工具有目镜测微尺和镜台测微尺。
镜台测微尺是中央部分刻有精确等分线的载玻片。
一般将1mm等分为100格(或2mm等分为200格),每格长度等于0.01mm(即106μm)。
是专用于校正目镜测微尺每格长度的。
目镜测微尺是一块可放在接目镜内的隔板上的圆形小玻片,其中央刻有精确的刻度,有等分50小格或100小格两种,每5小格间有一长线相隔。
由于所用接目镜放大倍数和接物镜放大倍数的不同,目镜测微尺每小格所代表的实际长度也就不同,因此,目镜测微尺不能直接用来测量微生物的大小,在使用前必须用镜台测微尺进行校正,以求得在一定放大倍数的接目镜和接物镜下该目镜测微尺每小格的相对值,然后才可用来测量微生物的大小。
三、器材枯草芽孢杆菌染色玻片标本,目镜测微尺,镜台测微尺,显微镜,擦镜纸,香柏油等。
四、操作步骤1.目镜测微尺的标定(1)放置目镜测微尺取出接目镜,旋开接目镜透镜,将目镜测微尺的刻度朝下放在接目镜筒内的隔板上(图Ⅳ-4,B),然后旋上接目透镜,最后将此接目镜插入镜筒内(图Ⅳ-4,C)。
(2)放置镜台测微尺将镜台测微尺置于显微镜的载物台上,使刻度面朝上。
(3)校正目镜测微尺先用低倍镜观察,对准焦距,当看清镜台测微尺后,转动接目镜,使目镜测微尺的刻度与镜台测微尺的刻度平行,移动推动器,使目镜测微尺和镜台测微尺的某一区间的两对刻度线完全重合,然后计数出两对重合线之间各自所占的格数(图Ⅳ-6)。
根据计数得到的目镜测微尺和镜台测微尺重合线之间各自所占的格数,通过如下公式换算出目镜测微尺每小格所代表的实际长度。
目镜测微尺每小格长度(μm)=同法校正在高倍镜和油镜下目镜测微尺每小格所代表的长度。
实验报告6篇
实验报告6篇实验报告1(1)点燃等可燃性气体时,未检验其纯度或检验有误,造成混入空气点燃时发生爆炸。
(2)用时,混入可燃性固体杂质造成加热时剧烈燃烧发生爆炸。
(3)拿着酒精灯到另一个燃着的酒精灯上点火,或向燃着的酒精灯内添加酒精以及熄灭酒精灯时不用灯帽而用嘴吹,引起灯体内酒精燃烧发生爆炸。
(4)加热固体物质时试管口没有略向下倾斜,造成试管中出现的水蒸气在管口凝聚成水滴倒流到试管底部,使其炸裂。
(5)加热试管等仪器时,外壁沾有水珠未擦试干净、没有预热或仪器底部同灯芯相接触造成炸裂。
(6)加热,用排水法收集,实验完毕时未先移去导管后撤灯,造成水槽中的水倒流到试管中,使其炸裂。
(7)用量筒作容器进行加热或稀释浓硫酸等实验,造成量筒炸裂。
(8)做细铁丝在纯氧中燃烧的实验时,没有在集气瓶底部放少量水或铺一层细沙,致使集气瓶炸裂。
2. 操作不当造成药品污染(1)用高锰酸钾制氧气时,试管口没有塞上一团棉花,高锰酸钾颗粒进入导管和水槽使水染色。
(2)用玻璃棒或胶头滴管分别取用不同药品时,在使用中间没有将其擦试或洗涤干净,造成试剂的污染。
(3)药品用量过多,使产生的有害气体污染空气。
如硫在氧气(或空气)中燃烧。
(4)做实验时,试剂瓶塞张冠李戴。
如将稀硫酸的滴管放到盛氧化钠的滴瓶口上,造成药品污染。
(5)倾倒液体时,瓶塞没有倒放,标签没有对着掌心,造成液体里混入杂质,标签被腐蚀。
(6)实验室制二氧化碳时,用浓盐酸使得生成的气体中含有氯化氢气体等杂质,影响实验的现象。
(7)一些易与空气中的等反应的药品,保存不够严密,致使变质。
3. 操作不当引起实验失败或出现偏差(1)用量筒量取液体时,没有正确读数,造成量取的液体体积同实验要求有偏差,致使实验不够成功。
(2)配制一定溶质质量分数的溶液时,天平的使用有误,如将物品与砝码放反,致使最终配制的溶液中溶质质量分数有误。
(3)用排水法收集气体时,将集所瓶倒置于水中,集气瓶内没有灌满水,造成气体不纯。
C语言实验六实验报告—指针
C语言实验六实验报告—指针实验六:指针实验报告一、实验目的1.了解指针的概念和作用;2.掌握指针与数组、函数的关系;3.熟悉指针的运算和指针的应用。
二、实验内容1.指针的定义和初始化;2.指针与数组的关系;3.指针与函数的关系。
三、实验原理1.指针的定义和初始化指针是一个变量,其值为另一个变量的地址。
可以使用指针来访问和修改内存中的数据。
指针的定义格式为:数据类型*指针名;可以使用&运算符来获取变量的地址,并将其赋值给指针。
2.指针与数组的关系数组是一组相同类型的数据的集合,而指针可以指向数组的首地址。
通过指针可以访问数组中的元素。
数组名本身就是一个指针常量,存储了数组的首地址。
定义指针指向数组时,可以使用数组名作为初始化值。
3.指针与函数的关系函数可以接受指针作为参数,通过指针可以修改传递给函数的变量的值。
函数也可以返回指针,指向在函数内部创建的局部变量。
需要注意的是,在使用指向局部变量的指针时要小心,因为函数执行完毕后,局部变量会被释放,指针将指向无效的内存地址。
四、实验步骤1.指针的定义和初始化定义一个整型变量a,并使用指针p指向a的地址。
使用*p来访问a 的值,使用&运算符获取a的地址并给指针p赋值。
2.指针与数组的关系定义一个整型数组arr,并使用指针p指向数组的首地址。
使用p[i]来访问数组的元素,使用*(p+i)也可以实现相同的效果。
3.指针与函数的关系定义一个函数,接受一个指针作为参数,并使用指针修改传递给函数的变量的值。
定义一个函数,返回一个指针,指向在函数内部创建的局部变量。
在主函数中调用这两个函数,并打印出相应的结果。
五、实验结果1.指针的定义和初始化定义一个整型变量a,并初始化为10。
指针p指向a的地址,使用*p 来访问a的值。
2.指针与数组的关系定义一个整型数组arr,并初始化为{1, 2, 3, 4, 5}。
指针p指向数组的首地址,使用p[i]来访问数组的元素。
大学计算机实验6 实验报告
大学计算机实验6 实验报告一、实验目的本次大学计算机实验 6 的目的在于深入了解和掌握计算机系统中的某些关键技术和应用,通过实际操作和实践,提高我们对计算机知识的理解和应用能力,培养我们解决实际问题的思维和方法。
二、实验环境本次实验在学校的计算机实验室进行,使用的计算机配置为_____,操作系统为_____,安装了所需的实验软件,包括_____等。
三、实验内容(一)操作系统的基本操作1、文件和文件夹的管理熟练掌握了文件和文件夹的创建、复制、移动、删除、重命名等操作。
通过实际操作,了解了文件和文件夹的属性设置,如只读、隐藏等,以及如何查找和筛选特定的文件和文件夹。
2、任务管理器的使用学会了使用任务管理器查看系统中正在运行的进程、CPU 和内存的使用情况。
能够通过任务管理器结束无响应的进程,优化系统资源的分配。
(二)办公软件的应用1、 Word 文档的编辑使用 Word 进行了文档的排版,包括字体、字号、颜色、段落格式的设置。
学会了插入图片、表格、页眉页脚等元素,以及如何进行文档的页面设置和打印预览。
2、 Excel 数据处理在 Excel 中,掌握了数据的输入、编辑和格式化。
学会了使用函数和公式进行数据的计算和统计,如求和、平均值、最大值、最小值等。
还掌握了数据的排序、筛选和图表的创建,能够将数据以直观的方式呈现出来。
(三)网络应用1、浏览器的使用熟悉了常用浏览器的操作,如网页的浏览、书签的添加和管理、历史记录的查看等。
学会了设置浏览器的主页、隐私和安全选项。
2、电子邮件的收发通过实验,掌握了电子邮箱的注册和设置,能够熟练地发送和接收电子邮件,包括添加附件、设置邮件格式和优先级等。
(四)多媒体软件的使用1、图片处理软件使用图片处理软件对图片进行了裁剪、调整大小、色彩调整、添加文字和特效等操作,提高了图片的质量和美观度。
2、音频和视频播放软件学会了使用音频和视频播放软件播放各种格式的文件,掌握了播放控制、音量调节、画面调整等基本操作。
实验6_状态反馈与状态观测器.doc
实验6_状态反馈与状态观测器自动控制原理实验报告自动控制原理实验报告院系名称:仪器科学与光电工程学院班级:141715班姓名:武洋学号:14171073实验六状态反馈与状态观测器一、实验目的1. 掌握用状态反馈进行极点配置的方法。
2. 了解带有状态观测器的状态反馈系统。
3. 理解系统极点、观测器极点与系统性能、状态估计误差之间的关系。
二、实验内容1. 系统G(s)=10.05s2+s+1如图2.6.1所示,要求设计状态反馈阵K,使动态性能指标满足超调量,峰值时间。
图2.6.1二阶系统结构图2.被控对象传递函数为写成状态方程形式为式中; ;为其配置系统极点为S1,2=-仪器科学与光电工程学院班级:141715班姓名:武洋学号:14171073实验六状态反馈与状态观测器一、实验目的1. 掌握用状态反馈进行极点配置的方法。
2. 了解带有状态观测器的状态反馈系统。
3. 理解系统极点、观测器极点与系统性能、状态估计误差之间的关系。
二、实验内容1. 系统G(s)=10.05s2+s+1如图2.6.1所示,要求设计状态反馈阵K,使动态性能指标满足超调量,峰值时间。
图2.6.1二阶系统结构图2.被控对象传递函数为写成状态方程形式为式中; ;为其配置系统极点为S1,2=:其中维状态反馈系数矩阵,由计算机算出。
维观测器的反馈矩阵,由计算机算出。
为使跟踪所乘的比例系数。
三、实验原理1. 闭环系统的动态性能与系统的特征根密切相关,在状态空间的分析中可利用状态反馈来配置系统的闭环极点。
这种校正手段能提供更多的校正信息,在形成最优控制率、抑制或消除扰动影响、实现系统解耦等方面获得广泛应用。
在改善与提高系统性能时不增加系统零、极点,所以不改变系统阶数,实现方便。
2. 已知线形定常系统的状态方程为为了实现状态反馈,需要状态变量的测量值,而在工程中,并不是状态变量都能测量到,而一般只有输出可测,因此希望利用系统的输入输出量构成对系统状态变量的估计。
实验六SDS实验报告
实验六SDS实验报告1. 实验目的本实验旨在通过测定表面活性剂十二烷基硫酸钠(SDS)的临界胶束浓度和表面张力,探究SDS在水溶液中的表面活性行为,并了解其对化学反应的影响。
2. 实验器材与试剂- 器材:电子天平、试剂瓶、磁力搅拌器、扩散管、毛细管- 试剂:SDS、高纯水、乙醇3. 实验原理SDS是一种阴离子表面活性剂,可降低液体表面的表面张力。
在水溶液中,SDS分子会聚合形成胶束,当胶束的浓度达到一定程度时,称为临界胶束浓度(CMC)。
4. 实验步骤4.1 测定临界胶束浓度(CMC)4.1.1 预处理检测毛细管- 用高纯水冲洗毛细管,确保其内外无气泡。
- 用乙醇洗净毛细管,提高其润湿性能。
4.1.2 制备一系列浓度的SDS溶液- 分别称取不同质量的SDS,溶解于一定体积的高纯水中,得到不同浓度的SDS溶液。
4.1.3 填充扩散管- 将预处理好的毛细管插入扩散管中,通过磁力搅拌器搅拌,保持溶液的均匀性。
- 用一定质量的SDS溶液填充扩散管。
4.1.4 扩散实验- 在一个固定温度下,记录SDS溶液从毛细管开始扩散到溶液终点的时间。
- 重复实验,取平均值。
4.1.5 绘制扩散时间与SDS浓度的曲线- 将浓度作为横坐标,扩散时间作为纵坐标。
- 根据曲线的拐点,确定临界胶束浓度。
4.2 测定表面张力4.2.1 准备SDS溶液- 用高纯水配制一定浓度的SDS溶液。
4.2.2 表面张力计测定- 将表面张力计的叶片浸入SDS溶液中。
- 阅读并记录表面张力计上的数值。
5. 实验结果与分析5.1 CMC的确定- 根据实验数据,绘制SDS浓度与扩散时间的曲线。
- 通过拐点的位置确定CMC的值。
5.2 表面张力的测定- 通过实验测得的表面张力值,分析SDS溶液的表面活性。
6. 结论- 经过实验测定,确定了SDS的临界胶束浓度。
- 测定了SDS溶液的表面张力,了解了SDS在溶液中的表面活性行为。
7. 实验中的注意事项- 实验过程中应注意安全,避免有害物质的接触。
云南大学软件学院计算机网络原理实验六实验报告3
实验六、传输层可靠传输协议GBN编程实验报告序号:姓名:学号:成绩指导老师:一、实验目的:1、通过编写实现一个简单可靠的数据传输协议GBN的发送和接收代码,模拟可靠数据传输2、理解TCP协议可靠传输的差错检测、重传、累计确认、定时器的可靠传输策略。
二、实验指导:参考教材。
动画演示:三、实验要求:编程实现一个GBN传输协议的发送方和接收方两程序,采用编程语言不限,要求能将发送――接收流程以及处理方法表现出来.1.实验流程图如下:N2.实验截图与代码如下: 截图: 传送下一个数据包结束代码及注释:一、GBN.h#pragma once#include <stdio.h>//基础功能模块的数据结构声明#define BIDIRECTIONAL 1 /* change to 1 if you're doing extra credit andwrite a routine called B_output *//* a "msg" is the data unit passed from layer 5 (teachers code) to layer4 (students' code). It contains the data (characters) to be delivered tolayer 5 via the students transport level protocol entities. */struct msg{ char data[20];};/* a packet is the data unit passed from layer 4 (students code) to layer3 (teachers code). Note the pre-defined packet structure, which allstudents must follow. */struct pkt{int seqnum;int acknum;int checksum;char payload[20];};#define WINDOWSIZE 8#define MAXBUFSIZE 50#define RTT 15.0#define NOTUSED 0#define NACK -1#define TRUE 1#define FALSE 0#define A 0#define B 1//网络仿真部分数据结构声明***********************************************************struct event{float evtime; /* event time */int evtype; /* event type code */int eventity; /* entity where event occurs */struct pkt *pktptr; /* ptr to packet (if any) assoc w/ this event */ struct event *prev;struct event *next;};/* possible events: */#define TIMER_INTERRUPT 0#define FROM_LAYER5 1#define FROM_LAYER3 2#define OFF 0#define ON 1//基础功能模块的函数声明******************************************************************* void ComputeChecksum(struct pkt *packet);//计算校验和int CheckCorrupted(struct pkt packet);//检查数据是否出错void A_output( struct msg message);//A端向外发送数据void A_input(struct pkt packet);//A端接收数据void A_timerinterrupt();//A计时器超时void A_init();//A端初始化void B_output(struct msg message);void B_input(struct pkt packet);void B_timerinterrupt();void B_init();//网络仿真部分的函数声明**************************************************void init(); //初始化仿真器float jimsrand();//随机数发生器[0,1]//处理事件列表部分的函数声明*********************************************void generate_next_arrival();//产生下一个到达的分组void insertevent(struct event *p);//向事件列表中插入一条新的事件void printevlist();//打印事件列表//******************************************************************** //**********************计时器模块*********************************** void stoptimer(int);//停止计时器void starttimer(int,float);//启动计时器//******************************************************************** *//**************************网络各层之间传送模块***********************void tolayer3(int AorB,struct pkt packet);//向第3层发送信息void tolayer5(int AorB,char datasent[20]);//向第5层发送信息二、GBN.c#include "GBN.h"#include <stdio.h>#include <string.h>#include <stdlib.h>extern int TRACE = 1; /* for my debugging */为我的调试extern int nsim = 0; /* number of messages from 5 to 4 so far */目前为止信息的数字是从5到4extern int nsimmax = 0; /* number of msgs to generate, then stop */如果信息产生的数字为0,然后就停止extern float time = 0.000;float lossprob; /* probability that a packet is dropped */数据包可能会丢失float corruptprob; /* probability that one bit is packet is flipped*/这一点的数据包可能会被弹出去float lambda; /* arrival rate of messages from layer 5 */ 第五层到达的信息的次序int ntolayer3; /* number sent into layer 3 */被传送到第三层的数据static int nlost = 0; /* number lost in media */在媒介中数据丢失static int ncorrupt = 0; /* number co rrupted by media*/被媒介毁坏的数据static int expectedseqnum = 0; /* expected se quence number at receiver side */在接收者这边接收到预期的序列数据static int nextseqnum; /* next sequence number to use in sender side */下一个序列数据使用在发送者这边static int base; /* t he head of sender window */发送者的头窗口struct pkt winbuf[WINDOWSIZE]; /* window packets buffer */数据包缓冲区窗口static int winfront,winrear; /* front and rear points of wind ow buffer */窗口缓冲区的前方点和后方点static int pktnum; /* packet number of window buffer */窗口缓冲区的数据包个数struct msg buffer[MAXBUFSIZE]; /* sender message buffer */发送消息缓冲区int buffront,bufrear; /* front and rear pointers of buffer */缓冲区的前指针与后指针static int msgnum; /* message number of buffer */信息数量的缓冲int packet_lost =0;int packet_corrupt=0;int packet_sent =0;extern int packet_correct=0;extern int packet_resent =0;int packet_timeout=0;extern struct event *evlist = NULL; /* the event list *///计算校验和void ComputeChecksum( struct pkt *packet){int checksum;int i;checksum = packet->seqnum;checksum = checksum + packet->acknum;for ( i=0; i<20; i++ )checksum = checksum + (int)(packet->payload[i]);checksum = 0-checksum;packet->checksum = checksum;}//检查是否出错int CheckCorrupted(struct pkt packet){int checksum;int i;checksum = packet.seqnum;checksum = checksum + packet.acknum;for ( i=0; i<20; i++ )checksum = checksum + (int)(packet.payload[i]);if ( (packet.checksum+checksum) == 0 )return (FALSE);elsereturn (TRUE);}//A端向外发送数据/* called from layer 5, passed the data to be sent to other side */ void A_output(struct msg message){int i;struct pkt sendpkt;/* if window is not full */if ( nextseqnum < base+WINDOWSIZE ){printf("----A: New message arrives, send window is not full, send new messge to layer3!\n");/* create packet */sendpkt.seqnum = nextseqnum;sendpkt.acknum = NOTUSED;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = message.data[i];/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet */tolayer3 (A, sendpkt);/* copy the packet to window packet buffer */winrear = (winrear+1)%WINDOWSIZE;pktnum ++;winbuf[winrear] = sendpkt;for (i=0; i<20; i++)winbuf[winrear].payload[i]= sendpkt.payload[i];/* update state variables */nextseqnum = nextseqnum+1;starttimer(A,RTT);B_input(sendpkt);A_input(sendpkt);}/* if window is full */else{printf("----A: New message arrives, send window is full,");/* if buffer full, give up and exit*/if ( msgnum == MAXBUFSIZE){printf (" Error: Sender buffer is full! \n");exit (1);}/* otherwise, buffer the message */else{printf("buffer new message!\n");bufrear = (bufrear+1) % MAXBUFSIZE;for (i=0; i<20; i++)buffer[bufrear].data[i] = message.data[i];msgnum ++;}}}//B端向外发送数据/* called from layer 5, passed the data to be sent to other side */ void B_output(struct msg message){int i;struct pkt sendpkt;/* if window is not full */if ( nextseqnum < base+WINDOWSIZE ){printf("----A: New message arrives, send window is not full, send new messge to layer3!\n");/* create packet */sendpkt.seqnum = nextseqnum;sendpkt.acknum = NOTUSED;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = message.data[i];/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet */tolayer3 (A, sendpkt);A_input(sendpkt);/* copy the packet to window packet buffer */winrear = (winrear+1)%WINDOWSIZE;pktnum ++;winbuf[winrear] = sendpkt;for (i=0; i<20; i++)winbuf[winrear].payload[i]= sendpkt.payload[i];/* if it is the first packet in window, start timeout */ //if ( base == nextseqnum )//{//starttimer(A,RTT);//printf("----A: start a new timer!\n");// }/* update state variables */nextseqnum = nextseqnum+1;}/* if window is full */else{printf("----A: New message arrives, send window is full,");/* if buffer full, give up and exit*/if ( msgnum == MAXBUFSIZE){printf (" Error: Sender buffer is full! \n");exit (1);}/* otherwise, buffer the message */else{printf("buffer new message!\n");bufrear = (bufrear+1) % MAXBUFSIZE;for (i=0; i<20; i++)buffer[bufrear].data[i] = message.data[i];msgnum ++;}}}//A端接收数据void A_input(struct pkt packet){struct pkt sendpkt;int i;/* if received packet is not corrupted and ACK is received */if ( (CheckCorrupted(packet) == FALSE) && (packet.acknum != NACK) ) {printf("----A: ACK %d is correctly received,",packet.acknum);packet_correct++;/* delete the acked packets from window buffer */winfront = (winfront+(packet.acknum+1-base)) % WINDOWSIZE; pktnum = pktnum - (packet.acknum+1-base);/* move window base */base = packet.acknum+1;stoptimer(A);if ( base < nextseqnum){//starttimer(A,RTT);printf ("\n\n\nsend new packets!");}/* if buffer is not empty, send new packets */while ( (msgnum!=0) && (nextseqnum<base+WINDOWSIZE) ) {/* create packet */sendpkt.seqnum = nextseqnum;sendpkt.acknum = NOTUSED;buffront = (buffront+1) % MAXBUFSIZE;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = buffer[buffront].data[i];/* computer checksum */ComputeChecksum (&sendpkt);/* if it is the first packet in window, start timeout */if ( base == nextseqnum ){//starttimer(A,RTT);printf ("send new packets!\n");}/* send out packet */tolayer3 (A, sendpkt);/* copy the packet to window packet buffer */winrear = (winrear+1)%WINDOWSIZE;winbuf[winrear] = sendpkt;pktnum ++;/* update state variables */nextseqnum = nextseqnum+1;/* delete message from buffer */msgnum --;}}elseprintf ("----A: NACK is received, do nothing!\n");}//B端接收数据*****************************************************一定要调用这个/* Note that with simplex transfer from a-to-B, there is no B_output() */ /* called from layer 3, when a packet arrives for layer 4 at B*/void B_input(struct pkt packet){struct pkt sendpkt;int i;/* if not corrupted and received packet is in order */if ( (CheckCorrupted(packet) == FALSE) && (packet.seqnum == expectedseqnum)){printf("\n----B: packet %d is correctly received, send ACK!\n",packet.seqnum);/* send an ACK for the received packet *//* create packet */sendpkt.seqnum = NOTUSED;sendpkt.acknum = expectedseqnum;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = '0';/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet *///tolayer3 (B, sendpkt);/* update state variables */expectedseqnum = expectedseqnum+1;printf("----B:expectedseqnum = %d\n",expectedseqnum);/* deliver received packet to layer 5 *///tolayer5(B,packet.payload);}/* otherwise, discard the packet and send a NACK */else{printf("----B: packet %d is corrupted or not I expects, send NACK!\n",packet.seqnum);/* create packet */sendpkt.seqnum = NOTUSED;sendpkt.acknum = NACK;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = '0';/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet */tolayer3 (B, sendpkt);}}//A计时器超时/* called when A's timer goes off */void A_timerinterrupt(){int i;printf("----A: time out,resend packets!\n");/* start timer */starttimer(A,RTT);/* resend all packets not acked */for ( i=1; i<=pktnum; i++ ){packet_resent++;tolayer3(A,winbuf[(winfront+i)%WINDOWSIZE]);}}//B计时器超时/* called when B's timer goes off */void B_timerinterrupt(){int i;printf("----B: time out,resend packets!\n");/* start timer */starttimer(B,RTT);/* resend all packets not acked */for ( i=1; i<=pktnum; i++ ){packet_resent++;tolayer3(B,winbuf[(winfront+i)%WINDOWSIZE]);}}//A端初始化/* entity A routines are called. You can use it to do any initialization */void A_init()base = 0;nextseqnum = 0;buffront = 0;bufrear = 0;msgnum = 0;winfront = 0;winrear = 0;pktnum = 0;}//B端初始化/* entity B routines are called. You can use it to do any initialization */void B_init(){expectedseqnum = 0;}//初始化仿真器void init() /* initialize the simulator */{int i;float sum, avg;float jimsrand();FILE *fp;fp = fopen ("parameter.txt","r");printf("----- Stop and Wait Network Simulator Version 1.1 -------- \n\n");printf("Enter the number of messages to simulate: ");//fscanf(fp,"%d",&nsimmax);scanf("%d",&nsimmax);printf("\nEnter packet loss probability [enter 0.0 for no loss]: "); //fscanf(fp, "%f",&lossprob);scanf("%f",&lossprob);printf("\nEnter packet corruption probability [0.0 for no corruption]: "); //fscanf(fp,"%f",&corruptprob);scanf("%f",&corruptprob);printf("\nEnter average time between messages from sender's layer5 [ > 0.0]: ");//fscanf(fp,"%f",&lambda);scanf("%f",&lambda);printf("\nEnter TRACE: ");//fscanf(fp,"%d",&TRACE);scanf("%d",&TRACE);printf("\n\n");srand(9999); /* init random number generator */sum = 0.0; /* test random number generator for students */for (i=0; i<1000; i++)sum=sum+jimsrand(); /* jimsrand() should be uniform in [0,1] */avg = sum/1000.0;/*if(avg < 0.25 || avg > 0.75){printf("It is likely that random number generation on your machine\n" ); printf("is different from what this emulator expects. Please take\n"); printf("a look at the routine jimsrand() in the emulator code. Sorry. \n");exit(0);}*/printf("%f",avg);ntolayer3 = 0;nlost = 0;ncorrupt = 0;time=0.0; /* initialize time to 0.0 */generate_next_arrival(); /* initialize event list */}//随机数发生器float jimsrand(){double mmm = 2147483647; /* largest int - MACHINE DEPENDENT */float x; /* individual students may need to change mmm */x = rand()/mmm; /* x should be uniform in [0,1] */return(x);}//**************************************************************************************//*******************************事件处理部分*******************************************void generate_next_arrival(){double x,log(),ceil();struct event *evptr;float ttime;int tempint;//if (TRACE>2)//printf("-----------------GENERATE NEXT ARRIVAL: creating new arrival\n");x = lambda*jimsrand()*2; /* x is uniform on [0,2*lambda] *//* having mean of lambda */evptr = (struct event *)malloc(sizeof(struct event));evptr->evtime = time + x;evptr->evtype = FROM_LAYER5;if (jimsrand()<0.5){evptr->eventity = A;}evptr->eventity = B;insertevent(evptr);}//向事件列表中插入一条新的事件void insertevent(struct event *p){struct event *q,*qold;if (TRACE>2){//printf(" INSERTEVENT: time is %lf\n",time);//printf(" INSERTEVENT: future time will be %lf\n",p->evtime);}q = evlist; /* q points to front of list in which p struct inserted */if (q==NULL)/* list is empty */{evlist=p;p->next=NULL;p->prev=NULL;}else{for (qold = q; q !=NULL && p->evtime > q->evtime; q=q->next) qold=q;if (q==NULL)/* end of list */{qold->next = p;p->prev = qold;p->next = NULL;}else if (q==evlist)/* front of list */p->next=evlist;p->prev=NULL;p->next->prev=p;evlist = p;}else /* middle of list */{p->next=q;p->prev=q->prev;q->prev->next=p;q->prev=p;}}}//打印事件列表void printevlist(){struct event *q;int i;printf("--------------\nEvent List Follows:\n");for(q = evlist; q!=NULL; q=q->next){printf("Event time: %f, type: %d entity: %d\n",q->evtime,q->evtype,q->eventity);}printf("--------------\n");}//启动计时器void starttimer(int AorB,float increment){struct event *q;struct event *evptr;if (TRACE>2)printf("\n----A: START TIMER: starting timer at %f\n",time);/* be nice: check to see if timer is already started, if so, then warn *//* for (q=evlist; q!=NULL && q->next!=NULL; q = q->next) */for (q=evlist; q!=NULL ; q = q->next)if ( (q->evtype==TIMER_INTERRUPT && q->eventity==AorB) ){//printf("Warning: attempt to start a timer that is already started\n");return;}/* create future event for when timer goes off */evptr = (struct event *)malloc(sizeof(struct event));evptr->evtime = time + increment;evptr->evtype = TIMER_INTERRUPT;evptr->eventity = AorB;insertevent(evptr);}//停止计时器/* called by students routine to cancel a previously-started timer */ void stoptimer(int AorB) /* A or B is trying to stop timer */{struct event *q,*qold;if (TRACE>2)printf("\n----A: STOP TIMER: stopping timer\n");/* for (q=evlist; q!=NULL && q->next!=NULL; q = q->next) */for (q=evlist; q!=NULL ; q = q->next)if ( (q->evtype==TIMER_INTERRUPT && q->eventity==AorB) )/* remove this event */{if (q->next==NULL && q->prev==NULL)evlist=NULL; /* remove first and only event on listelse if (q->next==NULL) /* end of list - there is one in front */ q->prev->next = NULL;else if (q==evlist) /* front of list - there must be event after */{q->next->prev=NULL;evlist = q->next;}else /* middle of list */{q->next->prev = q->prev;q->prev->next = q->next;}free(q);return;}//printf("Warning: unable to cancel your timer. It wasn't running.\n");}//向第三层发送信息/************************** TOLAYER3 ***************/void tolayer3(int AorB,struct pkt packet){struct pkt *mypktptr;struct event *evptr,*q;float lastime, x, jimsrand();int i;ntolayer3++;/* simulate losses: */if (jimsrand() < lossprob){nlost++;if (TRACE>0)printf(" TOLAYER3: packet being lost\n");return;}/* make a copy of the packet student just gave me since he/she may decide *//* to do something with the packet after we return back to him/her */ mypktptr = (struct pkt *)malloc(sizeof(struct pkt));mypktptr->seqnum = packet.seqnum;mypktptr->acknum = packet.acknum;mypktptr->checksum = packet.checksum;for (i=0; i<20; i++)mypktptr->payload[i] = packet.payload[i];if (TRACE>2){printf(" TOLAYER3: seq: %d, ack %d, check: %d ", mypktptr->seqnum,mypktptr->acknum, mypktptr->checksum);for (i=0; i<20; i++)printf("%c",mypktptr->payload[i]);printf("");}/* create future event for arrival of packet at the other side */evptr = (struct event *)malloc(sizeof(struct event));evptr->evtype = FROM_LAYER3; /* packet will pop out from layer3 */ evptr->eventity = (AorB) % 2; /* event occurs at other entity */evptr->pktptr = mypktptr; /* save ptr to my copy of packet *//* finally, compute the arrival time of packet at the other end. medium can not reorder, so make sure packet arrives between 1 and 10 time units after the latest arrival time of packetscurrently in the medium on their way to the destination */lastime = time;/* for (q=evlist; q!=NULL && q->next!=NULL; q = q->next) */for (q=evlist; q!=NULL ; q = q->next)if ( (q->evtype==FROM_LAYER3 && q->eventity==evptr->eventity) ) lastime = q->evtime;evptr->evtime = lastime + 1 + 9*jimsrand();/* simulate corruption: */if (jimsrand() < corruptprob){ncorrupt++;if ( (x = jimsrand()) < .75)mypktptr->payload[0]='Z'; /* corrupt payload */else if (x < .875)mypktptr->seqnum = 999999;elsemypktptr->acknum = 999999;if (TRACE>0)printf(" TOLAYER3: packet being corrupted\n");}//if (TRACE>2)//printf(" TOLAYER3: scheduling arrival on other side\n");insertevent(evptr);}//向第五层发送信息/************************** TOLAYER5 ***************/void tolayer5(int AorB,char datasent[20]){int i;if (TRACE>2){printf(" TOLAYER5: data received: ");for (i=0; i<20; i++)printf("%c",datasent[i]);printf("\n");}}三、GBN-CS.c#include "GBN.h"#include <stdio.h>#include <string.h>#include <stdlib.h>extern int TRACE ; /* for my debugging */extern int nsim ; /* number of messages from 5 to 4 so far */extern int nsimmax; /* number of msgs to generate, then stop */extern float time;extern int packet_correct;extern int packet_resent;extern struct event *evlist;int main(){struct event *eventptr;struct msg msg2give;struct pkt pkt2give;int i,j;char c;init();A_init();B_init();while (1){eventptr = evlist; /* get next event to simulate */ if (eventptr==NULL)goto terminate;evlist = evlist->next; /* remove this event from event list */if (evlist!=NULL)evlist->prev=NULL;if (TRACE >= 2){printf("\nEVENT time: %f,",eventptr->evtime);printf(" type: %d",eventptr->evtype);if (eventptr->evtype==0)printf(", timerinterrupt ");else if (eventptr->evtype==1)printf(", fromlayer5 ");elseprintf(", fromlayer3 ");printf(" entity: %d\n",eventptr->eventity);}time = eventptr->evtime; /* update time to next event time*/if (nsim==nsimmax)break; /* all done with simulation */if (eventptr->evtype == FROM_LAYER5 ){generate_next_arrival(); /* set up future arrival *//* fill in msg to give with string of same letter */j = nsim % 26;for (i=0; i<20; i++)msg2give.data[i] = 97 + j;if (TRACE>2){printf(" MAINLOOP: data given to student: ");for (i=0; i<20; i++)printf("%c", msg2give.data[i]);printf("\n");}nsim++;if (eventptr->eventity == A){A_output(msg2give);}else{B_output(msg2give);}}else if (eventptr->evtype == FROM_LAYER3){pkt2give.seqnum = eventptr->pktptr->seqnum;pkt2give.acknum = eventptr->pktptr->acknum;pkt2give.checksum = eventptr->pktptr->checksum;for (i=0; i<20; i++)pkt2give.payload[i] = eventptr->pktptr->payload[i];if (eventptr->eventity == A) /* deliver packet by calling */ A_input(pkt2give); /* appropriate entity */elseB_input(pkt2give);free(eventptr->pktptr); /* free the memory for packet */ }else if (eventptr->evtype == TIMER_INTERRUPT){if (eventptr->eventity == A)A_timerinterrupt();elseB_timerinterrupt();}else{printf("INTERNAL PANIC: unknown event type \n");}free(eventptr);}terminate:printf(" Simulator terminated at time %f\n after sending %d msgs from layer5\n",time,nsim);printf(" correctly sent pkts: %d \n", packet_correct);printf(" resent pkts: %d \n", packet_resent);system("pause");}附源代码及注释四. 实验小结通过本次试验了解了编程实现简单可靠的数据传输GBN协议,模拟了可靠数据传输理解了TCP协议可靠传输的差错检测、重传、累计确认、定时器的可靠传输策略。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验6 模块化程序设计一.实验目的:(1)熟悉子程序库的建立步骤。
(2)熟悉对库文件的修改(添加、删除)。
二.实验内容:主模块A编程:设计一个能实现加、减、乘、除计算的程序,要求该程序接受从键盘输入的两个十六进制数,调用相应的程序模块执行相应的计算后,计算结果以十六进制数输出。
模块B编程:实现两个十六进制数相加。
模块C编程:实现两个十六进制数相减。
模块D编程:实现两个十六进制数相乘。
模块E编程:实现两个十六进制数相除。
(1)将各模块分别汇编为.OBJ文件;(2)应用LIB命令建立子程序库TST.LIB,里面包含BINHEX.OBJ和HEXD.OBJ。
(3)将各模块ZHSY2_3_A.OBJ、ADDOPT.OBJ、SUBOPT.OBJ、MULOPT.OBJ、DIVOPT.OBJ、INNUM.OBJ、OUTNUM.OBJ和子程序库TST.LIB相连接为一个可执行程序ZHSY2_3_A.EXE。
(4)应用DEBUG命令调试ZHSY2_3_A.EXE,注意调试时T命令和P命令的应用。
1、编译: c:\masm .asm2、链接: c:\link .obj3、调试: c:\debug .exe4、运行: c:\ .exe(1)1、编译:子程序 C:\masm .asmc:\masm>masm 6-1Microsoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object filename [6-1.OBJ]:Source listing [NUL.LST]:Cross-reference [NUL.CRF]:50352 + 415152 Bytes symbol space free0 Warning Errors0 Severe Errorsc:\masm>masm 6-2Microsoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object filename [6-2.OBJ]:Source listing [NUL.LST]:Cross-reference [NUL.CRF]:50394 + 415110 Bytes symbol space free0 Warning Errors0 Severe Errorsc:\masm>masm 6-3Microsoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object filename [6-3.OBJ]:Source listing [NUL.LST]:Cross-reference [NUL.CRF]:50394 + 415110 Bytes symbol space free0 Warning Errors0 Severe Errorsc:\masm>masm 6-4Microsoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object filename [6-4.OBJ]:Source listing [NUL.LST]:Cross-reference [NUL.CRF]:50394 + 415110 Bytes symbol space free0 Warning Errors0 Severe Errorsc:\masm>masm 6-5Microsoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object filename [6-5.OBJ]:Source listing [NUL.LST]:Cross-reference [NUL.CRF]:50432 + 415072 Bytes symbol space free0 Warning Errors0 Severe Errorsc:\masm>masm 6-6Microsoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object filename [6-6.OBJ]:Source listing [NUL.LST]:Cross-reference [NUL.CRF]:50356 + 415148 Bytes symbol space free0 Warning Errors0 Severe Errorsc:\masm>masm 6-7Microsoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object filename [6-7.OBJ]:Source listing [NUL.LST]:Cross-reference [NUL.CRF]:50356 + 415148 Bytes symbol space free0 Warning Errors0 Severe Errorsc:\masm>masm 6-8Microsoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object filename [6-8.OBJ]:Source listing [NUL.LST]:Cross-reference [NUL.CRF]:50356 + 415148 Bytes symbol space free0 Warning Errors0 Severe Errorsc:\masm>masm 6-9Microsoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.Object filename [6-9.OBJ]:Source listing [NUL.LST]:Cross-reference [NUL.CRF]:50356 + 415148 Bytes symbol space free0 Warning Errors0 Severe Errors2、建立子程序库: c:\libc:\masm>libMicrosoft (R) Library Manager Version 3.02Copyright (C) Microsoft Corp 1983, 1984, 1985. All rights reserved.Library name: tst.libOperations: +6-4+6-5error 2000: Stack overflow出现栈溢出错误,不知如何改正。
3、链接:C:\link .objc:\masm>linkMicrosoft (R) Overlay Linker Version 3.65Copyright (C) Microsoft Corp 1983-1988. All rights reserved.Object Modules [.OBJ]: 6-1+6-2+6-3+6-6+6-7+6-8+6-9/pauseRun File [6-1.EXE]:List File [NUL.MAP]:Libraries [.LIB]:LINK : warning L4021: no stack segmentLINK : error L2029: Unresolved externals:ERROR in file(s):6-2.OBJ(6-2.ASM)BINHEX in file(s):6-3.OBJ(6-3.ASM)There were 2 errors detected链接子程序的.obj 文件时,出现无法解析的外部命令,经几番研究,还是无法找出其原因。
4、调试: c:\debug 6-1.exe1)、先用命令U反汇编整个程序,查看每条指令的物理地址C:\masm>debug 6-1.exe-u142E代码段的首地址是:1443 1443:0003 8ED8 MOV DS,AX1443:0005 B90900 MOV CX,00091443:0008 BB0000 MOV BX,00001443:000B 8BD3 MOV DX,BX1443:000D B409 MOV AH,091443:000F CD21 INT 211443:0011 83C314 ADD BX,+141443:0014 E2F5 LOOP 000B1443:0016 B401 MOV AH,011443:0018 CD21 INT 211443:001A 3C31 CMP AL,311443:001C 741D JZ 003B1443:001E 3C32 CMP AL,322)、从上一步结果中找到数据段的首地址142E,查看里面存储的数据:-d 142E:0000142E:0000 41 72 69 74 68 6D 65 74-69 63 20 50 72 6F 72 61 Arithmetic Prora 142E:0010 6D 0D 0A 24 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A m..$************ 142E:0020 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 0D 0A 24 20 20 ***********..$ 142E:0030 31 2E 20 20 41 64 64 69-74 69 6F 6E 20 20 20 20 1. Addition142E:0040 20 09 0D 0A 24 20 20 32-2E 20 20 53 75 62 74 72 ...$ 2. Subtr 142E:0050 61 74 69 6F 6E 20 20 20-20 0D 0A 24 20 20 33 2E ation ..$ 3. 142E:0060 20 20 4D 75 6C 74 69 70-6C 69 63 61 74 69 6F 6E Multiplication 142E:0070 20 09 0D 0A 24 20 20 34-2E 20 20 44 69 76 69 73 ...$ 4. Divis --d 142E:0080142E:0080 69 6F 6E 20 20 20 20 20-09 0D 0A 24 20 20 30 2E ion ...$ 0. 142E:0090 20 20 45 78 69 74 20 20-20 20 20 20 20 20 20 09 Exit . 142E:00A0 0D 0A 24 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A ..$************* 142E:00B0 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 0D 0A 24 20 20 20 **********..$ 142E:00C0 20 49 6E 70 75 74 20 79-6F 75 72 20 63 68 6F 69 Input your choi 142E:00D0 63 65 3A 20 24 0D 0A 49-6E 70 75 74 20 65 72 72 ce: $..Input err 142E:00E0 6F 72 2C 20 61 67 61 69-6E 20 65 6E 74 65 72 3A or, again enter: 142E:00F0 20 24 0D 0A 49 6E 70 75-74 20 61 20 68 65 78 20 $..Input a hex -d 142E:00f0142E:00F0 20 24 0D 0A 49 6E 70 75-74 20 61 20 68 65 78 20 $..Input a hex 142E:0100 6E 75 6D 62 65 72 3A 20-24 0D 0A 49 6E 70 75 74 number: $..Input 142E:0110 20 61 20 68 65 78 20 6E-75 6D 62 65 72 20 61 67 a hex number ag 142E:0120 61 69 6E 3A 20 24 0D 0A-54 68 65 20 6F 70 65 72 ain: $..The oper 142E:0130 61 74 69 6F 6E 20 72 65-73 75 6C 74 20 69 73 3A ation result is: 142E:0140 20 24 00 00 00 00 00 00-00 00 0D 0A 24 00 00 00 $..........$... 142E:0150 B8 2E 14 8E D8 B9 09 00-BB 00 00 8B D3 B4 09 CD ................ 142E:0160 21 83 C3 14 E2 F5 B4 01-CD 21 3C 31 74 1D 3C 32 !........!<1t.<2 3)、用T命令单步执行,看寄存器AX,DS,ES的内容的变化-t1443:0003 8ED8 MOV DS,AX-tAX=142E BX=0000 CX=02AD DX=0000 SP=0000 BP=0000 SI=0000 DI=00001443:0005 B90900 MOV CX,0009-tAX=142E BX=0000 CX=0009 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=142E ES=141E SS=142E CS=1443 IP=0008 NV UP EI PL NZ NA PO NC 1443:0008 BB0000 MOV BX,0000-tAX=142E BX=0000 CX=0009 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=142E ES=141E SS=142E CS=1443 IP=000B NV UP EI PL NZ NA PO NC 1443:000B 8BD3 MOV DX,BX-tAX=142E BX=0000 CX=0009 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=142E ES=141E SS=142E CS=1443 IP=000D NV UP EI PL NZ NA PO NC 1443:000D B409 MOV AH,09-tDS=142E ES=141E SS=142E CS=1443 IP=000F NV UP EI PL NZ NA PO NC 1443:000F CD21 INT 21-tAX=092E BX=0000 CX=0009 DX=0000 SP=FFFA BP=0000 SI=0000 DI=0000 DS=142E ES=141E SS=142E CS=00A7 IP=107C NV UP DI PL NZ NA PO NC 00A7:107C 90 NOP4)然后直接G命令运行完毕-gArithmetic Proram**************************1. Addition2. Subtration3. Multiplication4. Division0. Exit***********************Input your choice:1 ;验证加法Input a hex number: 2Input a hex number again:2The operation result is:4Arithmetic Proram**************************1. Addition2. Subtration3. Multiplication4. Division0. Exit***********************Input your choice:2 ;验证减法Input a hex number: 4Input a hex number again:2The operation result is:2Arithmetic Proram**************************1. Addition2. Subtration3. Multiplication4. Division0. Exit***********************Input your choice:3 ;验证乘法Input a hex number: 2Input a hex number again:2The operation result is:4Arithmetic Proram**************************1. Addition2. Subtration3. Multiplication4. Division0. Exit***********************Input your choice:4 ;验证除法Input a hex number: 6Input a hex number again:2The operation result is:3Arithmetic Proram**************************1. Addition2. Subtration3. Multiplication4. Division0. Exit***********************Input your choice:0 ;退出系统Program terminated normally三.实验代码:1)模块6-1程序(主程序); 程序名:6-1.ASM; 功能:显示菜单,接受从键盘输入的两个十六进制数,; 调用相应的程序模块执行相应的计算,计算结果以十六进制数输出。