zcc1414

博客园 首页 联系 订阅 管理

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的值为正数的话,那么符号位为0add edx,0之后 edx的值不变
如果edx的值为负数的话,那么符号位为1add 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调用方式并不一定会马上平衡栈顶,极有可能会复写传播并与其他函数一起平衡堆栈

















posted on 2013-12-16 20:40  zcc1414  阅读(189)  评论(0编辑  收藏  举报