请教一个初级问题,大家别不好意思回答哦

hugeant 2002-03-11 12:50:18
我在一端Delphi的内镶汇编代码中看到下面的语句,估计和协处理器相关,不知道什么意
思,谁能给逐句解释一下:
FMULP ST(1), ST
FDIVP ST(1), ST
FADDP ST(1), ST
FSUBP ST(1), ST
BTW : 谁能给一份协处理器操作的汇编的指令介绍??
...全文
105 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yayv 2002-03-15
  • 打赏
  • 举报
回复
//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
SuperYayv 2002-03-14
  • 打赏
  • 举报
回复
80387指令都用栈顶作为操作数,其中ST指栈顶,ST(i)指从栈顶第n个栈元素。ST=ST(0)
natureshuo 2002-03-11
  • 打赏
  • 举报
回复
g z
hugeant 2002-03-11
  • 打赏
  • 举报
回复
谢谢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(蠹书虫) 大侠 :)
SuperYayv 2002-03-11
  • 打赏
  • 举报
回复
;以上指令都是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,649

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧