【发布时间】:2020-11-11 16:16:18
【问题描述】:
我有以下汇编代码
.global _start
.section .text
_start:
movq a, %rax
movq b, %rbx
imul %rbx, %rax
cmp %rbx, %rax
je gcd_calculated
ja l1
sub %rax, %rbx
jmp _start
l1:
sub %rbx, %rax
jmp _start
gcd_calculated:
div %rax
movq %rax, (c)
a,b 是四边形,我需要计算它们的 lcm,我需要将结果分配给 c
我用上面的代码得到了错误的结果,我不知道为什么。
一般来说,我在 lcm = (a*b)/gcd 上进行中继,所以我将 a*b 存储在 %rax 中,然后计算将存储在 %eax 中的 gcd,最后在它们之间进行划分。
【问题讨论】:
-
您每次通过循环计算和比较
a * b > b,并且永远不会更改a或b。这看起来像一个无限循环(大部分时间)。 -
如果
a, b是 64 位的,则 LCM 可能不适合 64 位结果。考虑以下值:a = 2^63 - 1和b = 2^62,然后:gcd(a, b) = 1(互质),lcm(a, b)是 125 位结果!