本文介绍了NASM除以负值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

正在尝试将正数除以负数。

目前我的程序将正确划分,并且我可以正确访问剩余部分。

但当我输入一个正数除以负值时,它根本不会被除法。

我知道有一种方法可以"标记扩展",并且它将正确划分。我就是看不懂手册

Movsss$imm/%reg%reg/mem移动,符号扩展231Movzss$imm/%reg%reg/mem移动,零扩展

当然这是ATT语法,我需要英特尔语法

以下是我的代码

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

如何除以负数的想法?

推荐答案

如果除数是有符号的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或溢出),没有第三个选项。

这篇关于NASM除以负值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-05 09:38