汇编中的协处理器及命令大全 博客分类: 汇编 设计模式IE编程.net
程序员文章站
2024-03-25 20:39:28
...
协处理器共有68条不同的指令,汇编程序在遇到协处理器指令助忆时,都会将其转换成机器语言的ESC指令,ESC指令代表了协处理器的操作码。
在协处理器指令在执行过程中,需要访问内存单元时,CPU会为其形成内存地址。协处理器在协处理器指令期间内利用数据总线来传递数据。80287协处理器利用I/O地址00FAH~00FFH来实现其与CPU之间的数据交换,而80387~Pentium系列芯片,则是利用I/O地址800000FAH~800000FFH来实现这两者之间的数据交换。
指令操作符的命名规则
协处理器指令的操作符(或助忆符)在命名设计时,遵循了下列规则:
1、在操作符后面加上字母P:表示该指令执行完后,还进行一次堆栈弹出操作。如:FADD和FADDP等;
2、在操作符后面加上字母R:表示该操作是反模式,它仅限于减法、除法指令。如:FSUB和FSUBR等;
正模式 —— 栈顶数据=栈顶数据 op 指令操作数,或OPN1=OPN1 – OPN2
反模式 —— 栈顶数据=指令操作数 op 栈顶数据,或OPN1=OPN2 – OPN1
假设:栈顶数据为10,内存变量data的值为1,分别执行下列指令将有不同的结果。
FSUB data ;指令执行后,栈顶数据为9
FSUBR data ;指令执行后,栈顶数据为-9
FSUB ST, ST(1) ;指令执行后,ST=ST-ST(1)
FSUBR ST, ST(1) ;指令执行后,ST=ST(1)-ST
3、操作符的第2个字母是I:表示内存中数据是整数。它对加、减、乘除指令都有效。
例如:FADD data——浮点数加法;
FIADD data——整数加法,它表示内存单元data是一个整数,把该整数加到栈顶的浮点数上。
4、操作符的第2个字母是N:表示在指令执行之前检查非屏蔽数值性错误。如:FSAVE和FNSAVE等,前者称为等待形式(wait version),后者称为非等待形式(no-wait version)。
在使用.8087伪指令情况下,汇编程序会在等待形式的指令前面加上指令WAIT,而在非等待形式的指令前面加上空操作指令NOP。
理解了上述操作符命名规则,就能很容易地区分同类指令之间的差异。
以上摘自红色黑客联盟(www.7747.net) 原文:http://www.7747.net/kf/201102/83313.html
下面详细介绍下协处理器指令:
1、加法指令
指令格式: FADD [STReg1, STReg2](*)
FADD MemReal
FADDP STReg, ST
FIADD MemInt
(*)在此指令格式下,如果同时指定了二个堆栈寄存器,那么,其中一个寄存器必须是ST。其它指令的同类格式与此同理。
指令FADD含有二个隐含操作数ST(1)和ST,其运算功能是:从堆栈中弹出这二个操作数,然后把计算的“和”压入堆栈,即:ST=ST(1)+ST。
指令“FADD MemReal”的功能:ST=ST+MemReal
指令“FADDP STReg, ST”的功能:STReg=STReg+ST,并弹出堆栈的栈顶
指令“FIADD MemInt”的功能:ST=ST+MemInt
2、减法指令
指令格式: FSUB [STReg1, STReg2]
FSUB MemReal
FSUBP STReg, ST
FISUB MemInt
FSUBR [STReg1, STReg2] ;后四条指令是前四条指令的反模式形式
FSUBR MemReal
FSUBRP STReg,ST
FISUBR MemInt
指令FSUB含有二个隐含操作数ST(1)和ST,其运算功能是:从堆栈中弹出这二个操作数,然后把计算的“差”压入堆栈,即:ST=ST(1)-ST。
指令“FSUB MemReal”的功能:ST=ST-MemReal
指令“FSUBP STReg, ST”的功能:STReg=STReg-ST,并弹出堆栈的栈顶
指令“FISUB MemInt”的功能:ST=ST-MemInt
反模式的四条指令的功能在此从略,请参阅11.3.1中的有关说明。
3、乘法指令
指令格式: FMUL [STReg1, STReg2]
FMUL MemReal
FMULP STReg, ST
FIMUL MemInt
4、除法指令
指令格式: FDIV [STReg1, STReg2]
FDIV MemReal
FDIVP STReg, ST
FIDIV MemInt
FDIVR [STReg1, STReg2] ;后四条指令是前四条指令的反模式形式
FDIVR MemReal
FDIVRP STReg, ST
FIDIVR MemInt
例如:
.387
word1 DW 20
data1 REAL8 8
data2 REAL8 -2
data3 REAL8 -12
……
FLD data1 ;本例只是显示指令的使用方法,无具体的实际功能
FLD data2
FLD data3
FDIV ST(2), ST
FDIV data1
FDIVP ST(2), ST
FIDIV word1
5、其它数学运算指令
在协处理器中,除了完成具体的数学运算指令外,还设置了若干个与数学运算有关的运算指令。具体的运算指令及其功能描述如表11.4所列。
表11.4 与数学运算有关的其它指令
指令格式
指令的功能
FSQRT
求栈顶数据的平方根。如果对负数求其平方根,则会发生错误,并可通过检测状态寄存器的标志位IE来确定。
FSCALE
将ST(1)中的数(转换成整数)加上ST的阶码,该指令能快速完成乘/除2n的运算。ST(1)中的数必须在2-15到215之间。
FPREM/FPREM1
ST=ST%ST(1),80387及其以后的协处理器支持FPREM1。
FRNDINT
对栈顶数据进行舍入运算,使之转换成整数。
FXTRACT
将栈顶数据分成二部分:无偏阶码和尾数。尾数存入栈顶,无偏阶码存入ST(1)。它常用将浮点数转换成小数形式打印输出。
FABS
ST=|ST|,即:求栈顶数据的绝对值。
FCHS
ST=-ST,即:改变栈顶数据的符号。
表11.5 比较运算指令及其功能
指令格式
指令的功能
FCOM
将栈顶数据与另一个操作数进行比较,该操作数可以存储在堆栈寄存器中,也可存储在内存中。
当在指令中不指定操作数时,其默认的操作数是ST和ST(1)。
FCOMP/FCOMPP
此指令的比较功能与FCOM相一致,所不同的是指出从堆栈中弹出一个,还是二个数据。
FICOM MemInt
FICOMP MemInt
栈顶数据与内存单元进行整数比较。指令FICOMP还要弹出栈顶数据。
FUCOM [STReg]
FUCOMP [STReg]
FUCOMPP
反向比较,其功能与上面同类指令类似。
FTST
栈顶数据与0进行比较。比较结果对条件编码位的影响如表11.2所示。
FXAM
检测栈顶数据是正数、负数,还是规格化数。比较结果对条件编码位的影响如表11.2所示。
11.3.5 超越函数运算指令
超越函数运算指令是用来实现三角函数或一些特殊的算术表达式而设置的,具体的指令及其功能说明如表11.6所列。
表11.6 超越函数运算指令及其功能
指令格式
指令的功能
FPTAN
求部分Y/X=tanθ,角度θ存于栈顶,其结果:
ST=X,ST(1)=Y
(1)、在8087-80287中,角度θ的范围上是0~π/4;
(2)、在80387以后的协处理器中,角度θ的范围上是0~263;
如果交度超过其取值范围,则状态IE标定为非法错误。
FPATAN
求部分反正切值θ=arctan(X/Y),X取自ST,Y取自ST(1);
其中:X和Y必须满足:0≤Y<X<∞;
指令执行时进行一次弹出操作,结果存入栈顶。
F2XM1
求2X-1的值,X取自栈顶,结果也存放栈顶,X的取值范围:-1~1。
FCOS或FSIN
求栈顶ST中角度的正弦或余弦值,ST中存放的是弧度。
运算结果也存于ST。
FSINCOS
求栈顶ST中角度的正弦和余弦值,ST中存放的是弧度。
运算结果:ST=正弦值,ST(1)=余弦值。
FYL2X
计算Ylog2X的值,X=ST,Y=ST(1),其中:X>0。
结果存入有一个弹出操作后的栈顶。
FYL2XP1
计算Ylog2(X+1)的值,X=ST,Y=ST(1),其中:0<X<1-2-0.5。
结果存入有一个弹出操作后的栈顶。
表11.7 常数压栈指令及其常数值
指令格式 指令的功能 指令格式 指令的功能
FLDZ
ST=+0.0
FLDL2T
ST= log210
FLD1
ST=+1.0
FLDLG2
ST= log102
FLDPI
ST=π
FLDLN2
ST= loge2
FLDL2E
ST=log2e
11.3.7 协处理器控制指令
协处理器控制指令是用来实现控制协处理器状态而设置的,它包括协处理器的初始化、状态寄存器内容的存?⒁斐4 砗腿挝袂谢坏炔僮鳌>咛宓闹噶罴捌涔δ芩得魅绫?1.8所列。
表11.8 比较运算指令及其功能
指令格式
指令的功能
FINIT/FNINIT
初始化协处理器,初始化后协处理器的状态如表11.9所列。
FLDCW Mem16
将由操作数指定的字存储单元内容存储到控制寄存器中。
FSTCW Mem16
FNSTCW Mem16
把控制寄存器的内容存储到由操作数指定的字存储单元。与指令“FLDCW”相对应。
FSTSW Mem16
FSTSW AX
FNSTSW Mem16
FNSTSW AX
将控制寄存器的内容传送到寄存器AX中。
在8087协处理器中无此指令。
FCLEX/FNCLEX
清除状态寄存器中的“错误”和“忙”标志。
FSAVE Mem
FNSAVE Mem
将全部机器状态存储到内存中。
FRSTOR Mem
从内存复原机器状态,它可恢复由指令“FSAVE/FNSAVE”保存的信息。
FSTENV Mem
FNSTENVMem
存储协处理器环境。
FLDENV Mem
重新装入由指令FSTENV/FNSTENV存储的协处理器环境
FINCST
堆栈指针加1。
FDECSTP
堆栈指针减1。
FFREE ST(i)
释放堆栈寄存器,即使其标记为空,但其内容并没有改变。
FNOP
协处理器的空操作
FWAIT
使处理器处于等待状态,以便协处理器完成其操作。该指令主要用于在CPU访问被协处理器影响的内存数据之前。
表11.9 协处理器初始化的状态
控制项 值 状态含义
控制位IC
0
投影
控制位PC
10
扩展精度
控制位RC
00
最近舍入或偶数
错误屏蔽
11111
错误位关闭
忙标志
0
不忙
C3~C0
????
未定
TOP
000
堆栈栈顶设定为寄存器0
ES
0
无错误
错误位
00000
无错误
全部标记
11
空
寄存器
--
不改变
在协处理器指令在执行过程中,需要访问内存单元时,CPU会为其形成内存地址。协处理器在协处理器指令期间内利用数据总线来传递数据。80287协处理器利用I/O地址00FAH~00FFH来实现其与CPU之间的数据交换,而80387~Pentium系列芯片,则是利用I/O地址800000FAH~800000FFH来实现这两者之间的数据交换。
指令操作符的命名规则
协处理器指令的操作符(或助忆符)在命名设计时,遵循了下列规则:
1、在操作符后面加上字母P:表示该指令执行完后,还进行一次堆栈弹出操作。如:FADD和FADDP等;
2、在操作符后面加上字母R:表示该操作是反模式,它仅限于减法、除法指令。如:FSUB和FSUBR等;
正模式 —— 栈顶数据=栈顶数据 op 指令操作数,或OPN1=OPN1 – OPN2
反模式 —— 栈顶数据=指令操作数 op 栈顶数据,或OPN1=OPN2 – OPN1
假设:栈顶数据为10,内存变量data的值为1,分别执行下列指令将有不同的结果。
FSUB data ;指令执行后,栈顶数据为9
FSUBR data ;指令执行后,栈顶数据为-9
FSUB ST, ST(1) ;指令执行后,ST=ST-ST(1)
FSUBR ST, ST(1) ;指令执行后,ST=ST(1)-ST
3、操作符的第2个字母是I:表示内存中数据是整数。它对加、减、乘除指令都有效。
例如:FADD data——浮点数加法;
FIADD data——整数加法,它表示内存单元data是一个整数,把该整数加到栈顶的浮点数上。
4、操作符的第2个字母是N:表示在指令执行之前检查非屏蔽数值性错误。如:FSAVE和FNSAVE等,前者称为等待形式(wait version),后者称为非等待形式(no-wait version)。
在使用.8087伪指令情况下,汇编程序会在等待形式的指令前面加上指令WAIT,而在非等待形式的指令前面加上空操作指令NOP。
理解了上述操作符命名规则,就能很容易地区分同类指令之间的差异。
以上摘自红色黑客联盟(www.7747.net) 原文:http://www.7747.net/kf/201102/83313.html
下面详细介绍下协处理器指令:
1、加法指令
指令格式: FADD [STReg1, STReg2](*)
FADD MemReal
FADDP STReg, ST
FIADD MemInt
(*)在此指令格式下,如果同时指定了二个堆栈寄存器,那么,其中一个寄存器必须是ST。其它指令的同类格式与此同理。
指令FADD含有二个隐含操作数ST(1)和ST,其运算功能是:从堆栈中弹出这二个操作数,然后把计算的“和”压入堆栈,即:ST=ST(1)+ST。
指令“FADD MemReal”的功能:ST=ST+MemReal
指令“FADDP STReg, ST”的功能:STReg=STReg+ST,并弹出堆栈的栈顶
指令“FIADD MemInt”的功能:ST=ST+MemInt
2、减法指令
指令格式: FSUB [STReg1, STReg2]
FSUB MemReal
FSUBP STReg, ST
FISUB MemInt
FSUBR [STReg1, STReg2] ;后四条指令是前四条指令的反模式形式
FSUBR MemReal
FSUBRP STReg,ST
FISUBR MemInt
指令FSUB含有二个隐含操作数ST(1)和ST,其运算功能是:从堆栈中弹出这二个操作数,然后把计算的“差”压入堆栈,即:ST=ST(1)-ST。
指令“FSUB MemReal”的功能:ST=ST-MemReal
指令“FSUBP STReg, ST”的功能:STReg=STReg-ST,并弹出堆栈的栈顶
指令“FISUB MemInt”的功能:ST=ST-MemInt
反模式的四条指令的功能在此从略,请参阅11.3.1中的有关说明。
3、乘法指令
指令格式: FMUL [STReg1, STReg2]
FMUL MemReal
FMULP STReg, ST
FIMUL MemInt
4、除法指令
指令格式: FDIV [STReg1, STReg2]
FDIV MemReal
FDIVP STReg, ST
FIDIV MemInt
FDIVR [STReg1, STReg2] ;后四条指令是前四条指令的反模式形式
FDIVR MemReal
FDIVRP STReg, ST
FIDIVR MemInt
例如:
.387
word1 DW 20
data1 REAL8 8
data2 REAL8 -2
data3 REAL8 -12
……
FLD data1 ;本例只是显示指令的使用方法,无具体的实际功能
FLD data2
FLD data3
FDIV ST(2), ST
FDIV data1
FDIVP ST(2), ST
FIDIV word1
5、其它数学运算指令
在协处理器中,除了完成具体的数学运算指令外,还设置了若干个与数学运算有关的运算指令。具体的运算指令及其功能描述如表11.4所列。
表11.4 与数学运算有关的其它指令
指令格式
指令的功能
FSQRT
求栈顶数据的平方根。如果对负数求其平方根,则会发生错误,并可通过检测状态寄存器的标志位IE来确定。
FSCALE
将ST(1)中的数(转换成整数)加上ST的阶码,该指令能快速完成乘/除2n的运算。ST(1)中的数必须在2-15到215之间。
FPREM/FPREM1
ST=ST%ST(1),80387及其以后的协处理器支持FPREM1。
FRNDINT
对栈顶数据进行舍入运算,使之转换成整数。
FXTRACT
将栈顶数据分成二部分:无偏阶码和尾数。尾数存入栈顶,无偏阶码存入ST(1)。它常用将浮点数转换成小数形式打印输出。
FABS
ST=|ST|,即:求栈顶数据的绝对值。
FCHS
ST=-ST,即:改变栈顶数据的符号。
表11.5 比较运算指令及其功能
指令格式
指令的功能
FCOM
将栈顶数据与另一个操作数进行比较,该操作数可以存储在堆栈寄存器中,也可存储在内存中。
当在指令中不指定操作数时,其默认的操作数是ST和ST(1)。
FCOMP/FCOMPP
此指令的比较功能与FCOM相一致,所不同的是指出从堆栈中弹出一个,还是二个数据。
FICOM MemInt
FICOMP MemInt
栈顶数据与内存单元进行整数比较。指令FICOMP还要弹出栈顶数据。
FUCOM [STReg]
FUCOMP [STReg]
FUCOMPP
反向比较,其功能与上面同类指令类似。
FTST
栈顶数据与0进行比较。比较结果对条件编码位的影响如表11.2所示。
FXAM
检测栈顶数据是正数、负数,还是规格化数。比较结果对条件编码位的影响如表11.2所示。
11.3.5 超越函数运算指令
超越函数运算指令是用来实现三角函数或一些特殊的算术表达式而设置的,具体的指令及其功能说明如表11.6所列。
表11.6 超越函数运算指令及其功能
指令格式
指令的功能
FPTAN
求部分Y/X=tanθ,角度θ存于栈顶,其结果:
ST=X,ST(1)=Y
(1)、在8087-80287中,角度θ的范围上是0~π/4;
(2)、在80387以后的协处理器中,角度θ的范围上是0~263;
如果交度超过其取值范围,则状态IE标定为非法错误。
FPATAN
求部分反正切值θ=arctan(X/Y),X取自ST,Y取自ST(1);
其中:X和Y必须满足:0≤Y<X<∞;
指令执行时进行一次弹出操作,结果存入栈顶。
F2XM1
求2X-1的值,X取自栈顶,结果也存放栈顶,X的取值范围:-1~1。
FCOS或FSIN
求栈顶ST中角度的正弦或余弦值,ST中存放的是弧度。
运算结果也存于ST。
FSINCOS
求栈顶ST中角度的正弦和余弦值,ST中存放的是弧度。
运算结果:ST=正弦值,ST(1)=余弦值。
FYL2X
计算Ylog2X的值,X=ST,Y=ST(1),其中:X>0。
结果存入有一个弹出操作后的栈顶。
FYL2XP1
计算Ylog2(X+1)的值,X=ST,Y=ST(1),其中:0<X<1-2-0.5。
结果存入有一个弹出操作后的栈顶。
表11.7 常数压栈指令及其常数值
指令格式 指令的功能 指令格式 指令的功能
FLDZ
ST=+0.0
FLDL2T
ST= log210
FLD1
ST=+1.0
FLDLG2
ST= log102
FLDPI
ST=π
FLDLN2
ST= loge2
FLDL2E
ST=log2e
11.3.7 协处理器控制指令
协处理器控制指令是用来实现控制协处理器状态而设置的,它包括协处理器的初始化、状态寄存器内容的存?⒁斐4 砗腿挝袂谢坏炔僮鳌>咛宓闹噶罴捌涔δ芩得魅绫?1.8所列。
表11.8 比较运算指令及其功能
指令格式
指令的功能
FINIT/FNINIT
初始化协处理器,初始化后协处理器的状态如表11.9所列。
FLDCW Mem16
将由操作数指定的字存储单元内容存储到控制寄存器中。
FSTCW Mem16
FNSTCW Mem16
把控制寄存器的内容存储到由操作数指定的字存储单元。与指令“FLDCW”相对应。
FSTSW Mem16
FSTSW AX
FNSTSW Mem16
FNSTSW AX
将控制寄存器的内容传送到寄存器AX中。
在8087协处理器中无此指令。
FCLEX/FNCLEX
清除状态寄存器中的“错误”和“忙”标志。
FSAVE Mem
FNSAVE Mem
将全部机器状态存储到内存中。
FRSTOR Mem
从内存复原机器状态,它可恢复由指令“FSAVE/FNSAVE”保存的信息。
FSTENV Mem
FNSTENVMem
存储协处理器环境。
FLDENV Mem
重新装入由指令FSTENV/FNSTENV存储的协处理器环境
FINCST
堆栈指针加1。
FDECSTP
堆栈指针减1。
FFREE ST(i)
释放堆栈寄存器,即使其标记为空,但其内容并没有改变。
FNOP
协处理器的空操作
FWAIT
使处理器处于等待状态,以便协处理器完成其操作。该指令主要用于在CPU访问被协处理器影响的内存数据之前。
表11.9 协处理器初始化的状态
控制项 值 状态含义
控制位IC
0
投影
控制位PC
10
扩展精度
控制位RC
00
最近舍入或偶数
错误屏蔽
11111
错误位关闭
忙标志
0
不忙
C3~C0
????
未定
TOP
000
堆栈栈顶设定为寄存器0
ES
0
无错误
错误位
00000
无错误
全部标记
11
空
寄存器
--
不改变