[FZH] #D C语言的函数指针引起“断错误”

cheng chen freakrobot在acm.org
星期一 五月 3 18:20:15 UTC 2010


1.哦,对的,第一个问题我明白了, 0x80496d8是数组的首地址,我要的函数的入口是数组首地址指向的值,谢了。

2.第二个问题,还有点不清楚。既然说是运行时产生的中断,那么为什么反汇编出来的汇编指令里面会直接有hlt:“80496d8:    f4
              hlt”呢?


2010/5/4 Miao在gmail <hellwolf.misty在gmail.com>

> 2010/5/3 cheng chen <freakrobot在acm.org>:
> > 请教大家2个问题,谢谢:
> > 1.函数指针,断错误无法解决
> > #include<stdio.h>
> > #define FUNC(x) ((void(*)()) *(x))
> >
> > void aa(){  printf("aa\n");}
> > void bb(){  printf("bb\n");}
> > void cc(){  printf("cc\n"); }
> > void dd(){  printf("dd\n");}
> >
> > void* operate[] = {aa,bb,cc,dd};
> >
> > int main()
> > {
> >  printf("%x\n",operate);
> >  (*(void(*) () ) 0x80496d8)();
>
>  (*(void(**) () ) 0x80496d8)();
>
> 改成这样就好了,原因就是少了个 '*'
>
> > //这个"断错误"了
> > //我这里的0x80496d8就是前面打印出来的operate的地址,应该就是指向aa函数的指针的地址么
> > //我用的格式跟《C陷阱与缺陷》P15 的方式一样的(*(void  (*) 0))(); 将入口地址强制转化为函数么
> >  ((void(*) () ) *operate)();
> > //这个正确的
> >  //FUNC(operate+1)();
> > //这个跟上面那个一致的,也"断错误"了
> >  return 0;
> > }
> >
> > 于是我把它编程汇编指令,太长了粘个主函数
> > main:
> >    pushl    %ebp
> >    movl    %esp, %ebp
> >    andl    $-16, %esp
> >    subl    $16, %esp
> >    movl    $.LC4, %eax
> >    movl    $operate, 4(%esp)
> >    movl    %eax, (%esp)
> >    call    printf
> >    movl    $134518488, %eax
> > ;这个$134518488我看过了就是0x80496d8,那不是跟下面的operate应该是一样的么
> >    call    *%eax
> >    movl    operate, %eax
> > ;这个operate应该也是$134518488,不是吗?
> >    call    *%eax
> >    movl    $0, %eax
> >    leave
> >    ret
> >    .size    main, .-main
> >
> > 2.另外一个问题,断错误的停机指令是何时生成的?
> > 还是上面程序,我用objdump反汇编找0x80496d8这个地址
> >  80496d8:    f4                       hlt
> >  80496d9:    83 04 08 08      addl   $0x8,(%eax,%ecx,1)
> > 怎么这里就有hlt指令了,是gcc编译的时候就生成hlt指令了吗?而不是运行出了错误才要停机的?
> >
>
> 段错误是机器产生了错误中断后发生 SIGSEG 信号,然后程序收到后默认信号处理程序就是停止进程。
> _______________________________________________
> Chinese mailing list
> Chinese at lists.fedoraproject.org
> https://admin.fedoraproject.org/mailman/listinfo/chinese
>



-- 
Cheng(诚)


关于邮件列表 Chinese 的更多信息