LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1268|回复: 14

play with C

[复制链接]
发表于 2005-9-11 11:20:20 | 显示全部楼层 |阅读模式
怎样使程序不从main函数正常返回,而又不使用exit呢? 写了一例:

  1. [rick@Fedora-Core private]$ cat break_main.c
  2. #include <stdio.h>

  3. int h()
  4. {
  5.         __asm__("n:");
  6.         printf("h is calling ...\n");
  7.         return 0;
  8. }

  9. void g()
  10. {
  11.         printf("g is calling...\n");
  12. }

  13. void f()
  14. {
  15.         int a;
  16.         *(&a+2) = &g;
  17.         printf("f is calling...\n");
  18. }

  19. int main()
  20. {
  21.         printf("entering main ...\n");
  22.         __asm__("pushl $n;");
  23.         f();
  24.         printf("back to main\n");
  25.         return 0;
  26. }
复制代码

解释我就不写了,留给各位网友.
发表于 2005-9-11 12:59:47 | 显示全部楼层
呵呵,巧妙

和我这篇文章里写的内容是一个道理(相当于一个解释吧):非本地跳转:概念和应用
回复 支持 反对

使用道具 举报

发表于 2005-9-11 14:23:30 | 显示全部楼层
涉及到汇编了,有点看不明白!那么这些代码是不是只有在X86架构的处理器上才是可运行的。我要放到51,dsp,arm上去是不是就不行了?
回复 支持 反对

使用道具 举报

发表于 2005-9-11 14:29:51 | 显示全部楼层
关键在堆栈的生长方向、栈祯格式和机器的字长。
回复 支持 反对

使用道具 举报

发表于 2005-9-11 15:01:24 | 显示全部楼层
写汇编就是写寄存器,处理器中各个寄存器的布局决定了堆栈的生长方向、栈祯格式和机器的字长,但不同架构的处理器它们内部的寄存器布局是完全不一样的。如at89c51内部寄存器数才32个通用寄存器+21个特殊功能寄存器。好多x86架构下处理器的寄存器根本不存在,所以我怀疑这些代码是不是只有在特定的处理器上才能运行!
回复 支持 反对

使用道具 举报

发表于 2005-9-11 15:06:43 | 显示全部楼层
但是涉及到函数调用的那部分都是类似的。也不需要其他的寄存器,只要有程序计数器就可以了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-11 15:10:45 | 显示全部楼层
嗯,这样的代码不仅对处理器体系结构有依赖,另外,对编译器也有依赖,这样的代码用vc编译出来肯定是有问题的
回复 支持 反对

使用道具 举报

发表于 2005-9-11 15:51:37 | 显示全部楼层
不懂,大侠给解释一下.*(&a+2) = &g;是什么意思?
回复 支持 反对

使用道具 举报

发表于 2005-9-11 17:55:16 | 显示全部楼层
break_main.c: In function ‘f’:
break_main.c:18: warning: assignment makes integer from pointer without a cast
改成

  1. *(&a+2) = (int)&g;
复制代码

就没有这条warning了
如果能用纯C完成就更强了(当然C语言就是要禁止这样
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-11 18:42:23 | 显示全部楼层
Post by manphiz
break_main.c: In function ‘f’:
break_main.c:18: warning: assignment makes integer from pointer without a cast
改成

  1. *(&a+2) = (int)&g;
复制代码

就没有这条warning了


改的好.
回复 支持 反对

使用道具 举报

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

本版积分规则

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