c - "Trace/breakpoint trap (core dumped)"在汇编中除以负值时出错

标签 c x86 nasm division

我编写了一个小型汇编程序,该程序将两个数字相除,然后通过 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)是负数时,我得到了前面所述的错误(跟踪/断点陷阱(核心转储)。

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

最佳答案

我已经找到解决办法了。总而言之,我最初将用户的输入保存到 r14 后,通过执行 push qword r14r14 作为 qword 推送。

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

关于c - "Trace/breakpoint trap (core dumped)"在汇编中除以负值时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57899388/

相关文章:

c - 在 C 程序中启动 matlab 代码的最有效方法

c - 汇编 如何将 IMUL 操作码(只有一个操作数)翻译成 C 代码

x86 - 使用GDB读取MSR

assembly - 引导加载程序的奇怪行为

c - 使用指针变量分配数组元素值时,第三个数组元素不会打印出来

选择静态代码分析工具

assembly - 该程序集访问该字符串常量有什么问题?

c++ - 如何在 Windows 上编译 OpenSSL?

c - 要运行 G-WAN,您必须修复错误或删除此 Servlet

assembly - 该汇编引导加载程序代码如何工作?