【发布时间】: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,签名扩展 -
试过了,不幸的是没有运气。出现同样的错误。