当前位置:  技术问答>linux和unix

怎么没人进呢?请高手进来看一下吧,你应该不会后悔进的,虽然标题写的不吸引人。所以把原标题去了

    来源: 互联网  发布时间:2017-02-07

    本文导语:  本帖最后由 mjznet 于 2011-09-28 18:13:23 编辑 就是这段代码在linux下可编译通过,但执行时收到段错误信号。SIGSEGV 但在win下用相同的逻辑重写这段代码是ok的。 这段代码是用来测试ljmp 功能的,为什么不行呢? 望高手不...

本帖最后由 mjznet 于 2011-09-28 18:13:23 编辑
就是这段代码在linux下可编译通过,但执行时收到段错误信号。SIGSEGV
但在win下用相同的逻辑重写这段代码是ok的。
这段代码是用来测试ljmp 功能的,为什么不行呢? 望高手不吝赐教,万分感谢!
int main()
{
  unsigned long a[2] = {0,0};
  __asm__("push 1f;"
          "popl %0;"
          "push %%cs;"
          "popl %1;"
          "andl $0x000000ff,%1;" /*改成 "andl $0x0000ffff,%1;" 仍然不行*/
          "ljmp *%2;"
          "1:"
          :"=m" (a[0]), "=m" (a[1])
          :"m" (*(char*)&a[0]));

  return 0; 
}

|
因为你在"push 1f"压入的不是1:这个地址,而是1:这个地址上所存放的内容,也就是return 0;代码翻译成的指令mov $0x0, %eax,也就是b8 00 00 00 00。
所以在a[0]中存放的就是0x000000b8,所以最后ljmp时总是试图跳转到0x000000b8这个地址去,所以一定会SIGSEGV错误。
这完全是gcc内嵌汇编的问题,你在windows下写的时候不出错也很正常。

要改正的话,只需要把"push 1f;"改为"push $1f;"即可。

另外,gcc内嵌汇编一般分隔指令会用"push $1fn"的形式,这样在看汇编出来的代码时会规整很多。

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 高手,高手,高高手请进!
  • 有熟悉EXIM的高手高手么??
  • to 高手:学java应该怎样一步步学习,从菜鸟到高手.
  • 高分请高手,高手定能解决
  • 请问高手在linux中用什么命令可以做linux的启动盘???在等待高手??
  • 有高手研究Agent++麽?里面有个thread.h,蛮难读的,请高手指点
  • 难道高手区里的人就是高手?
  • 在dos下用bc31挑战高手******开发mssql程序,连接时报link err:undefined symbol GETNOTE in module DBEXTERN?(挑战高手)
  • 真正的linux高手,请看过来,看你符合高手标准不?
  • 难道这没有高手吗?难道这没有乐于助人的高手?(高分酬谢62+50+50)
  • 关于我对linux高手用yum,非高手用源码的理由
  • 高手救命,很急——ORACLE817安装在UNIXWARE711上,手工启动数据库后在netasst中连接错误,高手帮我看看?
  • 请教高手lvs的奇怪问题,我挺着急,希望高手别潜水,就就我,先谢谢了
  • 各个高手看看这个问题!本人第一次学习java所以要各位高手的帮助。。
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 我是新手,高手,高手,快来救我
  • EJB问题,请教高手(非高手莫进)
  • 请各位JAVA高手,网业高手看过来,我把能给的分都送出!!!只能给37分,哎!!
  • eWEEK沙龙征集高手座谈


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3