本文介绍了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填充空格。有几条指令可以用来符号扩展当前保存在累加器中的值。它们是: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或溢出),没有第三个选项。
这篇关于NASM除以负值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!