Наибольший общий делитель

Читал тут документацию по ARM-процессорам, в качестве примера там был такой код:

обычный ассемблер, возьмем, к примеру x86

; eax, ebx - два целых числа, для которых ищем наибольший общий делитель

gcd:
    cmp eax,ebx ; сравниваем числа
    jz  stop    ; если они равны, то заканчиваем поиск, переходим на метку stop
    jl  less    ; если eax < ebx, переходим на метку less
    sub eax,ebx ; eax = eax - ebx
    jmp gcd     ; продолжаем поиск
less:
    sub ebx,eax ; ebx = ebx - eax
    jmp gcd     ; продолжаем поиск
stop:

а вот реализация этого же алгоритма на ARMе:

; r0, r1 - два целых числа, для которых ищем наибольший общий делитель

gcd:
   cmp   r0,r1    ; сравниваем r0 и r1
   subgt r0,r0,r1 ; если r0 > r1, то r0 = r0 - r1
   sublt r1,r1,r0 ; если r0 < r1, то r1 = r1 - r0
   bne   gcd      ; если r0 != r1, то продолжаем поиск

ARM вообще интересная штука и фичи довольно вкусные, вот часть из них:

  • Все инструкции 32-битные
  • Большинство инструкций исполняется за 1 цикл
  • Каждая инструкция может быть исполнена по условию

P.S.
вот вам код на PHP:

function gcd($a, $b) {
    while ($a != $b)
        if ($a>$b)
            $a -= $b;
        else
            $b -= $a;
    return $a;
}
Запись опубликована в рубрике Программирование с метками , , , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий