协处理器指令系统
- 格式:doc
- 大小:126.50 KB
- 文档页数:23
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),其机制是尽量利用软件办法避免流水线中的数据相关问题。
mips32指令格式-回复MIPS32指令格式是一种基于RISC(精简指令集计算机)架构的指令集体系结构。
MIPS是Microprocessor without Interlocked Pipeline Stages 的缩写,是Stanford大学计算机系统实验室在20世纪80年代开发的一种指令集架构。
MIPS32指令格式采用固定长度的32位二进制表示,可以分为六种不同的指令格式:R型、I型、J型、Pseudo型、FP型和Coprocessor型。
每种指令格式都有不同的编码规则和操作码字段,下面我们将一步一步地回答关于MIPS32指令格式的相关问题。
1. 什么是MIPS32指令格式?MIPS32指令格式是一种用于MIPS架构的指令集格式。
它定义了用于执行的指令的二进制表示形式,其中每个指令都以固定的长度(32位)来表示。
这种格式简化了指令的解码和执行,提高了计算机的性能。
2. 有哪些MIPS32指令格式?MIPS32指令格式可分为六种类型:R型、I型、J型、Pseudo型、FP型和Coprocessor型。
每种类型的指令具有不同的编码规则和操作码字段。
- R型指令格式主要用于寄存器之间的操作,例如加法、减法、逻辑运算等。
- I型指令格式用于常量操作和数据传输,例如加载立即数、存储数据等。
- J型指令格式用于跳转指令,例如无条件跳转、分支跳转等。
- Pseudo型指令格式是MIPS指令集的补充,提供了一些方便的编码形式,但并不是真正的硬件支持指令。
- FP型指令格式是用于浮点运算指令的特殊格式。
- Coprocessor型指令格式用于处理器的协处理器指令。
3. R型指令格式的编码规则是什么?R型指令格式使用6个位字段来表示操作码和寄存器操作数。
其中,6位的操作码字段用于指定具体的操作,5位的寄存器字段用于指定寄存器的编号。
除了这些字段外,R型指令格式还包括3个用于指定目标寄存器、源寄存器和移位量的字段。
ARM指令集是一种用于处理器架构的指令集体系结构。
它最初由英国公司ARM Holdings开发,并广泛应用于各种嵌入式系统、移动设备和低功耗应用中。
以下是ARM指令集的发展史:1. ARM1:ARM指令集最早出现在1985年的ARM1处理器上。
ARM1是一款32位处理器,采用精简指令集(RISC)设计理念,具有较低的能耗和成本。
2. ARM2:ARM2处理器于1987年发布,增加了对乘法指令的支持,并引入了缓存技术来提高性能。
3. ARMv3:ARMv3指令集体系结构于1992年推出,支持更多的指令和功能,如虚拟内存管理单元(VMMU)和协处理器。
4. ARMv4:ARMv4指令集体系结构于1995年发布,引入了Thumb指令集,可以以压缩的形式执行16位指令,提高了代码密度和节能效果。
5. ARMv5:ARMv5指令集体系结构于1997年推出,引入了Jazelle技术,使处理器能够直接执行Java字节码。
6. ARMv6:ARMv6指令集体系结构于2002年发布,引入了Thumb-2技术,将16位Thumb指令和32位ARM指令混合使用,提高了代码密度和性能。
7. ARMv7:ARMv7指令集体系结构于2004年发布,引入了NEON SIMD(单指令多数据)扩展指令集,提供更高的并行计算能力。
8. ARMv8:ARMv8指令集体系结构于2011年推出,是一个重要的里程碑,引入了64位处理器架构(AArch64),并保持了与之前32位指令集的向后兼容性。
9. ARMv9:目前(2024年)尚未发布,但ARM Holdings已经透露正在研发ARMv9指令集体系结构。
ARMv9预计将进一步提升性能、安全性和AI加速能力。
上述是ARM指令集的主要发展历程,每个版本都带来了新的功能和改进,使ARM成为全球最受欢迎的处理器架构之一,并广泛应用于各个领域。
异构计算体系结构分析和关键技术研究摘要:随着人工智能和大数据等计算机应用对算力需求的迅猛增长以及应用场景的多样化,通用处理器+协处理器的异构混合计算逐渐成为研究重点。
文中介绍了当前主要的异构计算机体系结构,包括CPU+协处理器、CPU+众核处理器、CPU+ASIC、CPU+FPGA等;简述了异构计算中的关键技术,包括异构处理器之间的并行任务划分、任务映射、数据通信、数据访问,以及异构协同的并行同步和异构资源的流水线并行等;分析了异构计算面临的挑战,指出目前关键的核心技术需要从通用与AI专用异构计算的融合、异构架构的无缝移植、统一编程模型、存算一体化、智能化任务划分和分配等方面进行突破。
趋势表明,异构计算架构会进一步加强对AI的支持,同时也会增强软件的通用性。
关键词:异构计算;并行计算;并行编程;混合编程引言随着人工智能和大数据迅速发展,计算机的算力需求也急剧增加,传统的CPU难以适应需求的增长,异构计算能够提供更强大的算力。
例如用于通用计算的图形加速处理器,拥有几百甚至上千个核心,因此也被称为众核处理器,由于拥有大量的计算核心,其并行计算能力迅速得到提升,与CPU共同构成的异构计算系统比传统的对称处理器系统更有性能优势。
但是CPU与协处理器的指令系统不同,因此需要根据指令系统的差异对源码进行修改,将其编译成不同的程序分配到异构处理器上执行,同时也增加了程序编写、任务分配和数据通信的复杂性。
随着计算的应用场景的多样化,云计算、边缘计算以及各种智能设备接入物联网,使得计算面临的硬件和网络结构日趋多样,促进了处理器的多元化发展。
本文从分析异构计算机体系结构、异构处理器以及异构混合编程等的发展现状入手,对异构计算面临的主要挑战和关键技术进行分析,根据行业研究成果和发展趋势提出未来可能的研究方向。
1异构计算机体系结构1.1 CPU的协处理器CPU的协处理器是一种芯片,用于承担系统微处理器的特定处理任务。
一个协处理器通过扩展指令集或提供配置寄存器来扩展内核处理功能。
协处理器指令系统协处理器共有68条不同的指令,汇编程序在遇到协处理器指令助记符时,都会将其转换成机器语言的ESC指令,ESC指令代表了协处理器的操作码。
协处理器指令在执行过程中,需要访问内存单元时,CPU会为其形成内存地址。
协处理器在指令执行期间内利用数据总线来传递数据。
80287协处理器利用I/O地址00FAH~00FFH来实现其与CPU 之间的数据交换,而80387~Pentium系列芯片,则是利用I/O地址800000FAH~800000FFH来实现这两者之间的数据交换。
一.指令操作符的命名规则协处理器指令的操作符(或助忆符)在命名设计时,遵循了下列规则:1、在操作符后面加上字母P:表示该指令执行完后,还进行一次堆栈弹出操作,弹出栈顶数据以后要对其它的寄存器进行相应的调整。
如:FADDP/FSUBP/FSUBRP /FMULP/FDIVP /FDIVRP等;2、在操作符后面加上字母R:表示将两个操作数的源/目的位置交换再进行运算,它仅限于减法、除法指令,因为加法和乘法不受源/目的操作数的位置影响结果。
如:FSUBR和FDIVR等;不加R时——目的操作数=目的操作数op 源操作数加R模式——目的操作数=源操作数op 目的操作数假设:栈顶数据st(0)为10,内存变量data的值为1,分别执行下列指令将有不同的结果。
F SUB data ; ST(0)=ST(0)-dataF SUBR data ;ST(0)=data-ST(0)F SUB ST(3), ST(0) ;指令执行后,ST(3)=ST(3)-ST(0)F SUBR ST(3), ST(0) ;指令执行后,ST(3)=ST(0)-ST(3)3、操作符的第2个字母是I:表示内存操作数是整数(注意:不能是BYTE类型)。
它对加、减、乘、除指令以及堆栈操作指令都有效。
FIADD data ——整数加法,它表示内存单元data是一个整数,把该整数加到栈顶的浮点数上(ST(0)=ST(0)+data)。
mrc汇编指令MRC汇编指令详解引言:MRC(Microprocessor Resource Controller)汇编指令是一种用于ARM架构处理器的指令集,主要用于控制和管理处理器资源,实现高效的操作和运算。
本文将详细介绍MRC指令的相关内容,包括指令的分类、功能和使用方法。
一、指令分类MRC指令主要分为三类:数据处理指令、控制指令和系统指令。
1. 数据处理指令:数据处理指令用于对数据进行运算和处理,包括加法、减法、乘法、除法等操作。
例如,ADD指令用于实现两个寄存器的相加运算,SUB 指令用于实现两个寄存器的相减运算,MUL指令用于实现两个寄存器的相乘运算,DIV指令用于实现两个寄存器的相除运算。
2. 控制指令:控制指令用于控制程序的流程和跳转,包括条件分支、循环和跳转等操作。
例如,B指令用于实现无条件跳转,BEQ指令用于实现等于零时的跳转,BNE指令用于实现不等于零时的跳转,BL指令用于实现子程序的调用。
3. 系统指令:系统指令用于管理和控制处理器的各种资源和功能,包括中断、异常处理、协处理器控制等操作。
例如,SWI指令用于实现软中断,MCR指令用于实现协处理器的数据传送和控制。
二、指令功能MRC指令具有丰富的功能,可以实现多种操作和运算。
下面介绍几个常用的指令功能:1. 数据传送:MRC指令可以实现数据在寄存器之间的传送和复制。
例如,MOV指令用于将数据从一个寄存器复制到另一个寄存器,LDR指令用于将数据从存储器加载到寄存器中,STR指令用于将数据从寄存器存储到存储器中。
2. 逻辑运算:MRC指令可以实现逻辑运算,包括与、或、非、异或等操作。
例如,AND指令用于实现两个寄存器的与运算,OR指令用于实现两个寄存器的或运算,NOT指令用于实现一个寄存器的非运算,EOR指令用于实现两个寄存器的异或运算。
3. 算术运算:MRC指令可以实现算术运算,包括加法、减法、乘法、除法等操作。
例如,ADD指令用于实现两个寄存器的相加运算,SUB指令用于实现两个寄存器的相减运算,MUL指令用于实现两个寄存器的相乘运算,DIV指令用于实现两个寄存器的相除运算。
MIPS芯片架构说明MIPS(Microprocessor without Interlocked Pipeline Stages)即无竞争流水线微处理器,是一种精简指令集(RISC)的芯片架构。
MIPS 架构由美国斯坦福大学的约翰·亨尼西等人于1981年提出,并于1984年成立MIPS公司进行商业化开发和推广。
MIPS架构在计算机领域有着广泛的应用,尤其在网络设备、数字视频处理、嵌入式系统等领域具有重要地位。
MIPS架构的设计理念是简化指令集,提高流水线效率,以提供高性能和高效能的微处理器。
MIPS指令集体系结构的特征包括:固定长度的32位指令;寄存器-寻址模式;延迟槽;无跳转偏移;定长延迟分支;乱序执行指令流水线;五级流水线等。
MIPS指令集是一种精简的指令集,通过减少指令种类、规定固定的指令格式和长度,以及简化指令的操作模式,达到提高指令执行效率的目的。
MIPS指令集包括加载存储指令,算术逻辑运算指令,分支和跳转指令,协处理器指令等。
MIPS架构采用寄存器-寻址模式来访问数据。
寄存器-寻址模式是指通过指定寄存器的编号来操作数据,而不是通过指定内存地址。
MIPS架构提供了32个通用寄存器,用于存储数据和中间结果,通过对寄存器的操作来实现数据的传输和计算。
这种设计简化了指令的编码和执行,提高了指令执行的效率。
MIPS架构中的延迟槽是指在条件分支指令后的一条或多条指令,不管条件是否满足都会执行。
延迟槽的设计可以充分利用流水线的性能,但需要程序员进行特殊的处理,以确保延迟槽的指令在分支满足或不满足时都能正确执行。
MIPS架构的指令集中,分支和跳转指令的目标地址是相对于当前指令的偏移地址。
相对地址的设计简化了指令的编码和目标地址的计算,提高了指令的执行效率。
MIPS架构中的乱序执行指令流水线是指将多条指令按照最大并行度进行重排序,在这个过程中可能会引入数据依赖、资源竞争等问题。
为了解决这些问题,MIPS架构采取了一系列的措施,如指令重排序、数据前推、动态分支预测等,以提高指令的并行度和流水线的效率。
指令格式:指令{条件}{S} {目的Register},{OP1},{OP2} "{ }"中的内容可选。
即,可以不带条件只有目的寄存器,或只有目的寄存器和操作数1,也可以同时包含所有选项。
“S”决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值助记符英文全称示例、功能跳转指令BBranch跳转指令B Label;程序无条件跳转到标号Label处执行BLBranch with Link带返回的跳转指令BL Label ;当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到R14中BLXBranch with Link and exchange带返回和状态切换的跳转指令BLX Label;从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中BXBranch and exchange带状态切换的跳转指令BX Label ;跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM指令,也可以是Thumb指令数据处理MOVMove数据传送MOV R1,R0,LSL#3;将寄存器R0的值左移3位后传送到R1MVNMove NOT数据非传送MVN R0,#0 ;将立即数0取反传送到寄存器R0中,完成后R0=-1CMPCompare比较指令CMP R1,R0;将寄存器R1的值与寄存器R0的值相减,并根据结果设置CPSR的标志位CMNCompare negative负数比较指令CMN R1,R0 ;将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的标志位TSTTest位测试指令TST R1,#0xffe ;将寄存器R1的值与立即数0xffe按位与,并根据结果设置CPSR的标志位TEQTest equivalence相等测试指令TEQ R1,R2;将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位ADDAdd加法运算指令ADD R0,R2,R3,LSL#1; R0 = R2 + (R3 << 1)ADCAdd with carry带进位加法ADCS R2,R6,R10; R2 = R6+R10+!C,且更新CPSR的进位标志位SUBSubtract减法运算指令SUB R0,R1,#256; R0 = R1 – 256SBCSubtract with carry带进位减法指令SUBS R0,R1,R2 ; R0 = R1 - R2 - !C,并根据结果设置CPSR的进位标志位RSBReverse subtract逆向减法指令RSB R0,R1,R2 ; R0 = R2 – R1RSCReverse subtract with carry带进位逆向减法指令RSC R0,R1,R2; R0 = R2 – R1 - !CANDAnd逻辑与操作指令AND R0,R0,#3;该指令保持R0的0、1位,其余位清零。
协处理器指令系统协处理器共有68条不同的指令,汇编程序在遇到协处理器指令助记符时,都会将其转换成机器语言的ESC指令,ESC指令代表了协处理器的操作码。
协处理器指令在执行过程中,需要访问内存单元时,CPU会为其形成内存地址。
协处理器在指令执行期间内利用数据总线来传递数据。
80287协处理器利用I/O地址00FAH~00FFH来实现其与CPU 之间的数据交换,而80387~Pentium系列芯片,则是利用I/O地址800000FAH~800000FFH来实现这两者之间的数据交换。
一.指令操作符的命名规则协处理器指令的操作符(或助忆符)在命名设计时,遵循了下列规则:1、在操作符后面加上字母P:表示该指令执行完后,还进行一次堆栈弹出操作,弹出栈顶数据以后要对其它的寄存器进行相应的调整。
如:FADDP/FSUBP/FSUBRP /FMULP/FDIVP /FDIVRP等;2、在操作符后面加上字母R:表示将两个操作数的源/目的位置交换再进行运算,它仅限于减法、除法指令,因为加法和乘法不受源/目的操作数的位置影响结果。
如:FSUBR和FDIVR等;不加R时——目的操作数=目的操作数op 源操作数加R模式——目的操作数=源操作数op 目的操作数假设:栈顶数据st(0)为10,内存变量data的值为1,分别执行下列指令将有不同的结果。
F SUB data ; ST(0)=ST(0)-dataF SUBR data ;ST(0)=data-ST(0)F SUB ST(3), ST(0) ;指令执行后,ST(3)=ST(3)-ST(0)F SUBR ST(3), ST(0) ;指令执行后,ST(3)=ST(0)-ST(3)3、操作符的第2个字母是I:表示内存操作数是整数(注意:不能是BYTE类型)。
它对加、减、乘、除指令以及堆栈操作指令都有效。
FIADD data ——整数加法,它表示内存单元data是一个整数,把该整数加到栈顶的浮点数上(ST(0)=ST(0)+data)。
4、操作符的第二个字母是B:表示用于操作压缩的BCD码格式的内存操作数(用TWORD声明,10个字节),如FBLD和FBSTP 等。
5、操作符的第2个字母是N:表示在指令执行之前检查非屏蔽数值性错误。
如:FSA VE和FNSA VE等,前者称为等待形式(wait version),后者称为非等待形式(no-wait version)。
在使用.8087伪指令情况下,汇编程序会在等待形式的指令前面加上指令WAIT,而在非等待形式的指令前面加上空操作指令NOP。
理解了上述操作符命名规则,就能很容易地区分同类指令之间的差异。
二.数据传送指令为了满足协处理器和CPU之间进行数据交流的需求,就需要实现内存单元和协处理器之间进行数据传送的指令。
协处理器的指令系统中有三大类数据传送指令:BCD传送指令、数传送指令和浮点数传送指令。
(一)、BCD传送指令1、FBLD指令格式:FBLD MemBCD指令功能:将操作数中的BCD数据压入协处理器的堆栈中(ST(0)=MemBCD);MemBCD是TWORD类型的内存变量。
2、FBSTP指令格式:FBSTP MemBCD指令功能:将协处理器中的BCD数据存入内存(MemBCD=ST(0)),并进行堆栈的弹出操作。
例如:.387d ata1 DT123, -543d ata2 DT 2.5……F BLD data1 F BSTP data ;把data1压进栈(ST(0)=data1);把当前堆顶数据弹出,并传送给data (data=ST(0))(二)、整数传送指令1、FILD指令格式:FILD MemInt ;ST(0)=MemInt其中:MemInt 是定义为整型数据类型的内存单元,但不能是用BYTE 定义的存储单元。
下同,不再叙述。
2、FIST/FISTP指令格式:其中:指令功能: FIST MemIntFISTP MemInt Mem 是定义整型数据类型的内存单元,(用WORD,DWORD 和QWORD 定义)。
将协处理器堆栈栈顶的数据传送到目标存储单元中。
在进行数据传送时,系统自动根据控制寄存器中舍入控制位的设置把栈顶浮点数舍入成整型数据。
而FIST 与FISTP 的区别在以前就讲过,在执令后加P 的表示带有出栈操作。
那么FIST 的功能是MemInt=ST(0),但ST(0)不出栈,但FISTP 则在进行传送之后再进行对栈顶进行出栈。
(三)、浮点数传送指令1、FLD指令格式:FLD STReg/MemReal指令功能:将浮点数据压入协处理器的堆栈中。
当进行内存单元内容压栈时,系统会自动决定传送数据的精度。
比如:用DD 或REAL4定义的内存单元数值是单精度数等。
STReg 是处理器堆栈寄存器ST(0)~ST(7)。
例如:.387data1 DWORD 123, -543data2 REAL8 -321.5data3 REAL10 2.5……FLD data1 ;压一个单精度数据进栈FLD data2 ;压一个双精度数据进栈FLD ST(0) ;把堆栈寄存器ST(0)的值再压进栈FLD data3 ;压一个扩展精度数据进栈2、FST指令格式: 指令功能: FST STReg/MemReal将协处理器堆栈栈顶的数据传送到目标操作数中。
在进行数据传送时,系统自动根据控制寄存器中舍入控制位的设置把栈顶浮点数舍入成相应精度的数据。
3、FSTP指令格式: F STP STReg/MemReal指令功能: 与FST 相类似,所不同的是:指令FST 执行完后,不进行堆栈的弹出操作,即:堆栈不发生变化,而指令FSTP 执行完后,则需要进行堆栈的弹出操作,堆栈将发生变化。
从上面的浮点传送指令中可以看出,不仅可以对内存变量进行传送,也可以进行寄存器之间的传送,这一点是整型数据以及BCD 型数据传送指令所不具有的。
4、FXCH指令格式: 指令功能: FXCH [STReg]将指定的寄存器中的浮点数与堆顶浮点数进行交换。
如果不指定操作数,那么,默认ST(0)和ST(1)二者之间交换数据。
例如:FXCH ST(2) —— ST(0)与堆栈寄存器ST(2)进行数据交换。
由于FXCH 指令隐含ST(0)作为其中的一个操作数,所以其后只需指定一个操作数,但该操作数必须是寄存器,而且不能为ST(0),但是该指令后的寄存器是可选的,如果没有指定寄存器操作数,那么隐含是对ST(1)和ST(0)进行交换。
对数据传送指令的一点总结:它包括三种数据的传送指令,整型,压缩的BCD 型以及实型,三种数据的传送有各自的指令集。
压缩的BCD 传送指令仅有压栈以及弹栈两条:FBLD 以及FBSTP ,它们都仅有一个操作数,而且操作数必须是内存操作数的TWORD 类型。
整型数据传送指令有三条:FILD 、FIST 和FISTP ,其中后两条是出栈,唯一的区别在于出栈后是否改变(弹出)栈顶数据。
它们都仅有一个操作数,而且操作数必须是内存操作数的WORD、DWORD 以及QWORD类型,不能为BYTE类型。
相对来讲,实数传送指令比较多,它一共有四条:FLD、FST、FSTP和FXCH。
前三条指令的用法与整型类似,只不过用于传送实型数据,而且三条指令不仅支持内存操作数(为REAL4、REAL8和REAL10类型),而且支持寄存器之间的传送。
三条指令同样需要一个操作数。
而对于FXCH指令,它可以有一个或者没有操作数,但如果有操作数,那么这个参数必须为寄存器。
三.算术运算指令在协处理器的指令系统中,有关数学运算指令有:加法指令、减法指令、乘法指令、除法指令和求平方根指令等。
涉及数学运算的指令有比例运算、舍入运算、求绝对值运算和改变数值符号运算等指令。
(一)、整型算术运算指令指令格式:FIADD MemInt ;加法指令FISUB MemInt ;减法指令FISUBR MemInt ;减法指令FIMUL MemInt ;乘法指令FIDIV MemInt ;除法指令FIDIVR MemInt ;除法指令指令说明:由于整型算术运算指令都仅有一个操作数,那么另一个操作数就被隐含成ST(0),而运算结果也被保存在ST(0)中。
加和乘都仅有一条指令,它们的运算规则为:ST(0)=ST(0)+MemIntST(0)=ST(0)*MemInt但减法和除法都分别有两条指令,后面带R的指令是在运算之前先交换源/目的操作数的位置再进行运算。
由于在加法和乘法运算中交换两个操作数的位置的运算结果是一样的,所以不存在加R的情况。
减法和除法的运算规则为:ST(0)=ST(0)-MemInt ;相对于FISUB指令。
ST(0)=MemInt-ST(0) ;相对于FISUBR指令。
ST(0)=ST(0)/MemInt ;相对于FIDIV指令。
ST(0)=MemInt/ST(0) ;相对于FIDIVR指令。
综上所述,在进行整型算术运算中,仅须指定一个内存操作数就可以了,另一个操作数则默认为是ST(0),并且结果也存放在ST(0)中。
(二)、实型算术运算指令1.不带弹出操作的算术运算指令。
指令格式:FADD [STReg1, STReg2] ;加法指令。
FADD MemReal ;加法指令。
FSUB [STReg1, STReg2] ;减法指令FSUB MemReal ;减法指令FSUBR [STReg1, STReg2] ;减法指令FSUBR MemReal ;减法指令FMUL [STReg1, STReg2] ;乘法指令FMUL MemReal ;乘法指令FDIV [STReg1, STReg2] ;除法指令FDIV MemReal ;除法指令FDIVR [STReg1, STReg2] ;除法指令FDIVR MemReal ;除法指令上面的指令可以分为带R和不带R,区别在以前就讲过。
从上面的格式可以看出,它们都有三种使用格式:(1)不带任何操作数。
如果不带操作数,那么FPU就默认为ST(1)作为目的操作数,而ST(0)作为源操作数。
但这种情况下有一个弹出的动作,如:.DA TAV al1 REAL8 3.14V al2 REAL8 4.13.CODEFLD V al1 ;ST(0)=3.14FLD V al2 ;ST(0)=4.13 ST(1)=3.14FSUB ;ST(1)=ST(1)-ST(0)=3.14-4.13=-0.99,再弹出ST(0)也就是说执行过程是ST(1)=ST(1) op ST(0),再将ST(0)弹出,那么ST(1)就变成ST(0),而原来的ST(0)就被弹出了。
这一点是初学者最容易忘记的地方,在不带有P的算术运算指令进行实数运算,并且不指定任何操作数的时候,指令默认有一个弹出操作。