DEBUG:
除数是2 的倍数
除数不是2 的倍数
release版本
1)除数为 2 的倍数+ 禁止调试
int a = -160; a = a / 16; printf("%d",a);
商是-10 余数也是-10的
2)除数不为2的倍数 + 正数+最快速度
#include "stdafx.h" int a = 10; int main(int argc) { printf("%d",a/3); return 0; }
流程:
10/3 = 10* (2^n /(3*2^n)) = 10 * (2^n/3) * (1/2^n)
(2^n/3) = 幻数
然后将eax向右移动1F位(31位),那么此时eax只剩下一个原来的符号位的值了
然后将这个原符号位的值加上edx,就是说:
如果edx的值为正数的话,那么符号位为0,add
edx,0之后 edx的值不变
如果edx的值为负数的话,那么符号位为1,add
edx,-1之后 edx的值 +1
学习参考:
http://www.cppblog.com/huyutian/articles/124742.html
http://blog.sina.com.cn/s/blog_62d718780100mqmm.html
最后结果怎么除数 = 2^找出移动多少位N / 幻数
3)除数不为2的倍数 +负数+最快速度
#include "stdafx.h" int a = -10; int main(int argc) { printf("%d",a/3); return 0; }
那么 100000000 /0x55555556 = 2
+1 就是 3 所以除数为3
4)除数不为2的倍数 +无符号被除数数+最快速度 难度+1
4)除数不为2的倍数 +有符号被除数数+最快速度 难度+1
浮点指令DEBUG:
1)
2)
取模运算 % RELEASE
最快速度 除数为 2 的幂
#include "stdafx.h" int main(int argc, char* argv[]) { printf("%d",argc%2); return 0; }0x80000001 为
10000000000000000000000000000001
后面是1位 那么 1 代入 2^k 为2 那么就是 %2
最快速度 除数为 -2 的幂
and eax,0x1
看到这里 就是 %2
条件表达式:
1)
2)
3)printf("%d",argc <= 8?5:10); release 最快速度
4) printf("%d",argc >= 8?5:10); release 最快速度
__FASTCALL 调用方式
release 版本下 =
在 编译器 O2 选项下 _cdecl调用方式并不一定会马上平衡栈顶,极有可能会复写传播并与其他函数一起平衡堆栈