手机怎么防止网站跳转微信小程序公司

当前位置: 首页 > news >正文

手机怎么防止网站跳转,微信小程序公司,如何设置目录在wordpress,企业如何网站建设实验目标 a) 了解WinMIPS64的基本功能和作用#xff1b; b) 熟悉MIPS指令、初步建立指令流水执行的感性认识#xff1b; c) 掌握该工具的基本命令和操作#xff0c;为流水线实验作准备。 实验内容 按照下面的实验步骤及说明#xff0c;完成相关操作记录实验过程的截图 b) 熟悉MIPS指令、初步建立指令流水执行的感性认识 c) 掌握该工具的基本命令和操作为流水线实验作准备。 实验内容 按照下面的实验步骤及说明完成相关操作记录实验过程的截图 1下载WinMIPS64运行样例代码并观察软件各个观察窗口的内容和作用掌握软件的使用方法。80分 2学会正确使用WinMIPS64的IO方法10分 3编写完整的排序程序10分 实验环境 硬件桌面PC 软件WindowsWinMIPS64仿真器 实验步骤及说明 WinMIPS64是一款指令集模拟器它是基于WinDLX设计的如果你对于WinDLX这款软件十分熟悉的话那么对于WinMIPS64也会十分的容易上手。DLX 处理器 (发音为 “DeLuXe”)是Hennessy 和Patterson合著一书《Computer Architecture - A Quantitative Approach》中流水线处理器的例子。WinDLX是一个基于Windows的模拟器。 本教程通过一个实例介绍WinMIPS64的使用方法。WinMIPS64模拟器能够演示MIPS64流水线是如何工作的。 本教程使用的例子非常简单它并没有囊括WinMIPS64的各个方面仅仅作为使用WinMIPS64的入门级介绍。如果你想自己了解更多的资料在给出的winmips64.zip中有WinMIPS64 — Documentation Summary.html和winmipstut.docx两个文件可以供你随时参考其中涵盖了WinMIPS64的指令集和模拟器的组成与使用方法。 虽然我们将详细讨论例子中的各个阶段但你应具备基本的使用Windows的知识。现假定你知道如何启动 Windows使用滚动条滚动双击执行以及激活窗口。 一、安 装 在Windows下安装WinMIPS64  解压给出的winmips64.zip压缩文件到我的电脑上D盘的D:\software\winmips64  二、一个完整的例子 1.开始和配置WinMIPS64 在winmips64这个子目录下双击winmips64.exe文件即打开了WinMIPS64模拟器其外观如下图 为了初始化模拟器, 点击File 菜单中的 Reset allCtrlR 菜单项即可。 WinMIPS64可以在多种配置下工作。你可以改变流水线的结构和时间要求、存储器大小和其他几个控制模拟的参数。点击 Configuration / Floating Point Stages点击Configuration打开菜单然后点击Architecture菜单项选择如下标准配置 如果需要可以通过点击相应区域来改变设置。然后点击OK 返回主窗口。 在 Configuration 菜单中的其他四个配置也可以设置它们是Multi-Step, Enable Forwarding, Enable Branch Target Buffer 和 Enable Delay Slot。 点击相应菜单项后 在它的旁边将显示一个小钩。如下图所示(下图仅做功能示范实验时并没有勾选“Enable Forwarding”): 本次实验要求不要勾选“Enable Forwarding”。 2. 装载测试程序 用标准的text编辑器来新建一个名为sum.s的文件这个文件的功能是计算两个整数A、B之和然后将结果传给C。程序如下 .data A: .word 10 B: .word 8 C: .word 0.text main: ld r4,A(r0) ld r5,B(r0) dadd r3,r4,r5 sd r3,C(r0) halt 在将该程序装载进WinMIPS64之前我们必须用asm.exe来检验该输入程序的语法正确性。asm.exe程序文件在所给的winmips压缩包里有用命令行使用它。具体操作为打开终端利用cd命令进到D:\software\WinMIPS64目录中然后直接使用asm.exe sum.s命令检查输出结果是否无误。输出结果如下可知代码无误。 在开始模拟之前至少应装入一个程序到主存。为此选择File / OPEN窗口中会列出当前目录中所有汇编程序包括sum.s。 按如下步骤操作可将这个文件装入主存。 点击 sum.s点击 open 按钮 现在文件就已被装入到存储器中了现在可以开始模拟工作了。 你可以在CODE窗口观察代码内容可以在DATA窗口观察程序数据了。 CODE窗口如下: DATA窗口如下: 3.模 拟 在主窗口中我们可以看见七个子窗口和一条在底部的状态栏。这七个子窗口分别是Pipeline, Code, Data, Registers, Statistics, Cycles和Terminal。在模拟过程中将介绍每一个窗口的特性和用法。 (1) Pipeline 窗口 在Pipeline窗口中展示了MIPS64处理器的内部结构其中包括了MIPS64的五级流水线和浮点操作加法/减法乘法和除法的单元。展示了处于不同流水段的指令。 (2) Code 窗口 我们来看一下 Code 窗口。你将看到代表存储器内容的三栏信息从左到右依次为地址 (符号或数字)、命令的十六进制机器代码和汇编命令。 我们可以看到初始时第一行为黄色表示该行指令处于“取指”阶段。 现在点击主窗口中的 Execution开始模拟。在出现的下拉式菜单中点击Single Cycle或按 F7键。 这时第一行变成了了蓝色第二行变成了黄色这表示第一行指令处于“译码”阶段而第二行指令处于“取指”阶段。这些不同的颜色代表指令分别处于不同的流水线阶段。黄色代表“取指”蓝色代表“译码”红色代表“执行”绿色代表“内存数据读或写”紫色代表“写回”。 接着按F7直到第五个时钟周期的时候有趣的事情发生了“dadd r3r4r5”指令没有从“译码”跳到其下一个流水阶段“执行”并且“sd r3C(r0)”指令仍然停留在“取指”阶段同时在terminal窗口显示一行信息“RAW Stall in ID (RS)”思考一下这是为什么 (3) Cycls窗口 我们将注意力放到Cycls窗口上。它显示流水线的时空图。 在窗口中你将看到模拟正在第五时钟周期第一条指令正在WB段第二条命令在MeM段第四条命令在处于暂停状态installed第五条指令也因此停滞不前。这是因为发生了数据相关第四条指令的dadd命令需要用到寄存器r5的值但是r5的值并不可用。 接着点击F7到第五个时钟周期时再次发生相关造成停滞。接着点击F7直至第十三个时钟周期全部指令执行结束。 值得一提的是Cycls窗口是分为两个子窗口的左边的子窗口是一系列的指令右边的窗口是图示的指令执行过程。其中左边子窗口的命令是动态出现的当一条指令在进行“取指”时该指令才出现而且当出现了数据相关的时候所涉及到的指令会变色暂停的指令会变成蓝色而被其影响的后续指令会变成灰色。 (4) Data 窗口 在Data中我们可以观察到内存中的数据包括数据内容和地址两个方面其中地址使用64位表示。 如果想改变一个整型的数据的值左键双击该值所在的行如果是想改变一个浮点类型的数据的值那么请右键双击该值所在的行。 上图即为第十三个时钟周期的data窗口的图示其中左边一行即为用64位表示的内存地址中间行为数据的内容右边的一行为相关的代码。可以看出在这个时钟周期A与B的值分别为0xa和0x8C的值为0x12表明A与B的值之和已经相加并保存到了C中。 (5) Registers 窗口 这个窗口显示存储在寄存器中的值。 如果该寄存器为灰色那么它正处于被一条指令写入的过程如果它用一种颜色表示那么就代表该颜色所代表的的流水线阶段的值可以用来进行前递forwarding。同时这个窗口允许你交互式的该变寄存器的值但是前提是该寄存器不能处于被写入或者前递的阶段。如果想改变一个整型的数据的值左键双击该值所在的行如果是想改变一个浮点类型的数据的值那么请右键双击该值所在的行然后按OK来进行确定。 上图即为第十三个时钟周期的Registers窗口的图示很显然其中可以很清楚的看出每个寄存器的值是什么。 (6) Statistics 窗口 最后我们来看一下Statistics 窗口。 这个窗口是用来记录一些模拟周期的统计数据。其中包括ExecutionStalls和Code Size三个大项。其中Execution用来显示模拟周期中指令数执行周期数和CPI没条指令所用周期数Stalls用来表示暂停的周期数并且分门别类的进行了统计其中包括RAW StallsWAW StallsWAR Stalls, Structural Stalls, Branch Taken Stalls和Branch misprediction Stalls。Code Size表示了代码的大小用byte表示。 上图即为Statistics窗口的图示其中表示了该程序有13个时钟周期5条指令CPI 为2.600有4个RAW Stalls代码大小为20个Bytes。 三、更多操作 首先点击File/Reset MIPS64ctrl R进行重置。如果你点击File/Full Reset你将删除内存中的数据这样你就不得不重新装载文件所以点击File/ReloadF10是一个很方便的重置的方法。 你可以一次推进多个时钟周期方法是点击Execute/Multi cycleF8而多个时钟周期数是在Configure/Multi-step中设置的。 你也可以通过按F4一次完成整个程序的模拟。同时你可以设置断点方法是在Code窗口中左键双击想要设置断点的指令该指令会变成蓝色然后点击F4程序就会停在这条指令执行“ 取指”的阶段如果想要清除断点再次左键双击改行指令。 四、终端I/O的简单实例 通过上面对WinMIPS64的了解我们可以开始简单的使用该工具了。 这里需要我们编写一个简单的终端输出“Hello World”的小程序运行并且截图。所以我们需要了解如何将数据在终端中输出输入。 下图是I/O区域的内存映射一个是控制字一个是数据字 所以我们需要先将CONTROL和DATA地址读取到寄存器然后分别在这两个区域内存储相应的序列号如上图所示和要显示在Terminal窗口的数据同时设置CONTROL为9我们能对其进行读取数据。 请编写完整程序输出“Hello World!”字符串。helloworld.s文件如下: 然后通过asm.exe来检验该程序的语法正确性 然后在WinMIPS64中的File栏中open打开文件。最后一步步按F7同时观察各个窗口。最终还要截取Terminal窗口图如下 证明你的程序结果输出了“Hello World”。 五、编写排序算法 在这一部分我们要求编写一个排序算法对一组int型数据进行排序。该算法使用冒泡排序法并且在其中嵌入一个swap函数过程该算法在课本上有完整的程序但是其中的数据初始化、寄存器映射、命令的映射以及I/O部分还需要自己手动编写。编写完成后在asm.exe中进行检测然后运行。 初始数据要求为“array: .word 8,6,3,7,1,0,9,4,5,2” 该程序需要对0到10十个数进行了排序其中使用了sort和swap两个函数过程并且swap是嵌套在sort中的在编写程序的时候一定要注意使用栈来保留寄存器的值嵌套时还额外需要保存\(ra的值。代码如下: 首先是数据字段和主函数主函数里头打印排序前的数组然后调用冒泡排序然后打印排序后的数组。 以下代码为冒泡函数用于排序一个数组参数为数组和数组长度。 以下是swap函数用于交换两个数。 然后通过asm.exe来检验该程序的语法正确性: 六、结束语 本实验通过一个例子介绍了WinMIPS64的重要特性使你对流水线和MIPS64的操作类型有了一定的了解。当然你还必须学习更多的知识才能更深入地了解WinMIPS64。请参阅在winmips.zip压缩文件中的相关资料。 实验总结与体会 通过本次实验我学会了WinMIPS64的基本操作例如如何载入程序、运行程序等。通过本次实验我还对流水线有了基本的认识每个指令就像传送带的货物一样五个节拍就像是处理货物的机器一般每个货物在传送带一直往前指令不断地进行每个节拍如果有一个节拍暂时无法进行那么将会等待直到可以执行为止此时后面的指令都会被阻塞。通过本次实验我也认识到了流水线的优点: ①允许同时执行多条指令的不同阶段从而提高了处理器的吞吐量和效率 ②多条指令可以同时处于不同阶段整体的指令执行时间会缩短。通过编写冒泡排序程序我有效地应用了所学到的MIPS指令集知识巩固了我的编程能力。 实验代码 .data arr: .word 61, 11, 65, 47, 9, 74, 79, 70, 91, 91, 97, 10, 65, 10, 3, 6, 20, 75, 29, 12, 95, 71, 85, 24, 42, 59, 55, 50, 23, 81, 64, 14, 9, 56, 15, 78, 96, 35, 57, 6 before: .asciiz before sort the array is:\n after: .asciiz after sort the array is:\n CONTROL: .word 0x10000 DATA: .word 0x10008 SP: .word 0x300 # 堆栈指针.text main:ld r16, CONTROL(r0) ld r17, DATA(r0) # 打印提示信息 Before sort the array is:\ndaddi r8, r0, 4 daddi r9, r0, before sd r9, (r17) sd r8, (r16) # 打印数组daddi r8, r0, 2 daddi r2, r0, 40 daddi r1, r0, 0 print1:# 打印 arr[i]dsll r3, r1, 3 ld r9, arr(r3) sd r9, (r17) sd r8, (r16) daddi r1, r1, 1 # ibne r1, r2, print1 # 循环未结束继续打印# 调用冒泡排序ld r29, SP(r0) # r29 - M[SP], 用于维护堆栈指针daddi r4, r0, arr # 参数1: a[]daddi r5, r0, 40 # 参数2: njal bubbleSort # 跳转到bubbleSort函数# 打印提示信息 After sort the array is:\ndaddi r8, r0, 4 daddi r9, r0, after sd r9, (r17) sd r8, (r16) # 打印数组daddi r8, r0, 2 daddi r2, r0, 40 daddi r1, r0, 0 print2:# 打印 arr[i]dsll r3, r1, 3 ld r9, arr(r3) sd r9, (r17) sd r8, (r16)daddi r1, r1, 1 # ibne r1, r2, print2 # 循环未结束继续打印halt# 冒泡排序 bubbleSort:# 分配栈帧保存返回地址和寄存器数据daddi r29, r29, -24 sd \)ra, 16(r29) sd r16, 8(r29) sd r17, 0(r29) dadd r22, r4, r0 # r22 a[]daddi r23, r5, 0 # r23 ndaddi r18, r0, 0 # r18 i 0 loop1:# for (int i 0; i n - 1; i)daddi r10, r23, -1 # r10 n - 1slt r11, r18, r10 # 当r18 r10,r11 1beq r11, r0, end1 # 如果i n - 1,跳转到 end1daddi r19, r0, 0 # r19 j 0daddi r20, r23, -1 # r20 n - 1dsub r20, r20, r18 # r20 n - 1 - i loop2:# for (int j 0; j n - 1 - i; j)slt r11, r19, r20 # 当r19 r20,r11 1 beq r11, r0, end2 # 如果j n - 1 - i,跳转到 end2dsll r12, r19, 3 # r12 j * 8dadd r13, r22, r12 # r13 a j * 8ld r14, 0(r13) # r14 M[r13] a[j]ld r15, 8(r13) # r15 M[r13 8] a[j 1]# if (a[j] a[j 1]) swap(a[j], a[j 1]);slt r11, r15, r14 # 当r15 r14,r11 1beq r11, r0, no_swap # 如果不交换,跳转到 no_swap# 交换 a[j] 和 a[j 1]dadd r4, r0, r13 # 参数1: a j * 8 a[j]daddi r5, r13, 8 # 参数2: a (j 1) * 8 a[j 1]jal swap no_swap:daddi r19, r19, 1 # j j loop2 # 循环到 loop2end2:daddi r18, r18, 1 # ij loop1 # 循环到 loop1end1:# 恢复寄存器数据和堆栈帧ld r17, 0(r29) ld r16, 8(r29)ld \(ra, 16(r29) daddi r29, r29, 24 jr \)ra swap: # 交换 a[i] 和 a[j]ld r9, 0(r4) # r9 a[i]ld r10, 0(r5) # r10 a[j]sd r10, 0(r4) # a[i] r10sd r9, 0(r5) # a[j] r9jr $ra # 返回到M[PC]