兴化400生活网

标题: 加密与解密(连载4) [打印本页]

作者: 电脑白痴    时间: 2004-8-25 22:12
标题: 加密与解密(连载4)
第2章 基础知识 <br><br><br><br>第一节 软件保护 第二节 汇编语言 第三节 汇编跳转 第四节 浮点指令 第五节 分析技术 <br><br><br><br>第四节 浮点指令<br><br><br><br>  对下面的指令先做一些说明: <br><br>st(i):代表浮点寄存器,所说的出栈、入栈操作都是对st(i)的影响 <br><br>src,dst,dest,op等都是指指令的操作数,src表示源操作数,dst/dest表示目的操作数 <br><br>mem8,mem16,mem32,mem64,mem80等表示是内存操作数,后面的数值表示该操作数的内存位数(8位为一字节) <br><br>x &lt;- y 表示将y的值放入x,例st(0) &lt;- st(0) - st(1)表示将st(0)-st(1)的值放入浮点寄存器st(0) <br><br><br><br>1. &nbsp;数据传递和对常量的操作指令<br><br><br><br>指令格式<br>&nbsp;指令含义<br>&nbsp;执行的操作<br>&nbsp;<br><br>FLD src<br>&nbsp;装入实数到st(0)<br>&nbsp;st(0) &lt;- src (mem32/mem64/mem80) <br>&nbsp;<br><br>FILD src<br>&nbsp;装入整数到st(0) <br>&nbsp;st(0) &lt;- src (mem16/mem32/mem64)<br>&nbsp;<br><br>FBLD src &nbsp;<br>&nbsp;装入BCD数到st(0)<br>&nbsp;st(0) &lt;- src (mem80)<br>&nbsp;<br>&nbsp; <br>&nbsp;<br><br>FLDZ<br>&nbsp;将0.0装入st(0)<br>&nbsp;st(0) &lt;- 0.0 <br>&nbsp;<br><br>FLD1<br>&nbsp;将1.0装入st(0)<br>&nbsp;st(0) &lt;- 1.0 <br>&nbsp;<br><br>FLDPI<br>&nbsp;将pi装入st(0)<br>&nbsp;st(0) &lt;- ?(ie, pi)<br>&nbsp;<br><br>FLDL2T<br>&nbsp;将log2(10)装入st(0)<br>&nbsp;st(0) &lt;- log2(10)<br>&nbsp;<br><br>FLDL2E<br>&nbsp;将log2(e)装入st(0)<br>&nbsp;st(0) &lt;- log2(e)<br>&nbsp;<br><br>FLDLG2<br>&nbsp;将log10(2)装入st(0)<br>&nbsp;st(0) &lt;- log10(2)<br>&nbsp;<br><br>FLDLN2<br>&nbsp;将loge(2)装入st(0)<br>&nbsp;st(0) &lt;- loge(2)<br>&nbsp;<br>&nbsp; <br>&nbsp;<br><br>FST dest<br>&nbsp;保存实数st(0)到dest<br>&nbsp;dest &lt;- st(0) (mem32/mem64)<br>&nbsp;<br><br>FSTP dest<br>&nbsp; &nbsp;<br>&nbsp;dest &lt;- st(0) (mem32/mem64/mem80);然后再执行一次出栈操作<br>&nbsp;<br><br>FIST dest<br>&nbsp;将st(0)以整数保存到dest<br>&nbsp;dest &lt;- st(0) (mem32/mem64) <br>&nbsp;<br><br>FISTP dest<br>&nbsp; &nbsp;<br>&nbsp;dest &lt;- st(0) (mem16/mem32/mem64);然后再执行一次出栈操作<br>&nbsp;<br><br>FBST dest<br>&nbsp;将st(0)以BCD保存到dest<br>&nbsp;dest &lt;- st(0) (mem80) <br>&nbsp;<br><br>FBSTP dest &nbsp;<br>&nbsp; &nbsp;<br>&nbsp;dest&lt;- st(0) (mem80);然后再执行一次出栈操作<br>&nbsp;<br><br><br><br>2.比较指令 <br><br><br><br>指令格式<br>&nbsp;指令含义<br>&nbsp;执行的操作<br>&nbsp;<br><br>FCOM<br>&nbsp;实数比较<br>&nbsp;将标志位设置为 st(0) - st(1) 的结果标志位<br>&nbsp;<br><br>FCOM op<br>&nbsp;实数比较<br>&nbsp;将标志位设置为 st(0) - op (mem32/mem64)的结果标志位 <br>&nbsp;<br>&nbsp; <br>&nbsp;<br><br>FICOM op<br>&nbsp;和整数比较<br>&nbsp;将Flags值设置为st(0)-op 的结果op (mem16/mem32)<br>&nbsp;<br><br>FICOMP op<br>&nbsp;和整数比较<br>&nbsp;将st(0)和op比较 op(mem16/mem32)后;再执行一次出栈操作<br>&nbsp;<br>&nbsp; <br>&nbsp;<br><br>FTST &nbsp;<br>&nbsp;零检测 &nbsp;<br>&nbsp;将st(0)和0.0比较<br>&nbsp;<br><br>FUCOM st(i) &nbsp;<br>&nbsp; &nbsp;<br>&nbsp;比较st(0) 和st(i) &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; [486]<br>&nbsp;<br><br>FUCOMP st(i) &nbsp; &nbsp;&nbsp; &nbsp;<br>&nbsp; &nbsp;<br>&nbsp;比较st(0) 和st(i),并且执行一次出栈操作<br>&nbsp;<br><br>FUCOMPP st(i) &nbsp; &nbsp; <br>&nbsp; &nbsp;<br>&nbsp;比较st(0) 和st(i),并且执行两次出栈操作<br>&nbsp;<br><br>FXAM &nbsp; <br>&nbsp; &nbsp;<br>&nbsp;Examine: Eyeball st(0) (set condition codes)<br>&nbsp;<br><br><br><br>3.运算指令 <br><br><br><br>指令格式<br>&nbsp;指令含义<br>&nbsp;执行的操作<br>&nbsp;<br><br>加法<br>&nbsp;<br><br>FADD<br>&nbsp;加实数<br>&nbsp;st(0) &lt;-st(0) + st(1)<br>&nbsp;<br><br>FADD src<br>&nbsp; &nbsp;<br>&nbsp;st(0) &lt;-st(0) + src (mem32/mem64)<br>&nbsp;<br><br>FADD st(i),st<br>&nbsp; &nbsp;<br>&nbsp;st(i) &lt;- st(i) + st(0)<br>&nbsp;<br><br>FADDP st(i),st &nbsp;<br>&nbsp; &nbsp;<br>&nbsp;st(i) &lt;- st(i) + st(0);然后执行一次出栈操作<br>&nbsp;<br><br>FIADD src &nbsp; <br>&nbsp;加上一个整数<br>&nbsp;st(0) &lt;-st(0) + src (mem16/mem32)<br>&nbsp;<br><br>减法 <br>&nbsp;<br><br>FSUB<br>&nbsp;减去一个实数<br>&nbsp;st(0) &lt;- st(0) - st(1)<br>&nbsp;<br><br>FSUB src<br>&nbsp; &nbsp;<br>&nbsp;st(0) &lt;-st(0) - src (reg/mem)<br>&nbsp;<br><br>FSUB st(i),st<br>&nbsp; &nbsp;<br>&nbsp;st(i) &lt;-st(i) - st(0)<br>&nbsp;<br><br>FSUBP st(i),st<br>&nbsp; &nbsp;<br>&nbsp;st(i) &lt;-st(i) - st(0),然后执行一次出栈操作<br>&nbsp;<br><br>FSUBR st(i),st<br>&nbsp;用一个实数来减<br>&nbsp;st(0) &lt;- st(i) - st(0)<br>&nbsp;<br><br>FSUBRP st(i),st<br>&nbsp; &nbsp;<br>&nbsp;st(0) &lt;- st(i) - st(0),然后执行一次出栈操作<br>&nbsp;<br><br>FISUB src<br>&nbsp;减去一个整数<br>&nbsp;st(0) &lt;- st(0) - src (mem16/mem32)<br>&nbsp;<br><br>FISUBR src<br>&nbsp;用一个整数来减<br>&nbsp;st(0) &lt;- src - st(0) (mem16/mem32)<br>&nbsp;<br><br>乘法 <br>&nbsp;<br><br>FMUL<br>&nbsp;乘上一个实数<br>&nbsp;st(0) &lt;- st(0) * st(1)<br>&nbsp;<br><br>FMUL st(i)<br>&nbsp; &nbsp;<br>&nbsp;st(0) &lt;- st(0) * st(i)<br>&nbsp;<br><br>FMUL st(i),st<br>&nbsp; &nbsp;<br>&nbsp;st(i) &lt;- st(0) * st(i)<br>&nbsp;<br><br>FMULP st(i),st<br>&nbsp; &nbsp;<br>&nbsp;st(i) &lt;- st(0) * st(i),然后执行一次出栈操作<br>&nbsp;<br><br>FIMUL src<br>&nbsp;乘上一个整数<br>&nbsp;st(0) &lt;- st(0) * src (mem16/mem32)<br>&nbsp;<br><br>除法 <br>&nbsp;<br><br>FDIV &nbsp;<br>&nbsp;除以一个实数<br>&nbsp;st(0) &lt;-st(0) /st(1)<br>&nbsp;<br><br>FDIV st(i)<br>&nbsp; &nbsp;<br>&nbsp;st(0) &lt;- st(0) /t(i)<br>&nbsp;<br><br>FDIV st(i),st<br>&nbsp; &nbsp;<br>&nbsp;st(i) &lt;-st(0) /st(i)<br>&nbsp;<br><br>FDIVP st(i),st<br>&nbsp; &nbsp;<br>&nbsp;st(i) &lt;-st(0) /st(i),然后执行一次出栈操作 <br>&nbsp;<br><br>FIDIV src &nbsp;<br>&nbsp;除以一个整数<br>&nbsp;st(0) &lt;- st(0) /src (mem16/mem32)<br>&nbsp;<br><br>FDIVR st(i),st<br>&nbsp;用实数除<br>&nbsp;st(0) &lt;- st(i) /st(0)<br>&nbsp;<br><br>FDIVRP st(i),st<br>&nbsp; &nbsp;<br>&nbsp;FDIVRP st(i),st<br>&nbsp;<br><br>FIDIVR src &nbsp;<br>&nbsp;用整数除<br>&nbsp;st(0) &lt;- src /st(0) (mem16/mem32)<br>&nbsp;<br>&nbsp; <br>&nbsp;<br><br>FSQRT<br>&nbsp;平方根<br>&nbsp;st(0) &lt;- sqrt st(0)<br>&nbsp;<br>&nbsp; <br>&nbsp;<br><br>FSCALE<br>&nbsp;2的st(0)次方<br>&nbsp;st(0) &lt;- 2 ^ st(0)<br>&nbsp;<br><br>FXTRACT<br>&nbsp;Extract exponent:<br>&nbsp;st(0) &lt;-exponent of st(0); and gets pushed <br><br><br><br>st(0) &lt;-significand of st(0) <br>&nbsp;<br>&nbsp; <br>&nbsp;<br><br>FPREM &nbsp;<br>&nbsp;取余数<br>&nbsp;st(0) &lt;-st(0) MOD st(1)<br>&nbsp;<br><br>FPREM1<br>&nbsp;取余数(IEEE),同FPREM,但是使用IEEE标准[486]<br>&nbsp;<br>&nbsp; <br>&nbsp; &nbsp;<br>&nbsp; &nbsp;<br>&nbsp;<br><br>FRNDINT &nbsp;<br>&nbsp;取整(四舍五入)<br>&nbsp;st(0) &lt;- INT( st(0) ); depends on RC flag<br>&nbsp;<br>&nbsp; <br>&nbsp;<br><br>FABS<br>&nbsp;求绝对值<br>&nbsp;st(0) &lt;- ABS( st(0) ); removes sign<br>&nbsp;<br><br>FCHS<br>&nbsp;改变符号位(求负数)<br>&nbsp;st(0) &lt;-st(0)<br>&nbsp;<br>&nbsp; <br>&nbsp;<br><br>F2XM1<br>&nbsp;计算(2 ^ x)-1<br>&nbsp; st(0) &lt;- (2 ^ st(0)) - 1<br>&nbsp;<br><br>FYL2X &nbsp; <br>&nbsp;计算Y * log2(X)<br>&nbsp;st(0)为Y;st(1)为X;将st(0)和st(1)变为st(0) * log2( st(1) )的值<br>&nbsp;<br>&nbsp; <br>&nbsp;<br><br>FCOS<br>&nbsp;余弦函数Cos<br>&nbsp;st(0) &lt;- COS( st(0) )<br>&nbsp;<br><br>FPTAN<br>&nbsp;正切函数tan<br>&nbsp;st(0) &lt;- TAN( st(0) )<br>&nbsp;<br><br>FPATAN<br>&nbsp;反正切函数arctan<br>&nbsp;st(0) &lt;- ATAN( st(0) )<br>&nbsp;<br><br>FSIN<br>&nbsp;正弦函数sin<br>&nbsp;st(0) &lt;- SIN( st(0) )<br>&nbsp;<br><br>FSINCOS<br>&nbsp;sincos函数<br>&nbsp;st(0) &lt;-SIN( st(0) ),并且压入st(1)<br><br><br><br>st(0) &lt;- COS( st(0) )<br>&nbsp;<br>&nbsp; <br>&nbsp; &nbsp;<br>&nbsp; &nbsp;<br>&nbsp;<br><br>FYL2XP1 &nbsp;<br>&nbsp;计算Y * log2(X+1)<br>&nbsp;st(0)为Y; st(1)为X; 将st(0)和st(1)变为st(0) * log2( st(1)+1 )的值 <br>&nbsp;<br><br>处理器控制指令<br>&nbsp;<br><br>FINIT<br>&nbsp;初始化FPU<br>&nbsp; &nbsp;<br>&nbsp;<br><br>FSTSW AX<br>&nbsp;保存状态字的值到AX<br>&nbsp;AX&lt;- MSW<br>&nbsp;<br><br>FSTSW dest<br>&nbsp;保存状态字的值到dest<br>&nbsp;dest&lt;-MSW (mem16)<br>&nbsp;<br>&nbsp; <br>&nbsp; &nbsp;<br>&nbsp; &nbsp;<br>&nbsp;<br><br>FLDCW src<br>&nbsp;从src装入FPU的控制字<br>&nbsp;FPU CW &lt;-src (mem16)<br>&nbsp;<br><br>FSTCW dest<br>&nbsp;将FPU的控制字保存到dest<br>&nbsp;dest&lt;- FPU CW<br>&nbsp;<br>&nbsp; <br>&nbsp; &nbsp;<br>&nbsp; &nbsp;<br>&nbsp;<br><br>FCLEX &nbsp;<br>&nbsp;清除异常<br>&nbsp; &nbsp;<br>&nbsp;<br>&nbsp; <br>&nbsp; &nbsp;<br>&nbsp; &nbsp;<br>&nbsp;<br><br>FSTENV dest<br>&nbsp;保存环境到内存地址dest处 保存状态字、控制字、标志字和异常指针的值<br>&nbsp;<br><br>FLDENV src<br>&nbsp;从内存地址src处装入保存的环境<br>&nbsp; &nbsp;<br>&nbsp;<br><br>FSAVE dest<br>&nbsp;保存FPU的状态到dest处 94字节<br>&nbsp; &nbsp;<br>&nbsp;<br><br>FRSTOR src<br>&nbsp;从src处装入由FSAVE保存的FPU状态<br>&nbsp; &nbsp;<br>&nbsp;<br>&nbsp; <br>&nbsp; &nbsp;<br>&nbsp; &nbsp;<br>&nbsp;<br><br>FINCSTP<br>&nbsp;增加FPU的栈指针值<br>&nbsp;st(6) &lt;-st(5); st(5) &lt;-st(4),...,st(0) &lt;-?<br>&nbsp;<br><br>FDECSTP<br>&nbsp;减少FPU的栈指针值<br>&nbsp;st(0) &lt;-st(1); st(1) &lt;-st(2),...,st(7) &lt;-? <br>&nbsp;<br>&nbsp; <br>&nbsp; &nbsp;<br>&nbsp; &nbsp;<br>&nbsp;<br><br>FFREE st(i)<br>&nbsp;标志寄存器st(i)未被使用<br>&nbsp; &nbsp;<br>&nbsp;<br>&nbsp; <br>&nbsp; &nbsp;<br>&nbsp; &nbsp;<br>&nbsp;<br><br>FNOP &nbsp;<br>&nbsp;空操作,等同CPU的nop<br>&nbsp;st(0) &lt;-st(0)<br>&nbsp;<br><br>WAIT/FWAIT<br>&nbsp;同步FPU与CPU:停止CPU的运行,直到FPU完成当前操作码<br>&nbsp;<br>&nbsp; <br>&nbsp;<br><br>FXCH<br>&nbsp;交换指令,交换st(0)和st(1)的值<br>&nbsp;st(0) &lt;-st(1) <br><br><br><br>st(1) &lt;- st(0)<br><br>




欢迎光临 兴化400生活网 (http://wenhui.vc7.cc/) Powered by Discuz! X2.5