尝试将正数除以负数。
目前我的程序将正确划分,并且我可以正确访问其余部分。
但是当我输入一个正数除以一个负值时,它根本不会被除。
我知道有一种方法可以“签名扩展”并且它会正确划分。我只是看不懂说明书
movsss $imm/%reg %reg/mem 移动,符号扩展 231
movzss $imm/%reg %reg/mem 移动,零扩展
当然那是 att 语法,我需要 intel 语法
这是我的代码
xor rdx, rdx
mov rax, [input]
mov rcx, [input2]
idiv rcx
想法如何除以负数?
如果除数是带符号的 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
As for “但是当我输入一个正数除以一个负值时,它根本不会被除”,不可能。它要么进行除法,要么调用除法异常(除以 0 或溢出),没有第三种选择。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)