莱瑞古德 发表于 2012-6-28 10:06:40

我是师兄 发表于 2012-6-28 10:02 static/image/common/back.gif
另外还有东西不懂 (&s)就是a了吧? 底层我菜鸟 那么直接--这个 不就足够了吗 为什么还需要对s赋值!!??

测试得到- -每次调用s,位置都会变化,所以用s保存上一次结果

我是师兄 发表于 2012-6-28 10:10:12

莱瑞古德 发表于 2012-6-28 10:06 static/image/common/back.gif
测试得到- -每次调用s,位置都会变化,所以用s保存上一次结果

怎么会~~~ 处理 (&s) s的值不会有影响的啊

莱瑞古德 发表于 2012-6-28 10:14:48

本帖最后由 莱瑞古德 于 2012-6-28 10:16 编辑

我是师兄 发表于 2012-6-28 10:10 static/image/common/back.gif
怎么会~~~ 处理 (&s) s的值不会有影响的啊
回滴,每次调用s都偏移了0x58,还有貌似不应该用(&s),貌似要用0x58解释,还不能解释22从何而来然后么- -我是有叫用XP的用VC6测试过,你为什么不能通过,只能说RP

我是师兄 发表于 2012-6-28 10:20:29

有很多种可能 唯独没有RP

莱瑞古德 发表于 2012-6-28 10:24:46

收拾东西,闪人,断网去,明天看邮箱的答案。。。

我是师兄 发表于 2012-6-28 10:27:09

莱瑞古德 发表于 2012-6-28 10:14 static/image/common/back.gif
回滴,每次调用s都偏移了0x58,还有貌似不应该用(&s),貌似要用0x58解释,还不能解释22从何而来然后么 ...

我说的是 s 无法影响 &s 求破

Tzdner_C 发表于 2012-6-28 10:42:42

莱瑞古德 发表于 2012-6-28 10:14 static/image/common/back.gif
回滴,每次调用s都偏移了0x58,还有貌似不应该用(&s),貌似要用0x58解释,还不能解释22从何而来然后么 ...

他那个 22是直接用的两个变量的偏移量算出来的 然后用数组表示了一下、 跟你的差不多。的 数组很多时候都可以当做指针来用的   没什么稀奇的

我是师兄 发表于 2012-6-28 10:46:00

Tzdner_C 发表于 2012-6-28 10:42 static/image/common/back.gif
他那个 22是直接用的两个变量的偏移量算出来的 然后用数组表示了一下、 跟你的差不多。的 数组很多时候都 ...

还是没理解那个赋值是不是多余的

小王子之歌 发表于 2012-6-28 12:15:58

这个问题是纠结了...汇编倒好解决...关注这个问题...

Tzdner_C 发表于 2012-6-28 12:39:43

我是师兄 发表于 2012-6-28 10:46 static/image/common/back.gif
还是没理解那个赋值是不是多余的

若你调试没有问题的话,去调试一下,那个赋值没有任何问题,必须赋值,因为那是个递归函数,每一次调用内存空间都会释放,原来的值将不复存在,若哪里没有赋值,照样是死循环。。。

Tzdner_C 发表于 2012-6-28 12:45:38

仰望天上的光 发表于 2012-6-28 10:02 static/image/common/back.gif
你还没告诉我win32汇编对应的机器码有什么好的工具来查?

我有inter白皮书,要的话可以给你一份。。。我没学过32位汇编,我学汇编都是学的指令,只是为了看反汇编代码,inter白皮书上对指令的编码有好几个图,很全的。。。不过这个题目跟机器码没有关系,因为函数没有传参所以不存在add esp,XX这样的

Tzdner_C 发表于 2012-6-28 12:51:16

仰望天上的光 发表于 2012-6-28 10:02 static/image/common/back.gif
你还没告诉我win32汇编对应的机器码有什么好的工具来查?

靠。。这坑爹的网速。。。我回复了一次,竟然没发表出去,还不见了。。。   我有inter白皮书,你若有兴趣的话,我给你一份。。上面对机器码有详细的介绍。我没学过32位汇编语言。。。我学汇编就只学指令,只为了能看懂反汇编代码。。。

Tzdner_C 发表于 2012-6-28 13:26:14

void fun()
{
        int s;
        printf("hello word!\n");
        if( s = --*((int *)*(&s + 1) - 1))             //此处添加代码
        {
                fun();
        }
}
void main()
{
        int a=12345678;
        scanf("%d",&a);
        fun();
}
这个答案是VC6,0下的正确答案,由于我的VS安装存在问题,需重装,完了我会再发一份VS和VC通用的版本。。。。只是解题思想都是一样的,另外一种版本只是对于不同编译器对于变量的存储空间的一种特殊处理而已。。。

九墓 发表于 2012-6-28 13:44:03

我只能来冒冒泡

398548528 发表于 2012-6-28 16:24:17

学习学习               

wildcoder 发表于 2012-6-29 09:48:34

关注!!!!!!!!!!!!

【red_hat】田野 发表于 2012-6-29 18:29:37

学习了啊!

shadowxh 发表于 2012-6-29 19:41:32

额,来晚了,,其实罗云彬的win32汇编第3章详细讲解了函数调用约定和堆栈的情况,想不到可以用C语言的方式考察这个,开眼了

Tzdner_C 发表于 2012-6-29 20:21:02

shadowxh 发表于 2012-6-29 19:41 static/image/common/back.gif
额,来晚了,,其实罗云彬的win32汇编第3章详细讲解了函数调用约定和堆栈的情况,想不到可以用C语言的方式考 ...

汇编能实现的,C语言都基本能实现。。。

小峰爱技术 发表于 2012-6-29 21:06:04

唉,完全看不懂,果然是不行啊,求楼主及各位高手给条搞C和汇编的明路
页: 1 2 [3] 4 5
查看完整版本: 出一个题目,考验下大家。(仅限纯C语言)