assembly nasm idiv a负值

91zkwejq  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(210)

想用负数除正数。
目前我的程序将正确划分,我可以正确地访问余数。
但是当我输入一个正数除以一个负值时,它根本不会被除。
我知道有一种方法可以“符号扩展”,它将正确划分。我就是看不懂说明书
movsss $imm/%reg %reg/mem移动,符号扩展231 movzss $imm/%reg %reg/mem移动,零扩展
当然这是att语法,我需要intel语法
这是我的代码

xor rdx, rdx
mov rax, [input]
mov rcx, [input2]
idiv rcx

思想作为如何划分由负?

6jygbczu

6jygbczu1#

如果除数是一个带符号的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

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

相关问题