【问题标题】:"Trace/breakpoint trap (core dumped)" error when dividing by negative value in Assembly在汇编中除以负值时出现“跟踪/断点陷阱(核心转储)”错误
【发布时间】:2019-09-12 03:37:06
【问题描述】:

我写了一个小汇编程序,它把两个数相除,然后通过 C printf 函数显示结果。程序要求用户输入数字,然后除法如下:

mov rax, r14 ;r14 holds the numerator
cqo
mov rbx, r13 ;r13 holds the divisor
idiv rbx
mov r12, rax ;place divided answer into r12
mov r11, rdx ;place remainder from rdx into r11

稍后打印出值:

mov rax, 0
mov rdi, outputresult ;outputresult defined as "The quotient of %ld divided by %ld is %ld with remainder %ld."
mov rsi, rsp
mov rsi, r14
mov rdx, rbx
mov rcx, r12
mov r8, r11
call printf

很明显,我将所有值都移到了它们各自的“调用”寄存器中以正确显示这些值。此功能完美,除非除数 (r13) 为负数时,我会收到之前所述的错误 (Trace/breakpoint trap (core dumped)。

无论除数是负数还是正数,程序都会继续运行,并实际显示正确的值。但是,我希望摆脱在程序完成运行之前总是出现的错误。如果我遗漏了任何重要的内容,我可以提供任何进一步的代码。

【问题讨论】:

  • 你调试过你的代码吗?哪条指令触发了错误?
  • 是的,我调试过了。它声称错误发生在 divfunc() 中,这是我的 C 文件中指向完成所有计算的程序集文件的函数的名称(即程序集文件以 divfunc: 开头)。
  • idiv rbx之前添加这个命令:cdq,签名扩展
  • see
  • 试过了,不幸的是没有运气。出现同样的错误。

标签: c x86 nasm division


【解决方案1】:

我找到了解决方案。总而言之,在将用户的输入保存到r14 后,我最初通过push qword r14r14 推送为qword。

我为解决此问题所做的工作是执行push qword 0 以避免将r14 作为一个qword 推送(我认为这会干扰cqo 指令),然后在call scanf 之后继续pop r14在收集用户输入时。最后,在执行mov rax, r14 之后,cqo 似乎运行良好,因为我不再收到带有负除数的错误。

【讨论】:

    【解决方案2】:

    以普通用户运行程序.. 我正在安装软件并得到相同的错误“(跟踪/断点陷阱(核心转储)”。我正在使用 root 用户运行程序,但它失败并给出了该错误.然后我在互联网上搜索并没有得到有效的解决方案。然后我使用普通系统用户运行它,它对我有用:)

    希望对你有帮助

    谢谢!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多