;以上指令都是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
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
解决方案 »
- 紧急!高分求助--如何给状态条设置背景图
- 我们进行点有意义的讨论,"VisualC++将会被扼杀于5年之内?",呵呵...有很多人持反对的看法
- 请教 如何在VC++中将数据生成WORD文件
- 《Windows图形编程》中关于计算桢缓冲区RAM大小的问题。帮忙解答。
- 这到底是什么错误啊
- 100分求一个主板驱动程序,大哥们帮帮忙
- 分隔视图为两块,一块显示数据,一块显示波形,我该怎么做?
- 如何获取CRecordset中的记录个数????高分,,,,,救命!!!!!
- 谁知道VC里面ClassView和FileView互相切换的快捷键是什么呀?
- 在MFC在《深入浅出MFC》中关于重新注册窗口类的疑问?
- 还是问题!?
- 请问有没有地方下pl/sql的使用文档?
该段程序的出处原始代码为: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(蠹书虫) 大侠 :)
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