;以上指令都是80387的浮点指令
FADDP ST(1),ST;为浮点操作数相加,如果不规定操作数,则隐指ST(1)+ST,结果放入栈顶,若指给出一个操作数op1,则隐指ST+op1,结果放入栈顶。若给出了两个操作数,便执行op1+op2,结果放入op1(ST或ST(n)).如果op1为内存操作数(字整数或短整数,短实数或长实数),在它参与任何操作之前,自动转换成内部的临时实型数格式。无任何操作数的FADD,FADDP可令栈顶弹出。所以,无操作数的FADD,与FADDP ST(1),ST同义。
相关指令:
FADD 
FADD op1
FIADD op1
FADDP op1,op2
FADD op1,op2其它指令类似。
btw:我这里有一份8086-80486的指令集,但没有类似上述指令的浮点指令。
如果要的话留下email

解决方案 »

  1.   

    谢谢SuperYayv(蠹书虫) ,
    该段程序的出处原始代码为:a,b,c,d是4个全局Double变量
    function Eval:Double
    begin
      b := a*b+c*d;
      asm
        FMULP ST(1), ST 
        FDIVP ST(1), ST 
        FADDP ST(1), ST 
        FSUBP ST(1), ST 
      end;
      Result := a+b;
    end;我还有一些不明白的地方,请指点:
    ST是什么?? 寄存器吗? ST(1) 和 ST有什么不一样??
    ST如果是寄存器,那里面的数据是哪里来的?
    如何给出操作数? 上面的代码中算给出了吗??
    我用Turbo Debugger 看了一下上面的Eval函数代码用Delphi编译后生成的汇编代
    码如下:
    //eval:begin
    add  esp,FFFFFFF8
    // b:=a*b+c*d 
    fld  qword ptr[004407E8]
    fmul qword ptr[004407F0]
    fld  qword ptr[004407F8]
    fmul qword ptr[00440800]
    faddp st(1),st
    fstp qword ptr[004407F0]
    wait
    //然后下面接着就是前面给出的代码
    fmulp st(1),st
    fdivp st(1),st
    faddp st(1),st
    fsubp st(1),st
    //result:=a+b
    fld  qword ptr[004407E8]
    fadd qword ptr[004407F0]
    fstp qword ptr[esp]
    wait
    fld qword ptr[esp]
    pop ecx
    pop edx
    ret能帮我逐句注释一下吗? 我在汇编方面是菜鸟,几年没接触了,当初对于浮点操作的
    也没学过,麻烦你了,SuperYayv(蠹书虫) 大侠  :)
      

  2.   

    80387指令都用栈顶作为操作数,其中ST指栈顶,ST(i)指从栈顶第n个栈元素。ST=ST(0)
      

  3.   

    //eval:begin
    add  esp,FFFFFFF8  ;调整堆栈指针 esp <- esp - 8,确保栈顶为参数
    // b:=a*b+c*d 
    fld  qword ptr[004407E8]
    ;装入64位实数,实际是先转换为80位实数再压入栈
    fmul qword ptr[004407F0]
    ;实数乘,ST(1)*ST(0),两操作数弹出,结果压入栈顶
    fld  qword ptr[004407F8]
    ;装入64位实数,实际是先转换为80位实数再压入栈
    fmul qword ptr[00440800]
    ;同上
    faddp st(1),st
    ;两操作数出栈,相加,结果压入栈
    fstp qword ptr[004407F0]
    ;栈顶元素弹出并存入qword ptr[004407F0],栈顶弹出按照80位实数弹出,转换後存入
    wait
    ;等待协处理器完成指令
    //然后下面接着就是前面给出的代码
    fmulp st(1),st
    ;指令结尾有p的都是先弹出后运算,再入栈
    fdivp st(1),st
    faddp st(1),st
    fsubp st(1),st
    //result:=a+b
    fld  qword ptr[004407E8]
    ;这里不用再解释了吧
    fadd qword ptr[004407F0]
    ;:-)
    fstp qword ptr[esp]
    ;都一样的
    wait
    ;也说过了
    fld qword ptr[esp]
    ;自己看看也会明白的
    pop ecx
    pop edx
    ret
    ;到这里就结束了btw:其实我算不上什么大虾,我也刚开始学ASM