inter x86 浮点寄存器笔记

intel 80486 寄存器结构:基本寄存器、系统寄存器、调试测试寄存器、浮点寄存器。


基本寄存器包括八个通用寄存器EAX, EBX, ECX, EDX, EBP, ESP, EDI, ESI;一个指令指针寄存器EIP;六个段寄存器CS, DS, ES, SS, FS和GS;一个标志寄存器EFLAGS。它们都是程序可见寄存器。EAX, EBX, ECX, EDX都可以作为32位寄存器、16位寄存器或者8位寄存器使用。EAX可作为累加器用于乘法、除法及一些调整指令,对于这些指令,累加器常表现为隐含形式。EAX寄存器也可以保存被访问存储器单元的偏移地址。EBX常用于地址指针,保存被访问存储器单元的偏移地址。ECX经常用作计数器,用于保存指令的计数值。ECX寄存器也可以保存访问数据所在存储器单元的偏移地址。用于计数的指令包括重复的串指令、移位指令和循环指令。移位指令用CL计数,重复的串指令用CX计数,循环指令用CX或ECX计数。EDX常与EAX配合,用于保存乘法形成的部分结果,或者除法操作前的被除数,它还可以保存寻址存储器数据。 

指令指针寄存器EIP(extra instruction pointer)存放指令的偏移地址,EIP总是指向程序的下一条指令(即EIP的内容自动加1,指向下一个存储单元)。EIP用于微处理器在程序中顺序地寻址代码段内的下一条指令。当遇到跳转指令或调用指令时,指令指针寄存器的内容需要修改。
EBP和ESP是32位寄存器,也可作为16位寄存器BP, SP使用,常用于椎栈操作。EDI和ESI常用于串操作,EDI用于寻址目标数据串,ESI用于寻址源数据串。

调试寄存器是8个32位可编程调试寄存器DRO-DR7,其中DR0-DR3是4个断点寄存器。测试寄存器是TR0-TR7。


浮点寄存器包括8个80位的通用寄存器,两个48位寄存器(指令指针寄存器和数据指针寄存器),三个16位寄存器(控制寄存器、状态寄存器和标志寄存器)。这些寄存器主要用于浮点运算。


FPU 浮点运算器,包含8个通用寄存器等,形成一个寄存器堆栈,数据全是80bit的扩展精度,即使是BCD,整数,单精度和双精度等在装入寄存器的时候都要被FPU自动转化为80位的扩展精度格式,注意栈顶通常表示为ST(0),然后是ST(1)...ST(i),ST(i)是相对于栈顶而言的。

保存下平时经常看到的浮点数指令:


浮点数载入指令

fld   memory(real)    ; 将存储器中的实型压人堆栈

fild  memory(integer) ;将存储器的整型数值转化为浮点数并压人堆栈

fbld  memory(BCD)     ;将存储器的BCD码转化为浮点数并压人堆栈

fld    st(num)        ;将浮点型寄存器中的数值压入堆栈

fld1  (none)          ;1.0压人堆栈

fldz  (none)          ;0.0压人堆栈

fldpi (none)         ;Π(pi) 压人堆栈

fldl2e (none)         ;log2(e)压人堆栈

fldl2t (none)         ;log2(10)压人堆栈

fldlg2 (none)         ;log10(2)压人堆栈

fldln2 (none)         ;loge(2)压人堆栈

finit (none)         ; 初始化浮点型单元,并清空8个寄存器的内容


 浮点数数据存储指令

fst    st(num)         ;复制st的值来替换st(num)的内容;只有st(num)是受到影响

fstp   st(num)         ;复制st的值来替换st(num)的内容;st出栈

fst    memory(real)    ;复制st的值为实型数,存入存储器;堆栈不受影响

fstp   memory(real)    ;复制st的值为实型数,存入存储器;st出栈

fist   memory(integer) ;复制st的值,并转换为整型数存入存储器

fistp  memory(integer) ;复制st的值,并转换为整型数存入存储器;st出栈

fbstp  memory(BCD)     ;复制st的值,并转换为BCD码存入存储器;st出栈

fxch   (none)          ;互换st和st(1)

fxch   st(num)         ;互换st和st(num)


浮点型加法指令

fadd   (none)          ; 将st和st(1)出栈;将两个值相加;并将它们的和入栈

fadd   st(num),st      ;将st(num)和st相加;用和替换st(num)

fadd   st,st(num)      ;将st和st(num)相加;用和替换st

fadd   memory(real)    ; 将st和存储器中的实型数相加;用和替换st

fiadd  memory(integer) ;将st和存储器中的整型数相加,用和替换st

faddp  st(num),st      ;将st(num)和st相加,用和来替换st(num),将st出栈

 

浮点型乘法指令

fmul     (none)         ;将st和st(1)出栈;并将它们的值相乘;乘积人栈

fmul    st(num),st      ;将st(num)和st相乘;用乘积来替换st(num)

fmul    st,st(num)      ;将st和st(num)相乘;用乘积来替换st

fmul    memory(real)    ;将st和存储器中的实型数相乘;用乘积来替换st

fimul   memory(integer) ;将st和存储器中的整型数相乘,用乘积来替换st

fmulp   st(num),st      ;将st(num)和st相乘;乘积来替换st(num);并将st出栈


 浮点型减法指令

fsub  (none)          ;将st和st(1)出栈,计算st(1)减st的值;将差入栈

fsub  st(num),st      ;计算st(num)减st的值;用差值替换st(num)

fsub  st,st(num)      ;计算st减st(num)的值;用差值来替换st

fsub  memory(real)    ;计算st减存储器中的实型数的值;用差值来替换st

fisub memory(integer) ;计算st减存储器中的整型数的值;用差值替换st

fsubp st(num),st     ; 计算st(num)减st的值;用差值替换st(num);将st出栈

fsubr (none)         ;将st和st(1)出栈;计算st减st(1)的 值;将差值入栈

fsubr st(num),st     ; 计算st减st(num)的值,用差值替换st(num)

fsubr st,st(num)     ; 计算st(num)减st的值,用差值来替换st

fsubr memory(real)   ; 计算存储器中的实型数值减st的值,用差值替换st

fisubr memory(integer) ;计算存储器中的整型数值减st的值;用差值替换st

fsubrp st(num),st     ;计算st减st(num)的值,用差值替换st(num);将st出栈

 

浮点型除法指令

fdiv   (none)         ;将st和st(1)出栈;计算st(1)/st的值;并将商入栈

fdiv   st(num),st     ;计算st(num)/st的值;用商来替换st(num)

fdiv   st,st(num)     ;计算st/st(num)的值;用商来替换st

fdiv   memory(real)   ;计算st/存储器中的实型数;用商来替换st

fidiv  memory(integer);计算st/存储器中的整型数;用商来替换st

fdivp  st(num),st     ;计算st(num)/st的值;用商来替换st(num);并将st出栈

fdivr  (none)         ;将st和st(1)出栈;计算st/st(1)的值;并将商入栈

fdivr  st(num),st     ;计算st/st(num)的值;用商来替换st(num)

fdivr  st,st(num)     ;计算st(num)/st的值;用商来替换st

fdivr  memory(real)   ;计算存储器中的实型数/st;商来替换st

fidivr memory(integer);计算存储器中的整型数/st;用商来替换st

fdivrp st(num),st    ;计算st/st(num)的值,用商来替换st(num);并将st出栈


 附加的浮点型指令

fabs   (none)         ;st := |st|(绝对值)

fchs   (none)         ;st := -st(相反数)

frndint (none)        ;对st取整

fsqrt  (none)         ;用st的平方根来替换st


 浮点型比较指令

fcom   (none)          ;比较st和st(1)

fcom   st(num)         ;比较st和st(num)

fcom   memory(real)    ;比较st和存储器中的实型数

ficom  memory(integer) ;比较st和存储器中的整型数

ftst   (none)          ;比较st和0.0

fcomp  (none)          ;比较st和st(1);然后出栈

fcomp  st(num)         ;比较st和st(num);然后出栈

fcomp  memory(real)    ;比较st和存储器中的实型数;然后出栈

fcomp  memory(integer) ;比较st和存储器中的整型数;然后出栈

fcompp (none)         ;比较st和st(1);然后两次出栈

 

混 合浮点型指令

fstsw   memoryWORD     ;复制状态寄存器到存储器字

fstsw   ax              ;复制状态寄存器到ax寄存器

fstcw   memoryWORD     ;复制控制字寄存器到存储器

fldcw   memoryWORD     ;复制存储器字到控制字寄存器


你可能感兴趣的:(inter x86 浮点寄存器笔记)