【问题标题】:gas assembler: segmentation error while reading from keyboard (simple program)gas assembler:从键盘读取时出现分段错误(简单程序)
【发布时间】:2013-05-24 08:48:56
【问题描述】:

我在尝试运行一个简单的汇编代码时遇到分段错误....基本上我想一直要求输入表单键盘,直到按下返回键,我知道是什么原因造成的,因为我是新手煤气总成,你能帮帮我吗?

.section .data
    num:
       .int
.section .text
   .global _start

    _start: 
    leggi:
          movl $3, %eax
          movl $0, %ebx
          leal num, %ecx
          movl $1, %edx
          int $0x80
          movl $10,%edx
          cmp %edx,num
          jne leggi

          movl $1, %eax
          xorl %ebx,%ebx
          int $0x80

【问题讨论】:

    标签: assembly segmentation-fault gnu-assembler


    【解决方案1】:

    我的印象是.int 允许您指定零个或多个表达式,并且它会为每个表达式创建空间。

    使用 no 表达式,它可能会分配零空间,这可能会给您带来问题。有可能,data 部分为空,然后您将写入 next 部分的第一个字节,这很可能是写保护的 text 部分。

    看看结果输出,看看它在做什么。如果 的问题,你应该能够解决它:

    .int 0
    

    但是,您可能还需要注意您正在读取字节但在代码中使用 int 大小的数据这一事实。我自己可能会使用.byte

    【讨论】:

    • 我使用了 .byte 0 并且现在可以使用 =) 即使按下回车键并且不会退出程序,程序仍然会继续要求输入
    • 听起来 jne leggi 只是在做一个永恒的循环 (movl $10,%edx) (cmp %edx,num) 看起来你需要输入 $10
    • @Revex 好吧,这是一个 不同 问题,应该在不同的问题中提出。看起来 SEGV 已通过向 .int/.byte 添加参数来解决。如果您在评论中提出问题, 看到它的人会少很多。但是,我首先要意识到 edx 不是一个字节 - 您可能需要将 byte(来自 num)加载到寄存器中并将其与立即值 $10 进行比较)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 2020-08-14
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多