6 крутых способов вычисления квадратного корня на языке ассемблера (x86)

В мире программирования на языке ассемблера найти квадратный корень числа может оказаться непростой задачей. В этой статье блога мы рассмотрим шесть интересных методов вычисления квадратного корня числа с помощью языка ассемблера 8086. Так что хватайте шляпу программиста и приступим!

  1. Метод Ньютона.
    Одним из самых популярных методов приближения квадратных корней является метод Ньютона. Это итеративный подход, который сходится к желаемому квадратному корню. Вот упрощенная версия кода:
mov ax, number       ; Load the number whose square root is to be found
mov bx, ax           ; Store a copy of the number in bx
mov cx, 10           ; Set the number of iterations
mov dx, 1            ; Set the initial guess
newton_loop:
    mov ax, dx
    imul ax, ax       ; Square the guess
    cwd               ; Convert the result to a double-word
    idiv bx           ; Divide by the number
    add ax, dx        ; Add the guess to the result
    shr ax, 1         ; Divide by 2 (right shift)
    mov dx, ax        ; Save the new guess
    loop newton_loop  ; Repeat until iterations are complete
  1. Двоичный поиск.
    Другой подход — метод двоичного поиска. Он основан на наблюдении, что квадратный корень числа находится между 0 и самим числом. Вот простая реализация:
mov ax, number       ; Load the number whose square root is to be found
mov bx, 0            ; Set lower bound to 0
mov cx, ax           ; Set upper bound to the number
binary_search_loop:
    mov dx, bx
    add dx, cx        ; Calculate the midpoint
    shr dx, 1         ; Divide by 2 (right shift)
    mov ax, dx        ; Save the guess
    imul ax, ax       ; Square the guess
    cmp ax, number
    je found_sqrt     ; Square root found
    jl smaller        ; Guess is too small
    jg larger         ; Guess is too large
smaller:
    mov cx, dx        ; Update the upper bound
    jmp binary_search_loop
larger:
    mov bx, dx        ; Update the lower bound
    jmp binary_search_loop
found_sqrt:
    ; Square root found, result is in dx
  1. Вавилонский метод:
    Вавилонский метод — это древний алгоритм поиска квадратных корней. Он использует итерационные аппроксимации для сходимости к правильному значению. Вот упрощенная версия кода:
mov ax, number       ; Load the number whose square root is to be found
mov bx, ax           ; Store a copy of the number in bx
mov cx, 10           ; Set the number of iterations
mov dx, 1            ; Set the initial guess
babylonian_loop:
    mov ax, dx
    idiv bx           ; Divide the number by the guess
    add ax, dx        ; Add the guess to the result
    shr ax, 1         ; Divide by 2 (right shift)
    mov dx, ax        ; Save the new guess
    loop babylonian_loop  ; Repeat until iterations are complete
  1. Таблица поиска.
    Если у вас ограниченные требования к точности, вы можете использовать таблицу поиска для аппроксимации квадратного корня. Этот метод более быстрый, но менее точный. Вот фрагмент кода, который даст вам представление:
mov ax, number       ; Load the number whose square root is to be found
mov bx, ax           ; Store a copy of the number in bx
; Lookup table
sqrt_table dw 0, 1, 1, 2, 2, 2, ... ; Fill in the rest of the table
mov cx, 8            ; Set the number of iterations
mov dx, 0            ; Initialize the result
lookup_table_loop:
    mov ax, dx
    add ax, bx        ; Add the number to the result
    mov bx, ax        ; Save the new result
    shr ax, 1         ; Divide by 2 (right shift)
    mov dx, ax        ; Save the new guess
    loop lookup_table_loop  ; Repeat until iterations are complete
  1. Метод Херона:
    Метод Херона — еще один древний алгоритм аппроксимации квадратных корней. Он основан на принципе многократного усреднения предыдущего предположения с числом, разделенным на это предположение. Вот упрощенная версия кода:
mov ax, number       ; Load the number whose square root is to be found
mov bx, ax           ; Store acopy of the number in bx
mov cx, 10           ; Set the number of iterations
mov dx, 1            ; Set the initial guess
heron_loop:
    mov ax, bx
    idiv dx           ; Divide the number by the guess
    add ax, dx        ; Add the guess to the result
    shr ax, 1         ; Divide by 2 (right shift)
    mov dx, ax        ; Save the new guess
    loop heron_loop  ; Repeat until iterations are complete
  1. Инструкции Intel FPU:
    Если вы работаете с процессором x86, который поддерживает Intel FPU (модуль с плавающей запятой), вы можете воспользоваться инструкциями FPU для вычисления квадратного корня. Вот фрагмент кода с использованием инструкций FPU:
fld number           ; Load the number onto the FPU stack
fsqrt                ; Calculate the square root
fstp result          ; Store the result in memory

В этой статье блога мы рассмотрели шесть различных методов вычисления квадратного корня числа с помощью языка ассемблера 8086. От метода Ньютона до двоичного поиска, от вавилонского метода до справочных таблиц, от метода Герона до инструкций Intel FPU — каждый подход имеет свои преимущества и недостатки. В зависимости от ваших конкретных требований вы можете выбрать метод, который лучше всего соответствует вашим потребностям.

Итак, в следующий раз, когда вы окажетесь в увлекательном мире программирования на языке ассемблера, не позволяйте вычислениям квадратного корня запугать вас. Имея в своем арсенале эти замечательные методы, вы сможете справиться с любой задачей, возникающей на вашем пути!