-
-
[旧帖] [原创]关于取模运算的一点小发现 0.00雪花
-
发表于: 2007-12-30 10:01 4489
-
本人菜鸟一只,早上按惯例阅读反汇编代码进行晨练,测试环境是VC++6.0,测试到取模运算时发现了一个很有趣的现象,当余数为1或者2的时候(0没有意义)取余运算的反汇编代码如下
00401058 mov edx,dword ptr [ebp-4]
0040105B add edx,dword ptr [ebp-8]
0040105E and edx,80000001h
00401064 jns main+5Bh (0040106b)
00401066 dec edx
00401067 or edx,0FEh
0040106A inc edx
0040106B test edx,edx
0040106D jne main+78h (00401088)
当大于2的时候如下:
00401058 mov eax,dword ptr [ebp-4]
0040105B add eax,dword ptr [ebp-8]
0040105E cdq
0040105F mov ecx,5
00401064 idiv eax,ecx
00401066 test edx,edx
00401068 jne main+73h (00401083)
测试原代码如下:
#include "stdio.h"
main()
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
if((i+j)%1==0)
printf("%c%c",219,219);
else
printf(" ");
printf("\n");
}
}
是不是很有意思啊,希望对刚入门的同学在阅读代码时有帮助,另外请教各位高人,第一段反汇编的代码我也不理解,是不是编译器优化后的代码啊,也请高人解释一下。
00401058 mov edx,dword ptr [ebp-4]
0040105B add edx,dword ptr [ebp-8]
0040105E and edx,80000001h
00401064 jns main+5Bh (0040106b)
00401066 dec edx
00401067 or edx,0FEh
0040106A inc edx
0040106B test edx,edx
0040106D jne main+78h (00401088)
当大于2的时候如下:
00401058 mov eax,dword ptr [ebp-4]
0040105B add eax,dword ptr [ebp-8]
0040105E cdq
0040105F mov ecx,5
00401064 idiv eax,ecx
00401066 test edx,edx
00401068 jne main+73h (00401083)
测试原代码如下:
#include "stdio.h"
main()
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
if((i+j)%1==0)
printf("%c%c",219,219);
else
printf(" ");
printf("\n");
}
}
是不是很有意思啊,希望对刚入门的同学在阅读代码时有帮助,另外请教各位高人,第一段反汇编的代码我也不理解,是不是编译器优化后的代码啊,也请高人解释一下。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
- [求助]定义完类找不到反汇编代码? 3062
- [原创]关于取模运算的一点小发现 4490
- [求助]请教fcom指令 4721
- [求助]破解的明天 3578
- [求助]读代码时遇到1个问题 3371
看原图
赞赏
雪币:
留言: