Я собираюсь предположить, что вы хотите сохранить тот же алгоритм. Это должно быть, по крайней мере, несколько более эффективной реализацией. Основное отличие состоит в том, что код в цикле использует только регистры, а не память.
int lcm(int a,int b) {
__asm {
xor ecx, ecx
mov esi, a
mov edi, b
lstart:
inc ecx
mov eax, ecx
xor edx, edx
idiv esi
test edx, edx
jne lstart
mov eax, ecx;
idiv edi
test edx, edx
jnz lstart
mov eax, ecx
leave
ret
}
}
Однако, как отметил Джейсон, на самом деле это не очень эффективный алгоритм - умножение, поиск GCD и деление обычно выполняются быстрее (если только a
и b
не очень малы).
Редактировать: есть еще один алгоритм, который почти проще понять, который также должен быть намного быстрее (чем оригинал - не умножение, а деление на GCD). Вместо генерации последовательных чисел, пока вы не найдете одно, которое делит и a
, и b
, генерируйте последовательные числа, кратные одному (предпочтительно большему), пока не найдете одно, которое делится равномерно на другое:
int lcm2(int a, int b) {
__asm {
xor ecx, ecx
mov esi, a
mov edi, b
lstart:
add ecx, esi
mov eax, ecx
xor edx, edx
idiv edi
test edx, edx
jnz lstart
mov eax, ecx
leave
ret
}
}
Это до сих пор просто понять, но должно дать значительное улучшение по сравнению с оригиналом.