我使用一下代码运行的时候老是出现问题,
local @dwTemp:DWORD
local @dwCounter
pushad
mov ecx,1
mov @dwCounter,1
push _pMd5T
pop edi
@@:
fild qwMd5Const
fild @dwCounter
fsin
fabs
fmul
fist @dwTemp
mov eax,@dwTemp
stosd
push ecx
; invoke LoadLibrary,offset szMsvcrt
; invoke GetProcAddress,eax,offset szFun
; mov printfunc,eax
; invoke printfunc,offset szResult,offset szFormatMd5,@dwTemp
; invoke MessageBox,NULL,offset szResult,offset szResult,MB_OK
inc @dwCounter
pop ecx
loop @b
popad
xor eax,eax
inc eax
注释部分是为了观察结果。
其中常数qwMd5Const我定义的是100000000h,也就是一个双字能存储的最大值+1,用QWORD存储,但是我用这个数qwMd5Const*(abs(sin(1)))的时候,求的的结果不正确,主要步骤是
fild 那个大数
fild 常数1
fsin
fabs
fmul
以上我调试的时候都是正确的
但是我使用
fist @dwTemp,将计算结果存入一个双字的局部变量里面就出错了。3614090360.xxxx这是计算完寄存器st(0)的值,但是fist之后,@dwTemp显示的是80000000h,不知道什么原因,是指令用错了还是其他原因呢。
------解决方案--------------------------------------------------------
int3 是代码段中下面的内容进行对齐时所产生的空白空间的填充内容,也有用 nop(90h) 进行填充的。
四舍五入的问题,设置浮点控制字吧,RC 域为 11 是是向 0 取整。