免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 6990 | 回复: 20
打印 上一主题 下一主题

[其它] 用汇编语言写的程序运行出现Segmentation fault问题 [复制链接]

论坛徽章:
1
处女座
日期:2014-11-29 14:47:43
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-04-21 15:00 |只看该作者 |倒序浏览
这是一个简单的输出“hello world”的汇编程序
我的平台
$uname -a
Linux www 2.6.32-431.11.2.el6.x86_64 #1 SMP Tue Mar 25 19:59:55 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

  1. .code32
  2. .section .data
  3.     output:
  4.         .asciz "hello world.\n"
  5. .section .text
  6. .globl main
  7. main:
  8.     nop
  9.     pushl $output
  10.     call printf
  11.     popl %eax

  12.     pushl $0
  13.     call exit
复制代码
编译链接都问题。运行时出现Segmentation fault错误
调试发现错误在调用printff时,收到了SIGSEGV(无效内存引用)的信号
请问这是什么原因呢?

论坛徽章:
1
15-16赛季CBA联赛之辽宁
日期:2016-07-06 16:53:09
2 [报告]
发表于 2014-04-21 16:05 |只看该作者
本帖最后由 daxiguagg 于 2014-04-21 17:48 编辑

GCC反汇编一个普通程序来看,仿佛传递参数不是用push.
调用无参数的函数,没出错。
    asm  
    (  
            "NOP\n\t"
            "call getpid\n\t"
            "movl %eax,%ebx\n\t"
            "NOP\n\t"
    );

论坛徽章:
1
处女座
日期:2014-11-29 14:47:43
3 [报告]
发表于 2014-04-21 16:18 |只看该作者
本帖最后由 Gnixfeng 于 2014-04-21 16:22 编辑

回复 2# daxiguagg
但是我的有参数啊,printf需要参数。结束调用的exit也没有问题。
只能说明不是调用出错,而是pushl出错

   

论坛徽章:
1
15-16赛季CBA联赛之辽宁
日期:2016-07-06 16:53:09
4 [报告]
发表于 2014-04-21 16:31 |只看该作者
本帖最后由 daxiguagg 于 2014-04-21 17:54 编辑

pushl $output

这里错了,这里是要$output的地址,查查看呢,对ATT汇编不熟

论坛徽章:
1
处女座
日期:2014-11-29 14:47:43
5 [报告]
发表于 2014-04-21 16:37 |只看该作者
回复 4# daxiguagg


    push的格式只有pushx source 没有 pushx source destination的格式etc

论坛徽章:
1
15-16赛季CBA联赛之辽宁
日期:2016-07-06 16:53:09
6 [报告]
发表于 2014-04-21 17:45 |只看该作者
本帖最后由 daxiguagg 于 2014-04-21 17:46 编辑
  1.     asm  
  2.     (  
  3.             "movl $0x000a7373,%eax\n\t"
  4.             "movl %eax,0x14(%esp)\n\t"
  5.             "lea 0x14(%esp),%edx\n\t"
  6.             "mov %edx,(%esp)\n\t"
  7.             "call printf\n\t"
  8.             "NOP\n\t"
  9.     );
  10. 相当于printf("ss\n");

  11. 你把你程序改成
  12. main:
  13. movl $0x000a7373,%eax
  14. movl %eax,0x14(%esp)
  15. lea 0x14(%esp),%edx
  16. mov %edx,(%esp)
  17. call printf
  18. NOP
复制代码

论坛徽章:
1
处女座
日期:2014-11-29 14:47:43
7 [报告]
发表于 2014-04-21 20:12 |只看该作者
回复 6# daxiguagg
但是我目的是为什么push会出现这个问题啊,而不仅仅是得到输出的结果


   

论坛徽章:
1
处女座
日期:2014-11-29 14:47:43
8 [报告]
发表于 2014-04-21 20:48 |只看该作者
daxiguagg 发表于 2014-04-21 16:31
pushl $output

这里错了,这里是要$output的地址,查查看呢,对ATT汇编不熟

$符号后接数据值在AT&T语法格式中是取数据的内存位置,也就想当与C语言的&符号把

论坛徽章:
1
15-16赛季CBA联赛之辽宁
日期:2016-07-06 16:53:09
9 [报告]
发表于 2014-04-21 20:58 |只看该作者
前面的代码我是在C内联汇编里试的。


试试下面这个呢
hello.s
  1. .data
  2. output:.ascii "hello world\n"
  3. .text
  4. .globl _start
  5. _start:
  6.     movl $4,%eax
  7.     movl $1,%ebx
  8.     movl $output,%ecx
  9.     movl $12,%edx
  10.     int $0x80
  11.     movl $1,%eax
  12.     int $0x80
复制代码
as -o hello.o hello.s
ld hello.o -o hello

./hello

论坛徽章:
1
处女座
日期:2014-11-29 14:47:43
10 [报告]
发表于 2014-04-21 22:33 |只看该作者
回复 9# daxiguagg

这种方法我早前已经试过了,是没有问题的。我的目的并不是的到hello world的输出结果,而是为什么这里push和call会出错?
我想顺便问下如何输出数字呢?也和上面的方法一样吗
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP