尝试将正数除以负数。
目前我的程序将正确划分,我可以正确访问其余部分。
但是当我输入正数除以负值时,它根本不会分开。
我知道有一种“签署扩展”的方法,它会正确划分。我只是不懂手册
movsss $ imm /%reg%reg / mem move,sign extend 231 movzss $ imm /%reg%reg / mem move,零延伸
当然是att语法,我需要英特尔语法
这是我的代码
xor rdx, rdx
mov rax, [input]
mov rcx, [input2]
idiv rcx
关于如何除以负面的想法?
答案 0 :(得分:4)
如果除数是带符号的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
至于'但是当我输入一个正数除以负值时,它不会完全分开',它不可能。它要么划分或调用除法异常(除以0或溢出),就没有第三种选择。