gpt4 book ai didi

assembly - 计算汇编 x86 中的 LCM

转载 作者:行者123 更新时间:2023-12-02 19:07:42 25 4
gpt4 key购买 nike

我有以下汇编代码

.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中,然后计算gcd将存储在 %eax 并最终在它们之间进行划分。

最佳答案

/* x86-64 gcc / clang support the __int128 type: */

/*

#include <stdint.h>

unsigned __int128 lcm (uint64_t a, uint64_t b)
{
uint64_t u = a, v = b;

for (uint64_t t = 0; (t = v) != 0; u = t)
v = u % v;

if (u != 0) /* gcd(a, b) != (0) : */
return (((unsigned __int128) a) * (b / u));

return (0);
}

*/

/* x86-64 Mach-O (OSX) / ELF calling conventions:
* first arg (a) in %rdi, second arg (b) in %rsi;
* 128-bit integer returned in %rdx:%rax [hi:lo] */

/* no caller-reserved registers or stack are used: */

.text
.globl _lcm
_lcm:
movq %rdi, %r8
movq %rsi, %rdi
movq %r8, %rcx
L_gcd:
testq %rdi, %rdi
je L_lcm # %rcx = gcd(a, b)
movq %rcx, %rax
xorl %edx, %edx
movq %rdi, %rcx
divq %rdi
movq %rdx, %rdi
jmp L_gcd
L_lcm: # lcm(0, 0) returns (0) :
xorl %eax, %eax
xorl %edx, %edx
testq %rcx, %rcx # if gcd(a, b) == 0, then:
je L_done # %rdx:%rax = 0:0; return.
movq %rsi, %rax
xorl %edx, %edx # %rdx:%rax = 0:b
divq %rcx # %rax = (b / g)
mulq %r8 # %rdx:%rax = a * (b / g)
L_done:
ret

关于assembly - 计算汇编 x86 中的 LCM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64790116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com