assembly - 汇编 IA-32:如何将 64 位有符号数除以奇数(存储在 2 个寄存器中)
问题描述
在IA-32架构上,如何将有符号数除以 3(例如)存储在 2 个寄存器中的值 edx:eax(64 位值)。我想将整个值(64 位)除以 3,而不仅仅是 32 位,并将其存储在 2 个寄存器中。
我假设这只能使用移位操作来完成,因为imul
仅适用于乘以 32 位数字。但只找到了除以2^n
数字的解决方案。
我怎样才能做到这一点?
解决方案
您可以通过连续除法将任何长度数除以 32 位数,使用前除法的剩余部分作为下一次除法的最高有效 32 位,类似于长手除法
注意我需要修复此代码以处理负除数,但它应该适用于正除数和有符号除数。
请注意,此代码向负无穷大取整:-10/3:商 = -4,余数 = +2。为了处理负除数,代码可以同时取除除数和除数,然后取反余数。
mov ecx,000000003h ;ecx = signed dvsr (must be positive)
mov edi,0fedcba98h ;edi:esi = signed dvnd
mov esi,076543210h
;; inputs
mov eax,edi ;eax = upper 32 bits dvnd
cdq ; sign-extend that into EDX:EAX
idiv ecx
test edx,edx ;br if sign rmdr == sign dvsr
jns short div0
dec eax ;dec quot
add edx,ecx ;rem += dvsr
div0: mov edi,eax ;edi = upper 32 bits quot
mov eax,esi ;eax = lower 32 bits dvnd
div ecx
mov esi,eax ;esi = lower 32 bits quot
; ;edx = remainder
推荐阅读
- python - 如何从欧拉角计算“旋转流动性”的量度?
- python - 使用 numpy.polynomial.legendre 时,如何获得将输入转换为勒让德多项式的参数的函数?
- ruby-on-rails - 将枚举与管理集成的正确方法是什么?
- angular - 无法在单元格渲染器中使用 ngIf
- python - 如何在不使用 Inflect 或 NLTK 的情况下确定 Python 中的多个单词?
- python - Matplotlib 升级后出现错误:“ValueError: s must be a scalar, or the size as x and y”
- android - task.getResult().isEmpty() 是指文档不可用,并且 task.getResult().exists() 是指文档在 Firestore 中可用吗?
- python - 时间优化在Python中将数组写入文件
- facebook-opengraph - drupal 8 在 facebook 上共享图像时出错
- image-processing - 使用 ImageJ 从合并的堆栈创建新的图像堆栈