鱼C论坛

 找回密码
 立即注册
楼主: Tzdner_C

出一个题目,考验下大家。(仅限纯C语言)

  [复制链接]
 楼主| 发表于 2012-6-28 09:08:14 | 显示全部楼层

版主的答案跟前面一位兄弟的答案相仿。。。都是计算这个偏移。。。这个存在运行环境的问题。。。当然单纯对于这个题目,这个答案已经算是做对了。。。还有主函数里面多定义一个变量,这个答案就不对了(当然,我说了不改变代码)。我还是想等等,看到底有没有我想要的答案出现、、、
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-28 09:14:48 | 显示全部楼层
仰望天上的光 发表于 2012-6-28 09:04
这个不如帖袄汇编版.表面C是,其实是汇编的.

这就是对指针的灵活应用啊!跟汇编有什么关系呢?     这不至于扯到语言上吧。  我觉得汇编能实现的,C语言照样能实现,并且实现的更好。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-28 09:26:50 | 显示全部楼层
是要把         add         esp, 68                这句里68这个值给读出来然后再处理下把?
还是留给其它人做吧.
你上次说的,如果68这个值很大,add  esp的机器码会变化,这个机器码是怎么查的?我手上只有8086的指令.机器吗对应表.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-28 09:33:57 | 显示全部楼层
Tzdner_C 发表于 2012-6-28 09:08
版主的答案跟前面一位兄弟的答案相仿。。。都是计算这个偏移。。。这个存在运行环境的问题。。。当然单纯 ...

发出来- -就顺便发到我邮箱呗- -691310634@qq.com
事实上- -11点之后,就要出发回老家了,所以也没有时间解题了,更可怕的是- -以后,要断网两个月!!!
邮箱的话 - -手机可以看下- -

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-28 09:34:02 | 显示全部楼层

我再次死循环了~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-28 09:35:15 | 显示全部楼层
Tzdner_C 发表于 2012-6-28 09:14
这就是对指针的灵活应用啊!跟汇编有什么关系呢?     这不至于扯到语言上吧。  我觉得汇编能实现的,C语 ...

当然和语言有关系.正统C语言的使用者认为函数机制是完美无缺的,并遵照一些约定合理的使用函数.

但知道了函数底层机制后就可以利用这些机制写出不符合函数调用约定的代码.这些代码至少C语言标准里没有提到的.无非是为了熟悉底层实现机制而已.显然属于汇编,机器语言,计算机组成原理这样的范畴.

而且C语言的提出本来就是对汇编语言的抽象,其目的就是为了隐藏这些幕后发生的事情,你现在又把这些事情重新提了出来,本身就不符合C语言的设计思想.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-28 09:36:10 | 显示全部楼层
仰望天上的光 发表于 2012-6-28 09:04
这个不如帖袄汇编版.表面C是,其实是汇编的.

:'(
LZ欺负人 说好是C的 结果版主说是汇编了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-28 09:43:43 | 显示全部楼层
我可没用纯C之外的扩展语法哟,还有- -思想不能局限于一个地方
还有,,那只是约定,貌似和纯C语法没啥关系吧
C语言出现也不是为了隐藏幕后,而是当时出现了一种叫面向过程的编程思想,所以C语言出现了
隐藏幕后是C++这个时期提出的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-28 09:44:10 | 显示全部楼层
我是师兄 发表于 2012-6-28 09:36
LZ欺负人 说好是C的 结果版主说是汇编了

没看到我正在跟版主争论吗? 等争论完毕了。。。再说,完了我也会贴出正确答案。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-28 09:48:38 | 显示全部楼层
仰望天上的光 发表于 2012-6-28 09:35
当然和语言有关系.正统C语言的使用者认为函数机制是完美无缺的,并遵照一些约定合理的使用函数.

但知道 ...

我觉得,C语言作者的设计思想,我们没必要去考虑吧,无论他那样设计的初衷是什么。C语言之所以灵活,强大,就是强大在了指针上面,能灵活读取内存,做一些其他语言做不了的事情,我们去巧妙的利用这样的灵活有什么不对呢?   还有调用约定问题,其实我对调用约定并不怎么懂,但是这个题,我觉得是恰到好处的利用了调用约定的实现。。。可以说这个题就是为了那样的调用约定而出。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-28 09:50:43 | 显示全部楼层
到了java的出现则是进一步隐藏,能确定的是,C语言的了,出现是为了面向过程的编程思想,
不过思想是思想,就像C++,C#,JAVA也能用面向过程的思想去编写(虽然初衷不是为面向过程而出现,但是,的确可以用面向过程的方法)
C语言的用法是灵活的,这也是灵活之一
我会说,腾讯曾经也出过类似的题目么- -,虽然我不知道答案,不过的确是要计算出主函数变量地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-28 09:55:27 | 显示全部楼层
莱瑞古德 发表于 2012-6-28 09:50
到了java的出现则是进一步隐藏,能确定的是,C语言的了,出现是为了面向过程的编程思想,
不过思想是思想, ...

我可以给大家提示一下。。。这个题是为了调用约定而诞生的。。。在主函数里面调用一个函数的时候,对于_cdecl调用约定,会在被调函数里面保存上层函数的ebp的值,也就是fun函数里面[ebp+0]哪里保存着主函数的ebp的值,明白C语言的函数实现原理的人都知道我们的第一局部变量保存在[ebp-4]的地方,只要得到主函数ebp的值,就可以访问主函数里面任意一个变量。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-28 09:57:44 | 显示全部楼层
我是师兄 发表于 2012-6-28 09:34
我再次死循环了~~~~

你的死循环太好了。。。因为他们的代码本来就不对哦。。。他们的代码只能在特殊的运行环境下运行。。。特别感谢你用你伟大的编译器证明了他们代码的不完美。。。:D
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-28 09:58:12 | 显示全部楼层
没说你这样做不对.只是这样的题目依据有问题.我们一般写C语言,唯一的依据C语言标准.而你这个依据是底层函数的实现机制,这个机制在C标准里没有说.所以这样的题目出了会给很多的DDMM带来捆扰.因为它们确实是两种不同类型的问题.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-28 10:00:57 | 显示全部楼层
仰望天上的光 发表于 2012-6-28 09:58
没说你这样做不对.只是这样的题目依据有问题.我们一般写C语言,唯一的依据C语言标准.而你这个依据是底层函数 ...

唉!是的。。。这个题目对于不懂C实现原理的人,确实是个难题,根本不知如何下手。。。放在这里确实有些难为人。  不过版主你应该懂的吧,上次我的那个不限制参数函数,你做出来,我觉得你绝对懂栈的。  

我是个搞逆向的。。。没想到这么多。{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-28 10:01:17 | 显示全部楼层
Tzdner_C 发表于 2012-6-28 09:55
我可以给大家提示一下。。。这个题是为了调用约定而诞生的。。。在主函数里面调用一个函数的时候,对于_c ...

:funk:然后,弱弱的说,汇编我不熟悉,能有那个0x58,是用printf  %p 进行变量地址位置偏移的测试得出的,在fun和main加入了打印内存地址的语句,so ,用edp什么的。。。。。。额。。。。。。
还是- -发我邮箱去- -691310634@qq.com
待会就要,走人了- -然后远离电脑网络了- -(两个月)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-28 10:02:52 | 显示全部楼层
Tzdner_C 发表于 2012-6-28 10:00
唉!是的。。。这个题目对于不懂C实现原理的人,确实是个难题,根本不知如何下手。。。放在这里确实有些难 ...

你还没告诉我win32汇编对应的机器码有什么好的工具来查?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-28 10:02:58 | 显示全部楼层

另外还有东西不懂 (&s)[22]就是a了吧? 底层我菜鸟 那么直接--这个 不就足够了吗 为什么还需要对s赋值!!??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-28 10:05:55 | 显示全部楼层
莱瑞古德 发表于 2012-6-28 10:01
然后,弱弱的说,汇编我不熟悉,能有那个0x58,是用printf  %p 进行变量地址位置偏移的测试得出的, ...

不知道栈调用机制的话,就用你前面写的程序就很好了.因为真的答案出来你也肯定不理解.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-28 10:05:58 | 显示全部楼层
莱瑞古德 发表于 2012-6-28 09:33
发出来- -就顺便发到我邮箱呗-
事实上- -11点之后,就要出发回老家了,所以也没有时间解题了,更可怕的 ...

好的。。。看兄弟如此关注。。。没问题的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-29 01:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表