我编写了一个小型汇编程序,该程序将两个数字相除,然后通过 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 r14
将 r14
作为 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/