能力值:
( LV2,RANK:10 )
351 楼
木有VC6.0,只有VS2K3,所以。。。。
#include <stdio.h>
unsigned long AddEx(unsigned long first,...){
unsigned long res=first,*next=(&first)+1;
while(res&&*next){//Break if first==0 or res is overflow
res+=*(next++);
}
return res;
}
int main(){
printf("%lu\n",AddEx(1,2,3,0));
printf("%lu\n",AddEx(1,2,0));
printf("%lu\n",AddEx(1,0));
printf("%lu\n",AddEx(0));
}
能力值:
( LV2,RANK:10 )
352 楼
看了看前面有人做出来的,发现可能真的是题目不一样还是怎么的,有一些不一样。
第一题,我的分析
main中
push ecx或sub esp,4或sub esp,xx,xx=4K,k>1
其中&m==esp
然后call test,
ret_addr,push ebp,共两个DWORD,共8个bytes,
然后push ecx或者sub esp,4,那么
((DWORD)&t)+12就指向m
所以我写的是*((int *)(((unsigned long)&t)+0xc))=t;
也许还因为我没有VC6.0,拿的是VS2K3做测试,还有不一样吧。
上传的附件:
能力值:
( LV2,RANK:10 )
353 楼
还有就是觉得拿汇编做的,感觉很搓,碰到个不支持内联汇编的编译器就编译不通过了。
题目说的是测试C语言能力,不是汇编语言能力。。。。
能力值:
( LV2,RANK:10 )
354 楼
武汉的朋友有服气!
看了,不明白!
能力值:
( LV2,RANK:10 )
355 楼
产出好多精华贴啊,给看雪也带来很多资源,顶~!
能力值:
( LV2,RANK:10 )
356 楼
很想报名参加学习,
就是不知道是否可以通过网络学习?
能力值:
( LV2,RANK:10 )
357 楼
好厉害,呵呵。先恭喜下了!
能力值:
( LV2,RANK:10 )
358 楼
我在上海哦 想参加培训。。 学习。。。。555
能力值:
( LV2,RANK:10 )
359 楼
费用很高吗??????学业只是初中的可以学习吗?
难学吗??????
能力值:
( LV2,RANK:10 )
360 楼
我没有一点基础
能力值:
( LV2,RANK:10 )
361 楼
支持楼主,祝您成功!
能力值:
( LV4,RANK:50 )
362 楼
现在还能报名吗? 我可以从第2或者3阶段学
能力值:
( LV2,RANK:10 )
363 楼
支持楼主为祖国石化培养新人
能力值:
( LV2,RANK:10 )
364 楼
不说什么
来帮忙顶下
能力值:
( LV2,RANK:10 )
365 楼
我去过。做过一份题目。
能力值:
( LV2,RANK:10 )
366 楼
看技术,很强,呵呵,祝楼主越办越好,支持
能力值:
( LV9,RANK:210 )
367 楼
有网上远程授课吗? 想去 但路太远
能力值:
( LV2,RANK:10 )
368 楼
啊,武汉真的有这方面的培训吗?太好了,不知道学费贵不贵哦
能力值:
( LV2,RANK:10 )
369 楼
i=0
name[10]={1,2,3,4,5,6,7,8,9,10}
栈中情况
EBP-2C 1 NAME[0]
EBP-28 2 NAME[1]
EBP-24 3 NAME[2]
EBP-20 4 NAME[3]
EBP-1C 5 NAME[4]
EBP-18 6 NAME[5]
EBP-14 7 NAME[6]
EBP-10 8 NAME[7]
EBP-0C 9 NAME[8] /*这里好象是从右到左,数组10个元素*10*4/
EBP-8 0ah NAME[9] 10
EBP-4 i=0 /*[ EBP-4]这里就是放的i
i<=10 /*是要放11个元素NAME数组了什么办呢
看下面
I=0
i++
ECX,[EBP-4]/*ecx里放的是I的递增量*/
name[i]=0
ebp-2c+ecx*4,0/*这就是把0放到的单元里的地址EBP-2C+0*4这样写是为了更明白本来是EBP+ECX*4-2C
要是递增到1那就是EBP-2C+1*4了
最后那第11个0就放到了EBP-4里去了
就是这样
哎还是学习要深入才能不一字半解,不过这也让我明白了该如何学程序了,谢谢出题者谢了
能力值:
( LV2,RANK:10 )
370 楼
name[i]=0
ebp-2c+ecx*4,0/*这就是把0放到的单元里的地址EBP-2C+0*4这样写是为了更明白本来是EBP+ECX*4-2C
要是递增到1那就是EBP-2C+1*4了
这样写有的烦/改成 2C-ECX*4 当ECX =0 那就是2C里放第一个0 当I++ 是ECX=1
2C-1*4=28 第2个0放到了28大家可以看上面下面的就自己看了OK
能力值:
( LV2,RANK:10 )
371 楼
真想去学啊,就是没钱
能力值:
( LV2,RANK:10 )
372 楼
如果那位先分析写出来,谢了反正有空就在做下吧哎又要用到汇编调试了VC++才知道强大哎
能力值:
( LV2,RANK:10 )
373 楼
Main()起的情况
push ebp /*假设 EBP是1000 ESP 3000
Mov ebp, esp / 这条指令下移了4*EBP=ESP=2996 ESP 2996
SUB ESP ,40 /*2996-40=2956 ESP 2956
CALL TEST()时 /*esp=2952跳了 4个字节 EBP=2996
TEST()调用情况
push ebp /* EBP是2996保存上一个EBP ESP 2952
Mov ebp, esp /*EBP=ESP=2948 ESP 2948
SUB ESP ,40 /*2948-40=2908 ESP 2908
_asm
esp+?=2996 esp 2908/*要加88
push t=[ebp-4]
sub esp, a4 /* 上面加了 下面就要减不管什么变化总的还是要最后还原成 2948 再加上48 POP EBP ESP POP EBP(2996)
没想到栈是这样递减的 好象就是这样调用 ESP EBP 返回上一级的 ESP EBP数
这样的资料学起来就是好 自学苦啊 还是到武汉去算了这样快些
能力值:
( LV12,RANK:210 )
374 楼
void test()
{
int t;
scanf("%d", &t);
_asm
{
add esp, 0xA8
push t
sub esp, 0xA4
}
}
void main()
{
int m;
test();
printf("m=%d", m);
}为什么是这样呢?
能力值:
( LV2,RANK:10 )
375 楼
当然这里有人不用汇编写了段C,其实也是看了汇编再写的C代码,他要是不调试汇编我看也写不出来C代码