首页
社区
课程
招聘
一道新手例题没看明白
发表于: 2011-12-16 12:13 3641

一道新手例题没看明白

2011-12-16 12:13
3641
static int a[3]={0x11,0x22,0x33};
int s=0,b[3];

for(in i=0;i<3;i++)
{
  s+=a[i];
 b[i]=s;
}

sub esp,0c
xor ecx,ecx
xor eax,eax
push esi
push edi
mov edi,[eax+407030] ;数组基址;此行为00401009
add eax,4
add ecx,edi                   ;s+=a[i]
cmp eax,0c
mov [esp+eax+4],ecx  ;b[i]=s
jl short 00401009

执行到jl这句时eax可能的值有4和8,没有机会取0,取c不循环,结果只循环了2次不是3次?

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
个人理解:
就像do{}while();那样  在第一次cmp前已经执行了一次  所以cmp的时候只有2次成功跳
2011-12-16 13:12
0
雪    币: 403
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼上说的对
跳转是执行了两次,但是你所要做的操作赋值和求和执行了三次
这个貌似是经过发行版优化后的代码  (我是一个小白如果说错了还请大家指正
2011-12-16 13:15
0
雪    币: 517
活跃值: (35)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
i 已经取过0了:

sub esp,0c
xor ecx,ecx ; s = 0
xor eax,eax ; i = 0
push esi
push edi
mov edi,[eax+407030] ;数组基址;此行为00401009
add eax,4 ; i++
add ecx,edi ;s+=a
cmp eax,0c ; i < 3?
mov [esp+eax+4],ecx ;b=s
jl short 00401009
2011-12-16 13:48
0
雪    币: 434
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
mov edi,[eax+407030] (第一次 此处eax为0)
add eax,4 (虽然eax加4)
add ecx,edi  (但是此时edi是eax为0时赋给的值)
------------------------
cmp eax,0c(当eax为0c时)
mov [esp+eax+4],ecx(此处必定会被执行 eax为4 8 0c 共执行3次)
jl short 00401009
2011-12-16 13:53
0
雪    币: 120
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
疏忽了跳转前执行了一轮了,弄懂了,谢谢各位
2011-12-16 14:02
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
真是一个不错的网站
2011-12-18 21:39
0
游客
登录 | 注册 方可回帖
返回