实验一:MIPS指令集实验

实验一:MIPS指令集实验
实验一:MIPS指令集实验

深圳大学实验报告

课程名称:计算机系统(3)

实验项目名称:MIPS指令集实验

学院:计算机与软件学院

专业:计算机与软件学院所有专业

指导教师:*****

报告人:******* 学号:********** 班级:******* 实验时间:2017年10月16日星期一

实验报告提交时间:2017年10月19日星期四

教务处制

一、实验目标:

了解WinMIPS64的基本功能和作用;

熟悉MIPS指令、初步建立指令流水执行的感性认识;

掌握该工具的基本命令和操作,为流水线实验作准备。

二、实验内容

按照下面的实验步骤及说明,完成相关操作记录实验过程的截图:

1)下载WinMIPS64;运行样例代码并观察软件各个观察窗口的内容和作用,掌握软件的使用方法。(80分)

2)学会正确使用WinMIPS64的IO方法;(10分)

3)编写完整的排序程序;(10分)

三、实验环境

硬件:桌面PC

软件:Windows,WinMIPS64仿真器

四、实验步骤及说明

WinMIPS64是一款指令集模拟器,它是基于WinDLX设计的,如果你对于WinDLX这款软件十分熟悉的话,那么对于WinMIPS64也会十分的容易上手。DLX 处理器(发音为"DeLuXe")是Hennessy 和Patterson合著一书《Computer Architecture - A Quantitative Approach》中流水线处理器的例子。WinDLX是一个基于Windows的模拟器。

本教程通过一个实例介绍WinMIPS64的使用方法。WinMIPS64模拟器能够演示MIPS64流水线是如何工作的。

本教程使用的例子非常简单,它并没有囊括WinMIPS64的各个方面,仅仅作为使用WinMIPS64的入门级介绍。如果你想自己了解更多的资料,在给出的winmips64.zip中,有WinMIP S64?—?Documentation Summary.html和winmipstut.docx两个文件可以供你随时参考,其中涵盖了WinMIPS64的指令集和模拟器的组成与使用方法。

虽然我们将详细讨论例子中的各个阶段,但你应具备基本的使用Windows的知识。现假定你知道如何启动Windows,使用滚动条滚动,双击执行以及激活窗口。

(一)、安装

请按以下步骤在Windows下安装WinMIPS64?:

1.为WinMIPS64?创建目录,例如D:\ WinMIPS64?

2.解压给出的winmips64.zip压缩文件到创建的目录中。

(二)、一个完整的例子

1.开始和配置WinMIPS64

在winmips64这个子目录下,双击winmips64.exe文件,即打开了WinMIPS64模拟器,其外观如下图:

为了初始化模拟器, 点击File菜单中的Reset all(Ctrl+R)菜单项即可。

WinMIPS64可以在多种配置下工作。你可以改变流水线的结构和时间要求、存储器大小和其他几个控制模拟的参数。点击Configuration/Floating Point Stages(点击Configuration 打开菜单,然后点击Architecture菜单项),选择如下标准配置:

如果需要,可以通过点击相应区域来改变设置。然后,点击OK返回主窗口。

在Configuration菜单中的其他四个配置也可以设置,它们是:Multi-Step, Enable Forwarding, Enable Branch Target Buffer 和Enable Delay Slot。点击相应菜单项后,在它的旁边将显示一个小钩。本次实验要求不要勾选“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:\ WinMIPS64目录中,然后直接使用asm.exe sum.s命令,检查输出结果是否无误。

在开始模拟之前,至少应装入一个程序到主存。为此,选择File / OPEN,窗口中会列出当前目录中所有汇编程序,包括sum.s。

按如下步骤操作,可将这个文件装入主存。

?点击sum.s

?点击open 按钮

现在,文件就已被装入到存储器中了,现在可以开始模拟工作了。

你可以在CODE窗口观察代码内容,可以在DATE窗口观察程序数据了。

3. 模拟

在主窗口中,我们可以看见七个子窗口,和一条在底部的状态栏。这七个子窗口分别是Pipeline, Code, Data, Registers, Statistics, Cycles和Terminal。在模拟过程中将介绍每一个窗口的特性和用法。

(1) Pipeline窗口

在Pipeline窗口中,展示了MIPS64处理器的内部结构,其中包括了MIPS64的五级流水线和浮点操作(加法/减法,乘法和除法)的单元。展示了处于不同流水段的指令。

(2) Code窗口

我们来看一下Code窗口。你将看到代表存储器内容的三栏信息,从左到右依次为:地址(符号或数字)、命令的十六进制机器代码和汇编命令。

我们可以看到,初始时,第一行为黄色,表示该行指令处于“取指”阶段。

现在,点击主窗口中的Execution开始模拟。在出现的下拉式菜单中,点击Single Cycle 或按F7键。

这时,第一行变成了了蓝色,第二行变成了黄色,这表示第一行指令处于“译码”阶段,而第二行指令处于“取指”阶段。这些不同的颜色代表指令分别处于不同的流水线阶段。黄色代表“取指”,蓝色代表“译码”,红色代表“执行”,绿色代表“内存数据读或写”,紫色代表“写回”。

接着按F7,直到第五个时钟周期的时候,有趣的事情发生了,“dadd r3,r4,r5”指令没有从“译码”跳到其下一个流水阶段“执行”,并且“sd r3,C(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和0x8,C的值为0x12,表明A与B的值之和已经相加并保存到了C中。

(5) Registers窗口

这个窗口显示存储在寄存器中的值。

如果该寄存器为灰色,那么它正处于被一条指令写入的过程,如果它用一种颜色表示,那么就代表,该颜色所代表的的流水线阶段的值可以用来进行前递(forwarding)。同时,这个窗口允许你交互式的该变寄存器的值,但是前提是该寄存器不能处于被写入或者前递的阶段。如果想改变一个整型的数据的值,左键双击该值所在的行,如果是想改变一个浮点类型的数据的值,那么请右键双击该值所在的行,然后按OK来进行确定。

上图即为第十三个时钟周期的Registers窗口的图示,很显然,其中可以很清楚的看出每个寄存器的值是什么。

(6)Statistics窗口

最后我们来看一下Statistics窗口。

这个窗口是用来记录一些模拟周期的统计数据。其中包括Execution,Stalls,和Code Size 三个大项。其中,Execution用来显示模拟周期中指令数,执行周期数和CPI(没条指令所用周期数),Stalls用来表示暂停的周期数,并且分门别类的进行了统计,其中包括RAW Stalls,WAW Stalls,WAR 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 MIPS64(ctrl + R)进行重置。如果你点击File/Full Reset,你将删除内存中的数据,这样你就不得不重新装载文件,所以点击File/Reload(F10)是一个很方便的重置的方法。

你可以一次推进多个时钟周期,方法是点击Execute/Multi cycle(F8),而多个时钟周期数是在Configure/Multi-step中设置的。

你也可以通过按F4一次完成整个程序的模拟。同时,你可以设置断点,方法是,在Code 窗口中左键双击想要设置断点的指令,该指令会变成蓝色,然后点击F4,程序就会停在这条指令执行“ 取指”的阶段,如果想要清除断点,再次左键双击改行指令。

(四)、终端I/O的简单实例

通过上面对WinMIPS64的了解,我们可以开始简单的使用该工具了。

这里,需要我们编写一个简单的终端输出“Hello World!!”的小程序,运行并且截图。所以,我们需要了解如何将数据在终端中输出输入。

下图是I/O区域的内存映射,一个是控制字,一个是数据字:

所以我们需要先将CONTROL和DATA地址读取到寄存器,然后分别在这两个区域内存储相应的序列号(如上图所示)和要显示在Terminal窗口的数据,同时,设置CONTROL 为9,我们能对其进行读取数据。

请编写完整程序,输出“Hello World!”字符串。然后通过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的值。在WinMIPS64运行上述程序,将得到如下结果(这里只给出Terminal窗口的截图即可):

观察实验截图,证明你的程序确实做到了对数组排序的效果。

注意:需要将SP初始化为内存最高地址,否则为初始化SP为0,SP-1将指向FFFFFFFF,该地址将超出winmips默认的内存空间。

五、实验结果截图

(一)安装WinMIPS64?:

将安装包解压到D:\

(二)一个完整的例子

1.开始和配置WINMIPS64

本实验要求不勾选“Enable Forwarding”。如下所示:

2. 装载测试程序

用标准的text编辑器来新建一个名为sum.s的文件,这个文件的功能是,计算两个整数A、B之和,然后将结果传给C。

用asm.exe来检验该输入程序的语法正确性。

具体操作:打开终端,利用cd命令进到D:\ WinMIPS64目录中,然后直接使用asm.exe sum.s 命令,检查输出结果是否无误。

装入一个程序到主存。选择File / OPEN,窗口中会列出当前目录中所有汇编程序,包括sum.s。

在CODE窗口观察代码内容,可以在DATA窗口观察程序数据。

3.模拟

点击主窗口中的 Execution开始模拟。在出现的下拉式菜单中,点击Single Cycle或按 F7键。

这时,第一行变成了蓝色,第二行变成了黄色,这表示第一行指令处于“译码”阶段,而第二行指令处于“取指”阶段。

第五个时钟周期的时候,“dadd r3,r4,r5”指令没有从“译码”跳到其下一个流水阶段“执行”,并且“sd r3,C(r0)”指令,仍然停留在“取指”阶段,同时在terminal窗口显示一行信息“RAW Stall in ID (RS)”。

在Cycls窗口中,可以看到模拟正在第五时钟周期,第一条指令正在WB段,第二条命令在MeM段,第四条命令在处于暂停状态(installed),第五条指令也因此停滞不前。这是因为发生了数据相关(第四条指令的dadd命令需要用到寄存器r5的值,但是r5的值并不可用)。

在Data窗口中,可以观察到内存中的数据,包括数据内容和地址两个方面,其中地址使用64位表示。

如果想改变一个整型的数据的值,左键双击该值所在的行,如果是想改变一个浮点类型的数据的值,那么请右键双击该值所在的行。

在Registers 窗口,显示存储在寄存器中的值。

如果该寄存器为灰色,那么它正处于被一条指令写入的过程,如果它用一种颜色表示,那么就代表,该颜色所代表的的流水线阶段的值可以用来进行前递(forwarding)。

如果想改变一个整型的数据的值,左键双击该值所在的行,如果是想改变一个浮点类型的数据的值,那么请右键双击该值所在的行,然后按OK来进行确定。

Statistics 窗口,是用来记录一些模拟周期的统计数据。其中包括Execution,Stalls,和Code Size三个大项。其中,Execution用来显示模拟周期中指令数,执行周期数和CPI (没条指令所用周期数),Stalls用来表示暂停的周期数,并且分门别类的进行了统计,其中包括RAW Stalls,WAW Stalls,WAR Stalls, Structural Stalls, Branch Taken Stalls 和Branch misprediction Stalls。Code Size表示了代码的大小,用byte表示。

上图即为Statistics窗口的图示,其中表示了该程序有5个时钟周期,1条指令,CPI

为5.000,有2个RAW Stalls,代码大小为20个Bytes。

(三)更多操作

首先,点击File/Reset MIPS64(ctrl + R)进行重置。

点击Execute/Multi cycle(F8),可一次推进多个时钟周期。

(四)终端I/O的简单实例

请编写完整程序,输出“Hello World!”字符串。

程序如下所示:

通过asm.exe来检验该程序的语法正确性。从cmd窗口中,可以看到程序语法正确。

在WinMIPS64中的File栏中open打开文件。最后一步步按F7,同时观察各个窗口。在第11个时钟周期,程序在Terminal窗口输出了“Hello World”。如下图所示:

代码如下:

.data

after: .asciiz "After sort the array is:\n"

before: .asciiz "Before sort the array is:\n"

CONTROL: .word 0x10000

DATA: .word 0x10008

SP: .word 0x7ffffffc

flag: .word 0

array: .word 8,6,3,7,1,0,9,4,5,2

.text

main:

swap:

dsll r8,r5,3 #r8=k*8

dadd r8,r4,r8 #r8=a+(k*8)

ld r9,0(r8) #r9=a[k]

ld r10,8(r8) #r10=a[k+1]

sd r10,0(r8) #a[k]=r10

sd r9,8(r8) #a[k+1]=r9

jr $ra

在cmd窗口中测试程序的正确性。结果,显示0 errors,说明程序正确。如下图所示:

在MIPS中运行,结果如下所示:Terminal中数组元素已经正确排序。

六、实验总结与体会

本实验通过一个例子介绍了WinMIPS64的重要特性,使我对流水线和MIPS64的操作类型有了一定的了解。当然,我还必须学习更多的知识,才能更深入地了解WinMIPS64。

实验五 ARM 指令系统实验二

实验五ARM指令系统实验二 注意:本实验在模拟环境下进行,请不要打开实验箱电源!! 一、实验目的: 1、掌握MDK开发环境下多文件编程的方法; 二、实验原理 我们编程时会以工程为单位来解决一个问题,为了解决问题的复杂性和人脑的局限性之间的矛盾,编程人员常常把把一个大问题分解成若干过小问题,每个小问题的解决方法在一个文件中实现,把每个文件解决问题的方法综合起来就够成了解决了大问题的方法。 这些文件之间是存在一定关系的,如果一个文件与其他文件不发生任何关系,那么就没有在工程中存在的必要了!从ARM汇编程序员的角度理解这种关系为: 一个文件有标号被其他文件引用,另一个文件应用了其他文件的标号;这用引用与被应用的关系分别通过import和export实现。 例如: 三、实验任务 下面文件中的定义的数据为某科目学生成绩,试编程找出最高分数的放在maxscore,score.s的内容如下: ;score.s area score,data,readwrite

scores dcb65,78,92,47,77,83,59,93,82,97;学生成绩numofstudent dcb10;学生人数 maxscore dcb0;存放最高分数 end 四、实验步骤 ;A.s …… export label label ……;B.s……import label bl label…… 说明标号label可以被其他文件引定义了标号label说明标号label可以被其他文件引引用了标号label 1、用自然语言描述解决给问题的算法,可以尽可能的抽象! 2、建立工程并建立源文件score.s并把输入(复制)上面内容,并将该文件添加到工 程; 3、建立文件maxoftwo.s,在文件中实现子程序getmax,调用者传入的参数位于 r0、r1中,要求找出r0、r1中的较大值,并把较大值保存在r0

MIPS32指令集

MIPS32指令集 MIPS指令可以分成以下各类: 空操作no-op; 寄存器/寄存器传输:用得很广,包括条件传输在内; 常数加载:作为数值和地址的整型立即数; 算术/逻辑指令; 整数乘法、除法和求余数; 整数乘加; 加载和存储; 跳转、子程序调用和分支; 断点和自陷; CP0功能:CPU控制指令 浮点; 用户态的受限访问:rdhwr和synci 注:64位版本开头以“d”表示,无符号数以“u”结尾,立即数通常以“i”结尾,字节操作以“b”结尾,双字操作以“d”结尾,字操作以“w”结尾 1、空操作:nop:相当于sll zero,zero,o, ssnop: equals sll zero,zero,1. 这个指令不得与其它指令同时发送,这样就保证了其运行要花费至少一个时钟周期。这在简单的流水线的CPU上无关紧要,但在复杂些的实现上对于实现强制的延时很有用。 2、寄存器/寄存器传送: move: 通常用跟$zero寄存器的or来实现,或者用addu。 movf, movt, movn, movz: 条件传送。 3、常数加载: dla、la: 用来加载程序中某些带标号的位置或者变量的地址的宏指令; dli、li: 装入立即数常数,这是一个宏指令; lui: 把立即数加载到寄存器高位。 4、算术/逻辑运算: add、addi、dadd、daddi、addu、addiu、daddu、daddiu、dsub、sub、subu:加法指令和减法指令; abs,dabs:绝对值; dneg、neg、negu:取相反数; and、andi、or、ori、xor、nor:逐位逻辑操作指令; drol、rol、ror:循环移位指令; sll、srl、sra:移位。 5、条件设置指令: slt、slti、sltiu、sltu、seq、sge、sle、sne:条件设置。 6、整数乘法、除法和求余数:

实验二_指令系统相关程序的编写与调试实验

重庆大学 学生实验报告 实验课程名称汇编语言程序设计 开课实验室DS1502 学院软件学院年级16专业班软件工程5班 学生姓名吉沼橙学号20161717 开课时间2017至2018学年第 1 学期 软件工程学院制

《汇编语言程序设计》实验报告

Add sp,4 Pop ax Pop bx Push ax Push bx Pop ax Pop bx Mov ah,4ch Int 21h Code ends End start 先转换成asm格式 然后转换成obj格式

然后转换成exe格式 (2)用debug跟踪lab2.exe 的执行过程,写出每一步执行后,相关寄存器中的内容和栈顶的内容。开始每一步的执行: 1:AX=2000 2:SS=2000 3:SP=0004 4: AX=0000 SP=0006 5: BX=0000 SP=0008 6.7:AX与BX入栈SP由0008到0004 8:AX与BX出栈SP由0004到0008

(5)习题:3.37 -教材114页。 MOV AL, STATUS AND AL, 00010101B ;只保留第1、3、5位 CMP AL, 00010101B JZ ROUTINE_1 ;3位全为1转ROUTINE_1 JZ ROUTINE_2 ;两位为1转ROUTINE_2 JZ ROUTINE_3 ;1位为1转ROUTINE_3 JZ ROUTINE_4 ;3位全为0转ROUTINE_4 ROUTINE_3: JMP EXIT ROUTINE_1: JMP EXIT ROUTINE_2: JMP EXIT ROUTINE_4: EXIT: INT 21H

STM 常用汇编指令

在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初始化,进出中断时的环境保护,恢复等对性能有要求的地方。 ARM指令集可以分为六大类,分别为数据处理指令、Load/Store指令、跳转指令、程序状态寄存器处理指令、协处理器指令和异常产生指令。 ARM指令使用的基本格式如下: 〈opcode〉{〈cond〉}{S}〈Rd〉,〈Rn〉{,〈operand2〉} opcode操作码;指令助记符,如LDR、STR等。 cond可选的条件码;执行条件,如EQ、NE等。 S可选后缀;若指定“S”,则根据指令执行结果更新CPSR中的条件码。 Rd目标寄存器。 Rn存放第1操作数的寄存器。 operand2第2个操作数 arm的寻址方式如下: 立即寻址 寄存器寻址 寄存器间接寻址 基址加偏址寻址 堆栈寻址 块拷贝寻址 相对寻址 这里不作详细描述,可以查阅相关文档。 数据处理指令 Load/Store指令 程序状态寄存器与通用寄存器之间的传送指令 转移指令 异常中断指令 协处理器指令 在S3C2410、S3C2440的数据手册中对各种汇编指令有详细的描述;这里只对较常见的作写介绍。 1、相对跳转指令:b、bl 这两条指令的不同之处在于bl指令除了跳转之外,还将返回地址(bl的下一条指令的地址)保存在lr寄存器中。 这两条指令的可跳转范围是当前指令前后32M。 b funa .... funa: b funb ....

funb: .... 2、数据传送指令mov,地址读取伪指令ldr mov指令可以把一个寄存器的值赋给另外一个寄存器,或者把一个常数赋给寄存器。 mov r1,r2 mov r1,#1024 mov传送的常数必须能用立即数来表示。当不能用立即数表示时,可以用ldr命令来赋值。ldr是伪命令,不是真实存在的指令,编译器会把它扩展成真正的指令;如果该常数能用“立即数”来表示,则使用mov指令,否则编译时将该常数保存在某个位置,使用内存读取指令把它读出来。 ldr r1,=1024 3、内存访问指令ldr、str、ldm、stm ldr既可以指低至读取伪指令,也可以是内存访问指令。当他的第二个参数前面有'='时标伪指令,否则表内存访问指令。 ldr指令从内存中读取数据到寄存器,str指令把寄存器的指存储到内存中,他们的操作数都是32位的。 ldr r1,[r2,#4] ldr r1,[r2] ldr r1,[r2],#4 str r1,[r2,#4] str r1,[r2] str r1,[r2],#4 寄存器传送指令可以用一条指令将16个可见寄存器(R0~R15)的任意子集合(或全部)存储到存储器或从存储器中读取数据到该寄存器集合中。与单寄存器存取指令相比,多寄存器数据存取可用的寻址模式更加有限。多寄存器存取指令的汇编格式如下: LDM/STM{}Rn{!}, 4、加减指令add、sub add r1,r2,#1 sub r1,r2,#1 5、程序状态寄存器的访问指令msr,mrs ARM指令中有两条指令,用于在状态寄存器和通用寄存器之间传送数据。修改状态寄存器一般是通过“读取-修改-写回”三个步骤的操作来实现的。这两条指令分别是: 状态寄存器到通用寄存器的传送指令(MRS) 通用寄存器到状态寄存器的传送指令(MSR) 其汇编格式如下: MRS{}Rd,CPSR|SPSR 其汇编格式如下:

实验一_MIPS指令集实验

深圳大学实验报告 课程名称:计算机系统(3) 实验项目名称: MIPS指令集实验 学院:计算机与软件学院 专业:计算机与软件学院所有专业 指导教师: ***** 报告人: ******* 学号: ********** 班级: ******* 实验时间: 2017年10月16日星期一 实验报告提交时间: 2017年10月19日星期四 教务处制

一、实验目标: 了解WinMIPS64的基本功能和作用; 熟悉MIPS指令、初步建立指令流水执行的感性认识; 掌握该工具的基本命令和操作,为流水线实验作准备。 二、实验内容 按照下面的实验步骤及说明,完成相关操作记录实验过程的截图: 1)下载WinMIPS64;运行样例代码并观察软件各个观察窗口的内容和作用,掌握软件的使用方法。(80分) 2)学会正确使用WinMIPS64的IO方法;(10分) 3)编写完整的排序程序;(10分) 三、实验环境 硬件:桌面PC 软件:Windows,WinMIPS64仿真器 四、实验步骤及说明 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?: 1.为WinMIPS64?创建目录,例如D:\ WinMIPS64? 2.解压给出的winmips64.zip压缩文件到创建的目录中。 (二)、一个完整的例子 1.开始和配置WinMIPS64 在winmips64这个子目录下,双击winmips64.exe文件,即打开了WinMIPS64模拟器,其外观如下图:

《计算机体系结构》第二次实验-指令集实验

指令集实验王宇航09283020 指令集实验 实验内容 通过观察求素数程序在windlx以及Intel中的运行方式和内存中的存储方式,进行比较和分析。 实验步骤 1、安装windlx模拟器,分析、运行其自带的求素数代码。详细分析其用到的各 类机器指令格式。 在windlx中将prim.s文件导入到其中并进行 ;------------------------------------------------------------------- ; Program begins at symbol main ; generates a table with the first 'Count' prime numbers from 'Table' ;------------------------------------------------------------------- .data ;*** size of table .global Count Count: .word 10 .global Table Table: .space Count*4 .text .global main main: ;*** Initialization addi r1,r0,0 ;Index in Table addi r2,r0,2 ;Current value //r1=r0+0 ; r2=r0+2 ;建立索引并初始化 ;*** Determine, if R2 can be divided by a value in table NextValue: addi r3,r0,0 ;Helpindex in Table //r3=r0+0 ;建立帮助索引 Loop: seq r4,r1,r3 ;End of Table? bnez r4,IsPrim ;R2 is a prime number lw r5,Table(R3) divu r6,r2,r5 multu r7,r6,r5 subu r8,r2,r7 beqz r8,IsNoPrim

强大的80X86常用汇编指令集

80X86常用汇编指令集ZZ 作者 : 赵振东ZZD 80X86汇编过程中经常用到的一些汇编指令如下所示。 从功能分类: 1、数据传送指令:MOV、XCHG、LEA、LDS、LES、PUSH、POP、PUSHF、POPF、CBW、CWD、CWDE。 2、算术指令:ADD、ADC、INC、SUB、SBB、DEC、CMP、MUL、DIV、DAA、DAS、AAA、AAS。 3、逻辑指令:AND、OR、XOR、NOT、TEST、SHL、SAL、SHR、SAR、RCL、RCR、ROL、ROR。 4、控制转移指令:JMP、Jcc、JCXZ、LOOP、LOOPZ、LOOPNZ、LOOPNE、CALL、RET、INT。 5、串操作指令:MOVS、LODS、STOS、CMPS、SCAS。 6、标志处理指令:CLC、STC、CLD、STD。 7、32位CPU新增指令(后续补充并完善) -----------------数据传送指令开始------------------------------- 1、MOV(传送) 指令写法:MOV target,source 功能:将源操作数source的值复制到target中去,source值不变 注意事项:1)target不能是CS(代码段寄存器),我的理解是代码段不可写,只可读,所以相应这地方也不能对CS执行复制操作。2)target 和source不能同时为内存数、段寄存器(CS\DS\ES\SS\FS\GS)3)不能将立即数传送给段寄存器4)target和source必须类型匹配,比如,要么都是字节,要么都是字或者都是双字等。4)由于立即数没有明确的类型,所以将立即数传送到target时,系统会自动将立即数零扩展到与target 数的位数相同,再进行传送。有时,需要用BYTE PTR、WORD PTR、 DWORD PTR明确指出立即数的位数 写法示例:MOV dl,01H;MOV eax,[bp]; eax =ss:[bp] 双字传送。 2、 XCHG(交换) 指令写法:XCHG object1,object2 功能:交换object1与object2的值 注意事项:1)不能直接交换两个内存数的值 2)类型必须匹配3)两个操作数任何一个都不能是段寄存器【看来段寄存器的写入的限制非常的严格,MOV指令也不能对段寄存器进行写入】,4)必须是通用寄存器(ax、bx、cx、dx、si、di)或内存数 写法示例:XCHG ax,[bx][si]; XCHG ax,bx; 3、 LEA(装入有效地址) 指令写法:LEZ reg16,mem 功能:将有效地址MEM的值装入到16位的通用寄存器中。 写法示例:假定bx=5678H,EAX=1,EDX=2 Lea si,2[bx] ;si=567AH Lea di,2[eax][edx] ;di=5 注意,这里装入的是有效地址,并不是实际的内存中的数值,如果要想取内存中该地址对应的数值,还需要加上段地址才行,而段地址有可能保存在DS中,也有可能保存在SS或者CS中哦:>不知道我的理解可正确。。。。 4、 LDS\LES\LGS\LSS(注意,与LEA不同的是,这里是装入的值,而不是有效地址) 这几个指令,名称不同,作用差不多。 写法:LDS reg16,mem32 功能描述:reg16等于mem32的低字,而DS对应于mem32的高字(当为LES时,这里就是ES对应于mem32的高字) 用来给一个段寄存器和一个16位通用寄存器同时复制。 注意事项:第一个操作数必须是16位通用寄存器 先熟悉下堆栈的概念。堆栈,位于内存的堆栈段中,是内存的一部分,具有“先进后出”的特点,堆栈只有一个入口,即当前栈顶,当堆栈为空时,栈顶和栈底指向同一内存地址,在WINDOWS中,可以把堆栈理解成一个倒着的啤酒瓶,上面的地址大,下面的地址小,当从瓶口往啤酒瓶塞啤酒时(进栈),栈顶就会往瓶口下移动,也就是往低地址方向移动,同理,出栈时,正好相反,把啤酒给倒出来,栈顶向高地址方向移动。这就是所谓的堆栈,哼哼,很Easy吧。

MIPS基准指令集手册

第一届全国大学生计算机系统能力培养大赛基础指令集规范 (v1.00) 第一届全国大学生计算机系统能力培养大赛(以下简称“大赛”)技术方案中要求各参赛队开发支持MIPS 基准指令集的MIPS微系统。本文档对需要支持的MIPS基准指令集进行明确规定。各参赛队提交的设计作品必须实现本文档中的所有内容,但不限于。如果发现本文档中有定义不精确之处,请查阅参考文献[1-3]中的相关章节;如发现两者存在冲突,以参考文献[1-3]中的内容为准。 本文档定义的MIPS基准指令集是在MIPS32指令集基础之上进行一定程度地裁剪,在控制系统设计规模的前提下,保证最简单系统的可实现性。概要来说,这套指令集包含了所有非浮点MIPS I指令和MIPS32中的ERET指令,少量的CP0寄存器以支持中断和系统调用,不实现TLB MMU和特权等级。 本文档包含如下章节: 第1章,“编程模型”,对支持的数据类型、软件可见寄存器、大小尾端进行定义。 第2章,“操作模式”,对处理器需要支持的操作模式进行定义。 第2章,“指令定义”,对需实现指令逐条定义。 第3章,“存储管理”,定义一套线性虚实地址映射机制。 第4章,“中断与例外”,介绍需实现的中断和例外的相关定义。 第5章,“系统控制寄存器”,对需实现的系统控制寄存器(俗称CP0寄存器)逐个进行定义。 1编程模型 1.1 数据格式 处理器可处理的数据格式定义如下: ◆比特(bit, b) ◆字节(Byte, 8bits, B) ◆半字(Halfword, 16bits, H) ◆字(Word, 32bits, W) 1.2 寄存器 处理器包含的软件可见的寄存器种类如下: ◆32个32位通用寄存器,r0~r31。其中有两个被赋予了特殊含义:r0,0号通用寄存器,值永远为0; r31,31号通用寄存器,被JAL,BLTZAL和BGEZAL指令隐式的用作目标寄存器,存放返回地址。 ◆HI/LO寄存器。HI寄存器存放乘法指令结果的高半部分或是除法指令结果的余数,LO寄存器存放 乘法指令结果的低半部分或是除法指令结果的商。 ◆程序计数器(PC)。这个寄存器软件无法直接访问。

实验二 ARM指令系统试验

实验二ARM指令系统试验 讲师:杨行 【实验目的】 1、了解ARM汇编语言 2、掌握简单C语言嵌套ARM汇编语言编程; 3、了解APCS规范; 【实验原理】 一、介绍 APCS,ARM 过程调用标准(ARM Procedure Call Standard),提供了紧凑的编写例程的一种机制,定义的例程可以与其他例程交织在一起。最显著的一点是对这些例程来自哪里没有明确的限制。它们可以编译自C、Pascal、也可以是用汇编语言写成的。 APCS 定义了: 对寄存器使用的限制。 使用栈的惯例。 在函数调用之间传递/返回参数。 可以被‘回溯’的基于栈的结构的格式,用来提供从失败点到程序入口的函数(和给予的参数)的列表。 APCS 不一个单一的给定标准,而是一系列类似但在特定条件下有所区别的标准。例如,APCS-R (用于RISC OS)规定在函数进入时设置的标志必须在函数退出时复位。在32 位标准下,并不是总能知道进入标志的(没有USR_CPSR),所以你不需要恢复它们。如你所预料的那样,在不同版本间没有相容性。希望恢复标志的代码在它们未被恢复的时候可能会表现失常... 如果你开发一个基于ARM 的系统,不要求你去实现APCS。但建议你实现它,因为它不难实现,且可以使你获得各种利益。但是,如果要写用来与编译后的C 连接的汇编代码,则必须使用APCS。编译器期望特定的条件,在你的加入(add-in)代码中必须得到满足。一个好例子是APCS 定义a1 到a4 可以被破坏,而v1 到v6 必须被保护。 二、C语言嵌套ARM汇编语言 int (*my_printf)(const char *format, ...); int main(void) { int n = 5; int m = 1; int ret; my_printf = (void *)0x33f963a8;

Eviews常用命令集

武汉大学实践教改项目 Eviews命令集 武汉大学经济学系数量经济学教研室《教改项目组》编译本命令集几乎涵盖了Eviews中所有命令,视图和过程的完整列表,我们分为基本命令,矩阵和字符串函数以及编程语言三个面加以介绍,在每一个面的列表按照字母顺序排列。每条记录包括该命令关键词,关键词的各种用法,其功能描述和语法,在大多数记录中,我们还提供了附加参数的列表和示例。 一、基本命令 add add group过程| pool过程 向组添加一个序列或者向pool中添加截面元。 语法 group过程:group_name.add ser1 ser2 ser3 group过程:group_name.add grp1 grp2 pool过程:pool_name.add id1 id2 id3 列出要添加到组中的序列名称或者序列组,或者列出要添加到pool中的截面标识符。 示例 dummy.add d11 d12 向组DUMMY中添加两个序列D11和D12。 countries.add us gr 向pool对象COUNTRIES中添加US和GR两个截面元素。 addtext addtext图过程 在图中放置文本。 语法 图过程:graph_name.addtext(options) text 在addtext命令后跟随要放置到图中的文本。 选项 t 顶部(在图的上部并居中)。 l 左旋转。 r 右旋转。 b 下方并居中。

x 把文本包含在框中。 要在图中放置文本,可以明确的使用座标来指定文本左上角的位置。座标由一个数对h,v设定,单位是虚英寸。单独的图通常是43虚英寸(散点图是33虚英寸),不管它们当前的显示大小。座标的原点位于图的左上角。第一个数值h指定从原点向右偏离的虚英寸距离。第二个数值v指定从原点向下偏离的虚英寸距离。文本的左上角将被放置在指定的座标上。 ●座标可以于其他选项一起使用,但是它们必须位于选项列表的前两个位置。座标 受指定位置的其他选项控制。 ●当addtext对多重图使用时,文本应用于整个图,而不是每个单独的图。 示例 freeze(g1) gdp.line g1.addtext(t) Fig 1: Monthly GDP (78:1-95:12) 把文本“Fig1: Monthly GDP (78:1-95:12)”放置于图G1的顶部中央位置。 g1.addtext(.2,.2,x) seasonally adjusted 把文本“seasonally adjusted”放置在图中的一个框中,稍稍从左上角缩进。 align align Graph视图 对齐多个图形的位置。 语法 Graph视图:graph_name.align(n,h,v) 选项 n 指定图形放置的列数。 h 图形之间的水平间隔。 v 是图形之间的垂直间隔。 必须在括号中按顺序指定以上3个参数(用逗号隔开)。间隔大小的单位为虚英寸。 示例 mygraph.align(3,1.5,1) 把MYGRAPH与第三列中的图形对齐,水平间隔为1.5英寸,垂直距离为1英寸。 append append Logl 过程| Model过程| System过程| Sspace过程 向Logl对象,Model对象,System对象,或者Sspace空间对象添加一行。 语法

VB常用指令集

VB常用指令集 Abs 求绝对值 ActiveControl 得到焦点的对象ActiveForm 得到焦点的表单 Array 指定数组 App 得知程序信息 AppActivate 激活执行中的应用程序Asc 求字符的内码 AscB 求字符的ASCII AscW 求字符的UniCode Atn 求Tan-1 Beep 发出预设的警示声 Call 调用子程序 Calendar 选择月历 Choose 取出一列值的某个值 CBool 数值转成布尔数 CByte 数值转成位元格式 CCur 数值转成货币格式 CDate 数据转成时间 CDbl 数值转成双精度浮点数 CDec 数据转成十进数 ChDir 改变目前路径缓充的路径ChDrive 改变目前磁盘缓充的磁盘 Chr 由内码求得一字符 ChrB 由ASCII求得一字符 ChrW 由UniCode求得一字符 CInt 数据转成Integer CLng 数据转成Long Command 读出程序的参数 Const 定义常数 Cos COSCSng 数值转成单精度浮点数CurDir 得知目前路径缓充的路径CVar 数值转成可变变量 Date 得到目前电脑的时间 Date$ 得到目前电脑时间字符串DateAdd 日期加法得日期 DateDiff 日期相减得数值 DatePart 日期部份资讯 DateSerial 字符串转日期 DateValue 数字转日期 Day 得知日期变量内是几号 DDB 折旧的计算 DeleteSetting 删除系统登录内的数据

Dir 得知目前路径内的文件名 DoEvents 闲置函数 End 结束程序 Environ 取得环境变量的数据 EOF 某个文件缓冲的指标是否到档尾 Erase 重新初始化数组 Err 错误资讯 Error 错误代码信息 Exp 得到自然对数 Fix 去除小数 FileCopy To 复制文件 FileAttr 文件开启模式 FileDateTime 文件存档日期 FileLen 文件长度 Filter 筛选数组 VB6提供 Format 数据格式化输出 FreeFile 空的文件编号 FV 求得定期、定额支付且固定利率下之年金的值GetAllSetting 得到所有系统登录的资讯 GetAttr 得知文件属性 GetSetting 得到系统登录的资讯 Hex 将数值转成16进数表示的字符串 Hour 得知日期变量内是几时 If . Then . Else 判断结构 IMEStatus 得知IME输入法状态 InStr 寻找字符串里的字符串 InStrB 寻找字符串里的ASCII IntStrRev 由字符串右边开始寻找字符串里的字符串 VB6提供Int 取整数 Join 将数组数据加入分隔字符后组合成一新字符串 VB6提供Kill 删除文件 LBound 得知数组最小起始范围 LCase 字符串转小写 Left截取字符串左边几个字 Len 得知字符串的字数 LenB 得知变量占用记忆体几个Byte LoadPicture 载入图形 Log 求对数值 LSet 字符串向左对齐 LTrim 移除字符串最左边的空白字符 Mid 截取字符串里某些字符串 Minute 得知日期变量内是几分 MkDir 建立新的数据颊 Month 得知日期变量内是第几月

mips指令集指的是什么

mips指令集指的是什么 MIPS是高效精简指令集计算机(RISC)体系结构中最优雅的一种;即使连MIPS的竞争对手也这样认为,这可以从MIPS对于后来研制的新型体系结构比如DEC的Alpha和HP的Precision产生的强烈影响看出来。虽然自身的优雅设计并不能保证在充满竞争的市场上长盛不衰,但是MIPS微处理器却经常能在处理器的每个技术发展阶段保持速度最快的同时保持设计的简洁。 MIPS与MIPS指令集指令集是存储在CPU内部,对CPU运算进行指导和优化的硬程序。拥有这些指令集,CPU就可以更高效地运行。MIPS指令集属于精简指令集,MIPS 的所有指令都是32位,指令格式简单,而X86的指令长度不是固定的。简单的指令和格式易于译码和流水线操作,但是代码密度不高,导致二进制文件大。 低端的CPU物理面积只有1.5平方毫米(在SOC系统里面肉眼很难找到)。而高端的R10000处理器,第一次投放市场时可能是世界上最快的CPU,它的物理面积几乎有1平方英寸,发热近30瓦特。虽然MIPS看起来没什么优势,但是足够的销售量使其能健康发展:1997年面市的44M的MIPS CPU,绝大多数使用于嵌入式应用领域。 MIPS(Million InstrucTIons Per Second):单字长定点指令平均执行速度Million InstrucTIons Per Second的缩写,每秒处理的百万级的机器语言指令数。这是衡量CPU速度的一个指标。像是一个Intel80386 电脑可以每秒处理3百万到5百万机器语言指令,即我们可以说80386是3到5MIPS的CPU。MIPS只是衡量CPU性能的指标。 MIPS是世界上很流行的一种RISC处理器。MIPS的意思无内部互锁流水级的微处理器(Microprocessor without interlocked piped stages),其机制是尽量利用软件办法避免流水线中的数据相关问题。它最早是在80年代初期由斯坦福(Stanford)大学Hennessy教授领导的研究小组研制出来的。MIPS公司的R系列就是在此基础上开发的RISC工业产品的微处理器。这些系列产品为很多计算机公司采用构成各种工作站和计算机系统。 MIPS技术公司是美国著名的芯片设计公司,它采用精简指令系统计算结构(RISC)来设计芯片。和英特尔采用的复杂指令系统计算结构(CISC)相比,RISC具有设计更简单、

实验二:ARM指令集-条件执行

嵌入式系统课程实验 实验二:ARM指令集-条件执行 实验目的 1、掌握ARM指令的一般格式,了解条件位的作用 2、掌握条件执行的使用方法,了解条件执行的原理 实验内容 使用CodeWarrior创建ARM工程,并为工程添加汇编源码文件Start.S,输入源码。修改工程链接设置,编译工程后Debug工程。使用AXD单步运行方式调试工程,通过观察指令执行结果理解条件执行的原理。 实验设备 硬件:PC机(CPU不低于2G Hz,内存不低于1GB) 软件:Windows操作系统(XP以上)、ADS1.2集成开发环境 基础知识 见“嵌入式系统”课件 实验内容 1ARM指令格式 1.1在实验一创建的工程中,修改Start.S文件,添加如下指令 AREA BOOT, CODE, READONL Y ENTRY B RESET B . B . B . B . B . B . B . RESET add r0,r1,r2 adds r0,r1,r2 add r1,r2,r3 add r0,r1,#5 sub r0,r1,r2 subs r0,r1,r2 subeqs r0,r1,r2 B . END

1.2编译工程后,在AXD中使用Interleave Disassembly模式察看指令编译出来 的二进制代码 1.3根据PPT上的ARM指令格式,以上述指令为例,分析二进制代码的意义

2 条件执行 2.1 参考以下两份代码,分别修改Start.S 中的代码,并使用ARMulator 运行代码, 通过设定不同的R0值,观察指令的运行结果,理解条件执行的意义。 扩展实验(选做实验) 1、 通过修改实验内容1的指令,深入探索ARM 指令编码格式; 2、 在AXD 的Memory 窗口手动修改ARM 指令的二进制编码,然后以ARM 指令的方 式察看内存,验证修改结果; 3、 修改实验内容2的指令,深入探索条件执行的原理和使用方法。 CMP r0, #0 BNE else ADD r1, r1, #1 B end1 else ADD r2, r2, #1 end1 B. ... ARM instructions unconditional CMP r0, #0 ADDEQ r1, r1, #1 ADDNE r2, r2, #1 B . ... conditional

51单片机汇编指令集(附记忆方法)

51单片机汇编指令集 一、数据传送类指令(7种助记符) MOV(英文为Move):对内部数据寄存器RAM和特殊功能寄存器SFR的数据进行传送; MOVC(Move Code)读取程序存储器数据表格的数据传送; MOVX (Move External RAM) 对外部RAM的数据传送; XCH (Exchange) 字节交换; XCHD (Exchange low-order Digit) 低半字节交换; PUSH (Push onto Stack) 入栈; POP (Pop from Stack) 出栈; 二、算术运算类指令(8种助记符) ADD(Addition) 加法; ADDC(Add with Carry) 带进位加法; SUBB(Subtract with Borrow) 带借位减法; DA(Decimal Adjust) 十进制调整; INC(Increment) 加1; DEC(Decrement) 减1; MUL(Multiplication、Multiply) 乘法; DIV(Division、Divide) 除法; 三、逻辑运算类指令(10种助记符) ANL(AND Logic) 逻辑与; ORL(OR Logic) 逻辑或; XRL(Exclusive-OR Logic) 逻辑异或; CLR(Clear) 清零; CPL(Complement) 取反; RL(Rotate left) 循环左移; RLC(Rotate Left throught the Carry flag) 带进位循环左移; RR(Rotate Right) 循环右移; RRC (Rotate Right throught the Carry flag) 带进位循环右移; SWAP (Swap) 低4位与高4位交换; 四、控制转移类指令(17种助记符) ACALL(Absolute subroutine Call)子程序绝对调用; LCALL(Long subroutine Call)子程序长调用; RET(Return from subroutine)子程序返回; RETI(Return from Interruption)中断返回; SJMP(Short Jump)短转移; AJMP(Absolute Jump)绝对转移; LJMP(Long Jump)长转移; CJNE (Compare Jump if Not Equal)比较不相等则转移;

实验一熟悉WinDLX的使用

实验一熟悉WinDLX的使用 1.实验目的: 通过本实验,熟悉WinDLX模拟器的操作和使用,了解DLX指令集结构及其特点。 2.实验内容: (1)用WinDLX模拟器执行求阶乘程序facts。执行步骤详见“WinDLX教程”。 这个程序说明浮点指令的使用。该程序从标准输入读入一个整数,求其阶乘,然后将结果输出。该程序中调用了input. s中的输入子程序,这个子程序用于读入正整数。 (2)输入数据“3”采用单步执行方法,完成程序并通过上述使用 WinDLX,总结WinDLX的特点。 (3)注意观察变量说明语句所建立的数据区,理解WinDLX指令系统。 3.实验程序: 求阶乘程序facts ;***********WINDLX Ex.2: Factorial************* Program begin at symbol main requires module INPUT read a number from stdin and calculate the factorial (type: double) the result is written to stdout .data Prompt: .asciiz "An integer value >1:” PrintfFormat: .asciiz "Factorial=%g\n\n" .align 2 PrintfPar: .word PrintfFormat PrintfValue: .space 8 .text .global main mam: ;***Read value from stdin into R1 addi r1,r0,Prompt j al InputUnsigned;***init values movi2fp f10,r1 ;R1一>DO DO二Count register cvti2d f0,f10 addi r2,r0,1;1一>D2 D2..result movi2fp fl 1,r2 cvti2d伦,fl l movd f4,fZ;1一>D4 D4二Constant 1 ;***Break loop if DO=1 Loop: led f0,f4 ;DO<=1? bfpt Finish

access2010常用指令集合

Access常用宏命令及其功能 Access常考控件属性 Access常考控件事件

ACCESS输入掩码的含义 常用函数 文本函数

打开窗体时,发生事件的顺序:打开(Open )→加载(Load )→调整大小(Resize )→激活(Activate )→成为当前(Current ) 关闭窗体时,发生事件顺序:卸载(Unload )→停用(Deactivate )→关闭(Close ) GotFocus 之前

VBA 编程中常用命令: Docmd.close 关闭界面 Docmd.Open 特殊考点: 数据访问对象DAO 模型 DBEngine 对象:表示Microsoft Jet 数据库引擎。它是DAO 模型的最上层对象,而且包含并控制DAO 模型对象。 Workspace 对象:表示工作区。 RecordSet 对象:表示数据操作返回的记录集 Database 对象:表示操作的数据库对象。 Field 对象:表示记录集中的字段数据信息 Query Def 对象:表示数据库查询信息 Error 对象表示数据提供程序出错似的扩展信息。 ADO 对象模型 特殊聚合函数: Ns 函数:用于将Null 值转换为0,空字符串或者其他指定值 格式:Ns (表达式或字段属性值,[规定值]) DLookup 函数:是从指定记录集里检索特定字段的值。 DBEngine Workspace(s) Database(s) RecordSet(s) Field(s) Error(s) Query Def(s) Connection Error(s) Command RecordSet Field(s)

MIPS指令集

MIPS CPU的一次操作可加载或存储1到8个字节的数据。由于乘法的结果返回的速度不足以使下一条指令能够自动得到这个结果,乘法结果寄存器是互锁的(interlocked)。在乘法操作完成之前试图读取结果寄存器就是导致CPU停止运行,直到完成。 和其他一些更简单的RISC体系结构相比,MIPS体系结构的目标之一是:体系结构朝着64位发展,从而使得地址的段式结构变得没有任何必要。(在64位版本的X86核PowerPC中还有这个负担) 功能分组: 空操作:nop、ssnop(不能和其他指令同时发射,至少需要一个时钟周期) 寄存器间的数据传送指令:move、movf、movt、movn、movz(后四个为条件传递指令) 常数加载指令:dla、la(获取某些标号地址或程序中变量地址的宏指令);dli、li(加载常数立即数指令);lui(加载高位立即数指令) 算术/逻辑操作指令:addu、addiu、daddu,daddiu(加法指令);dsub、sub(会触发溢出陷入的减法操作);dsubu、subu(普通减法指令);abs、dabs(求绝对值操作);dneg、neg、dnegu、negu(一元非操作);and、andi、or、ori、xor、xori、nor、not(按位逻辑指令);drol、dror、rol、ror(循环左移和右移);dsll、dsll32、dsllv(64位左移,低位补零);dsra、dsra32、dsrav(64位算术右移指令);dsrl、dsrl32、dsrlv(64位逻辑右移指令);sll、sllv(32位左移指令);sra、srav(32位算术右移指令);srl、srlv(32位逻辑右移指令);slt、slti、sltiu、sltu(硬件指令,条件满足就写入1,否则写0);seq、sge、sgeu、sgt、sgtu、sle、slue、sne (根据更复杂的条件设置目的寄存器的宏指令) 整数乘法、除法以及求余指令:ddiv、ddivu、div、divu(整数除法的3操作数宏指令分别处理64位或32位有符号或无符号数);divo、divou(明确该指令是带有溢出检查的除法指令);dmul、mul(3操作数64位或32位乘法指令,没有溢出检查);mulo、mulou、dmulo、dumlou(乘法宏指令,如果结果不能存入一个通用寄存器,发生溢出,触发异常);dmult、dmultu、mult、multu(执行有符号/无符号32/64位乘法的机器指令);drem、dremu、rem、remu(求余操作);mfhi、mflo、mthi、mtlo(用于访问整数乘除单元的结果寄存器hi和lo)存取指令(内存访问指令):lb、lbu(加载一个字节,高位可以补零,或进行符号扩展,以补充整个寄存器的长度);ld(加载一个双字);ldl、ldr、lwl、lwr、sdl、sdr、swl、swr(向左、向右加载、存储一个字、双字);lh、lhu(加载一个半字,高位可以补零,或进行符号扩展,以补充整个寄存器的长度);lw、lwu(加载一个字);pref、prefx(把数据预取到缓冲);sb、sd、sh、sw(存储字节、双字、半字、字);uld、ulh、ulhu、ulw、usd、usw、ush(地址非对齐的数据存取宏指令);l.d、l.s、s.d、s.s(存取双精度和单精度浮点数的指令,地址必须对齐);ldxcl、lwxcl、sdxcl、swxcl(采用基址寄存器+偏移寄存器的寻址方式存取指令);跳转、分支和子程序调用指令:j(无条件跳转到一个绝对地址,访问256M的代码空间);jal、jalr(直接或间接子程序调用,这种跳转不仅能跳转到指定地址,而且可以顺便把返回地址(当前指令地址+8)放到ra寄存器中);b(基于当前指令地址的无条件相对跳转);bal (基于当前地址的函数调用指令);bc0f、bc0f1、bc0t、bc0t1、bc2f、bc2f1、bc2t、bc2t1(根据协处理器0和2的条件标志进行跳转);bc1f、bc1f1、bc1t、bc1t1(根据浮点条件标志位进行跳转);beq、beq1、beqz、beqz1、bge、bge1、bgeu、bgeu1、bgez、bgez1、bgt、bgt1、bgtu、bgtu1、bgtz、bgtz1、ble、ble1、bleu、bleu1、blez、blez1、blt、blt1、bltu、bltu1、bltz、bltz1、bne、bnel、bnez、bnezl(双操作数和单操作数的比较跳转指令);bgeza1、bgeza11、bltza1、bltza11(如果需要,这些指令是用于有条件函数调用的原始机器指令); 断点及陷阱指令:break(产生一个“断点”类型的异常);sdbbp(产生EJTAG异常的断点指令);syscall(产生一个约定用于系统调用的异常类型);teq、teqi、tge、tgei、tgeiu、tgeu、tlt、tlti、tltiu、tltu、tne、tnei(条件异常指令,对一个或两个操作数进行条件测试);

相关文档
最新文档