【问题标题】:FPU first command executionFPU第一个命令执行
【发布时间】:2020-06-04 01:34:26
【问题描述】:

我有这段代码,我们有距离 (D) 和角度 (A),函数必须返回 X, x=cosine(a)*d and Y, y=sine(a)*d

.data    
n180 word 180
d word 60
a word 10
x word 0
y word 0

.code
    fild word ptr a
    fild word ptr n180
    fdiv
    fldpi
    fmul
    fsincos
    fild word ptr d
    fmul
    fistp word ptr x
    fwait
    fxch
    fild word ptr d
    fmul
    fistp word ptr y

第一次运行程序(使用 a=10 和 d=60)我得到 X=59 e Y=-32768 这里 X 是对的,我在使用 FXCH 之前得到它,但 Y 是错误的。如果我再次运行程序然后我得到 X=59 和 Y=10 现在好了

为什么我第一次运行时收到FXCH 的错误?

【问题讨论】:

  • @KenWhite 我已经输入了英文
  • 我已经尝试过首先使用 FINIT 和 FCLEX...但没有结果...我在第二次运行程序时得到了答案
  • fistp word ptr x 弹出堆栈...你希望fxch 做什么?
  • @ChrisHall 我删除了 FXCH,它起作用了。拳头弹出ST(0),对吗?我需要正弦和余弦,我忘记了 fmul 和 fdiv 它也弹出...所以我使用 FXCH 来获取正弦和余弦,但是 FMUL 是如何弹出的,我不需要
  • 我很高兴听到它现在可以工作了 :-) 是的,ST(0) 是当前的栈顶,所以fistp 会弹出它。是的,无操作数FADDFDIVFDIVRFMULFSUBFSUBR 都弹出右手参数ST(0)。我还注意到FADDFADDP(没有操作数)都只是FADDP ST(1), ST(0)(Intel 排序)的简写,这FADD ST(1), ST(0) 相同。我还注意到,英特尔手册更喜欢 FADDP 等无操作数形式的助记符。

标签: windows assembly x86 fpu x87


【解决方案1】:

为了完整性...

... 无操作数 FADDFDIVFDIVRFMULFSUBFSUBR 都弹出右侧参数 ST(0)(所以左侧参数ST(1)被结果替换,然后出栈,结果变成ST(0))。

...所以FXCH 不是必需的。

...确实,如果没有FXCH,您的操作序列会使 FPU 寄存器堆栈保持与它开始时相同的状态(假设它在任何时候都不会溢出),这通常是一件好事。

我注意到FADDFADDP 等(没有操作数)只是FADDP ST(1), ST(0)(Intel 排序)的简写,这FADD ST(1), ST(0) 相同。我还注意到英特尔手册更喜欢FADDP 等助记符作为无操作数形式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-15
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    相关资源
    最近更新 更多