nasm idiv 为负值

use*_*632 1 assembly x86-64 nasm integer-division

尝试将正数除以负数。

目前我的程序将正确划分,并且我可以正确访问其余部分。

但是当我输入一个正数除以一个负值时,它根本不会除。

我知道有一种方法可以“签名扩展”并且它会正确划分。我只是看不懂说明书

movsss $imm/%reg %reg/mem 移动,符号扩展 231 movzss $imm/%reg %reg/mem 移动,零扩展

当然那是 att 语法,我需要 intel 语法

这是我的代码

xor rdx, rdx
mov rax, [input]
mov rcx, [input2]
idiv rcx
Run Code Online (Sandbox Code Playgroud)

想法如何除以负数?

Ale*_*nze 6

如果除数是带符号的 64 位值,则无需对其执行任何操作。同样,如果被除数是带符号的 128 位值,则无需对其执行任何操作,只需将其高 64 位加载到 中rdx,将低 64 位加载到rax.

现在,如果任何数字已带符号但比idiv预期短,则需要对该数字进行符号扩展。符号扩展非常简单。您只需用数字的最高有效位(符号位)填充空的顶部位即可。对于非负数,您用 0 填充该空间;对于负数,您用 1 填充该空间。有一些可用的指令可以对累加器中当前保存的值进行符号扩展。他们是:cbwcwdecdqecwdcdqcqo。最后三个符号延伸到dx/edx/rdx。您很可能需要cqo而不是xor rdx, rdx像这样:

mov rax, [input]
cqo ; sign extends rax into rdx:rax
mov rcx, [input2]
idiv rcx
Run Code Online (Sandbox Code Playgroud)

至于“但是当我输入一个正数除以一个负值时,它根本不会被除”,这是不可能的。它要么进行除法,要么调用除法异常(除以 0 或溢出),没有第三种选择。