汇编指令学习_浮点数指令
1. 简介
浮点数的操作指令与普通数据类型不同, 浮点数操作是通过浮点寄存器来实现的, 而普通数据类型使用的是通用寄存器,他们分别使用两套不同的指令
浮点寄存器是通过栈结构来实现的, 共八个栈空间组成, 每个浮点寄存器站8字节.每次使用浮点寄存器都是率先使用ST(0), 而不能越过ST(0)直接使用ST(1). 浮点寄存器的使用就是压栈。出栈的过程.当ST(0)存在数据时, 执行压栈操作后,ST(0)中的数据将装入ST(1), 如无出栈操作,将顺序地向下压栈,知道将浮点寄存器出栈。
2. 指令列表
3. 实例
float数2.0的IEEE表示
表示成二进制: 10.0
右移一位 为1.00
0 01111111 000000000000000000000000 ;指数为01111111 表示为0
加上移动的位数1
0 10000000 000000000000000000000000 ; 这就是float的IEEE表示法
结果为40 00 00 00
1: #include <stdio.h> 2: 3: int main(int count, char** argv) {
4: float fFloat = (float)count;
5: printf("%f\n", fFloat);
6: 7: float fFloat1 = 2.0;
8: float fFloat2 = 1.0;
9: 10: float fFloat3 = fFloat1 - fFloat2;
11: printf("%f\n", fFloat3);
12: 13: getchar();14: return 0;
15: }
1: #include <stdio.h> 2: 3: int main(int count, char** argv) {
4: 00EA13B0 push ebp 5: 00EA13B1 mov ebp,esp 6: 00EA13B3 sub esp,0F0h 7: 00EA13B9 push ebx 8: 00EA13BA push esi 9: 00EA13BB push edi 10: 00EA13BC lea edi,[ebp-0F0h] 11: 00EA13C2 mov ecx,3Ch 12: 00EA13C7 mov eax,0CCCCCCCCh 13: 00EA13CC rep stos dword ptr es:[edi] 14: float fFloat = (float)count;
15: 00EA13CE fild dword ptr [count] 16: 00EA13D1 fstp dword ptr [fFloat] 17: printf("%f\n", fFloat);
18: 00EA13D4 fld dword ptr [fFloat] 19: 00EA13D7 mov esi,esp 20: 00EA13D9 sub esp,8 21: 00EA13DC fstp qword ptr [esp] 22: 00EA13DF push offset string "%f\n" (0EA5744h)
23: 00EA13E4 call dword ptr [__imp__printf (0EA82BCh)] 24: 00EA13EA add esp,0Ch 25: 00EA13ED cmp esi,esp 26: 00EA13EF call @ILT+310(__RTC_CheckEsp) (0EA113Bh) 27: 28: float fFloat1 = 2.0;
29: 00EA13F4 fld dword ptr [__real@40000000 (0EA5740h)] 30: 00EA13FA fstp dword ptr [fFloat1] 31: float fFloat2 = 1.0;
32: 00EA13FD fld1 33: 00EA13FF fstp dword ptr [fFloat2] 34: 35: float fFloat3 = fFloat1 - fFloat2;
36: 00EA1402 fld dword ptr [fFloat1] 37: 00EA1405 fsub dword ptr [fFloat2] 38: 00EA1408 fstp dword ptr [fFloat3] 39: printf("%f\n", fFloat3);
40: 00EA140B fld dword ptr [fFloat3] 41: 00EA140E mov esi,esp 42: 00EA1410 sub esp,8 43: 00EA1413 fstp qword ptr [esp] 44: 00EA1416 push offset string "%f\n" (0EA5744h)
45: 00EA141B call dword ptr [__imp__printf (0EA82BCh)] 46: 00EA1421 add esp,0Ch 47: 00EA1424 cmp esi,esp 48: 00EA1426 call @ILT+310(__RTC_CheckEsp) (0EA113Bh) 49: 50: getchar(); 51: 00EA142B mov esi,esp 52: 00EA142D call dword ptr [__imp__getchar (0EA82C4h)] 53: 00EA1433 cmp esi,esp 54: 00EA1435 call @ILT+310(__RTC_CheckEsp) (0EA113Bh) 55: return 0;
56: 00EA143A xor eax,eax 57: } 58: 00EA143C pop edi 59: 00EA143D pop esi 60: 00EA143E pop ebx 61: 00EA143F add esp,0F0h 62: 00EA1445 cmp ebp,esp 63: 00EA1447 call @ILT+310(__RTC_CheckEsp) (0EA113Bh) 64: 00EA144C mov esp,ebp 65: 00EA144E pop ebp 66: 00EA144F ret



浙公网安备 33010602011771号