我有个问题FADDP ST(0), ST(1)指令在汇编语言中有意义吗?据我所知,在这条指令中,我们将ST(0)和ST(1)相加,并将结果写入ST(0),之后ST(0)被删除。
FADDP ST(0), ST(1)
nhaq1z211#
faddp st(0), st(1)甚至不能编码成机器码。你是对的,它没有用(除了引发FP异常),这就是为什么8087的架构师没有包括faddp st(0), st(i)操作码。3 forms of fadd的操作码有一个寄存器源:
faddp st(0), st(1)
faddp st(0), st(i)
fadd
D8 C0+i
FADD ST(0), ST(i)
DC C0+i
FADD ST(i), ST(0)
DE C0+i
FADDP ST(i), ST(0)
所以faddp st(0), st(0)是可编码的,但没有用,使用faddp st(i), st(0)操作码,其中 destination 可以是任何寄存器,包括st(0)的无用情况,但源被固定为st(0)。将堆栈弹出1而不做其他任何事情的最便宜的方法是fstp st(0)。http://www.ray.masmcode.com/tutorial/fpuchap4.htm#fstp(And有关指令成本,请参阅https://agner.org/optimize/。https://uops.info/没有测试遗留x87指令,尽管它确实有一些IACA数据。如果你真的想添加一个数字并丢弃结果,例如。要在从使用整数位操作的数学库函数返回之前引发FP异常,可以使用
faddp st(0), st(0)
faddp st(i), st(0)
st(0)
fstp st(0)
; Emulate faddp st(0), st(1), e.g. for raising FP exceptions fadd st(0), st(1) fstp st(0)
1条答案
按热度按时间nhaq1z211#
faddp st(0), st(1)
甚至不能编码成机器码。你是对的,它没有用(除了引发FP异常),这就是为什么8087的架构师没有包括
faddp st(0), st(i)
操作码。3 forms offadd
的操作码有一个寄存器源:D8 C0+i
FADD ST(0), ST(i)
DC C0+i
FADD ST(i), ST(0)
DE C0+i
FADDP ST(i), ST(0)
faddp st(0), st(i)
的操作码所以
faddp st(0), st(0)
是可编码的,但没有用,使用faddp st(i), st(0)
操作码,其中 destination 可以是任何寄存器,包括st(0)
的无用情况,但源被固定为st(0)
。将堆栈弹出1而不做其他任何事情的最便宜的方法是
fstp st(0)
。http://www.ray.masmcode.com/tutorial/fpuchap4.htm#fstp(And有关指令成本,请参阅https://agner.org/optimize/。https://uops.info/没有测试遗留x87指令,尽管它确实有一些IACA数据。
如果你真的想添加一个数字并丢弃结果,例如。要在从使用整数位操作的数学库函数返回之前引发FP异常,可以使用