想用负数除正数。
目前我的程序将正确划分,我可以正确地访问余数。
但是当我输入一个正数除以一个负值时,它根本不会被除。
我知道有一种方法可以“符号扩展”,它将正确划分。我就是看不懂说明书
movsss $imm/%reg %reg/mem移动,符号扩展231 movzss $imm/%reg %reg/mem移动,零扩展
当然这是att语法,我需要intel语法
这是我的代码
xor rdx, rdx
mov rax, [input]
mov rcx, [input2]
idiv rcx
思想作为如何划分由负?
1条答案
按热度按时间6jygbczu1#
如果除数是一个带符号的64位值,则不需要对其进行任何操作。同样,如果被除数是一个有符号的128位值,您不需要对它做任何事情,只需将它的前64位加载到
rdx
中,并将低64位加载到rax
中。现在,如果任何数字是有符号的,但比
idiv
期望的短,则需要对该数字进行符号扩展。符号扩展非常简单。您只需用数字的最高有效位(符号位)填充空白的顶部位即可。对于非负数,你用0填充空格,对于负数,你用1填充空格。有一些指令可以对当前保存在累加器中的值进行符号扩展。它们是:cbw
,cwde
,cdqe
,cwd
,cdq
,cqo
。最后三个符号扩展到dx/edx/rdx
。最有可能的情况是,您需要cqo
而不是xor rdx, rdx
,如下所示:至于 '但是当我输入一个正数除以一个负值时,它根本不会被除',它不可能。它要么被除,要么调用除异常(被0除或溢出),没有第三种选择。