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)
想法如何除以负数?
如果除数是带符号的 64 位值,则无需对其执行任何操作。同样,如果被除数是带符号的 128 位值,则无需对其执行任何操作,只需将其高 64 位加载到 中rdx,将低 64 位加载到rax.
现在,如果任何数字已带符号但比idiv预期短,则需要对该数字进行符号扩展。符号扩展非常简单。您只需用数字的最高有效位(符号位)填充空的顶部位即可。对于非负数,您用 0 填充该空间;对于负数,您用 1 填充该空间。有一些可用的指令可以对累加器中当前保存的值进行符号扩展。他们是:cbw,cwde,cdqe,cwd,cdq,cqo。最后三个符号延伸到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 或溢出),没有第三种选择。