Написать процедуру, определяющую, делится ли ччисло на все четные числа из диапазона 2 − 12 - Assembler

Узнай цену своей работы

Формулировка задачи:

Задано целое число, помещающееся в двойное слово. Написать процедуру, опреде-ляющую делится ли оно на все четные числа из диапазона 2 − 12. Употребить её для определения количества таких чисел в диапазоне до 1000000000. Желательно с комментариями

Решение задачи: «Написать процедуру, определяющую, делится ли ччисло на все четные числа из диапазона 2 − 12»

textual
Листинг программы
CheckNumber:
    ;input:
    ;   EAX - number
    ;output:
    ;   EAX - result
    ;       00 - false
    ;-----------------------------
    pusha
    mov ecx,12
    CNLoop:
        test ecx,01h
        loopz CNLoop
        jz CNLoop.Done
        mov edx,00h
        push eax
        div ecx
        mul ecx
        cmp eax,[ESP]
        je @f
            
            add esp,4
            popa
            mov eax,00h
            ret
        @@:
        pop eax
        loop CNLoop
    CNLoop.Done:
    popa
    mov eax,01h
    ret

Объяснение кода листинга программы

В коде представлена процедура под названием CheckNumber, которая принимает в качестве входного параметра число в регистре EAX и возвращает результат в том же регистре. Результат возвращается в регистре EAX со значением 0, если число делится на все чётные числа в диапазоне от 2 до 12, иначе возвращается число, которое не делится на эти числа. Ниже представлен разбор кода по шагам:

  1. Входные данные: число в регистре EAX.
  2. Начало цикла CNLoop:
  3. Проверка регистра ECX на равенство 0. Если это так, то выполняется переход к метке CNLoop.Done, что означает, что число не делится на чётные числа в диапазоне от 2 до 12.
  4. Переменная EDX инициализируется значением 0.
  5. Выполняется push (откладывание) регистра EAX в стек.
  6. Деление регистра EAX на ECX.
  7. Умножение результата на ECX.
  8. Сравнение результата с отложенной копией регистра EAX.
  9. Если результат равен отложенной копии регистра EAX, то выполняется переход к метке CNLoop.Done.
  10. Выполняется pop (восстановление) регистра EAX из стека.
  11. Выполняется loop (повтор) цикла CNLoop.
  12. Конец цикла CNLoop.
  13. Если цикл CNLoop был завершён с помощью команды loop, то выполняется переход к метке CNLoop.Done.
  14. Выполняется pop (восстановление) регистра EAX из стека.
  15. Выполняется ret (возврат).
  16. Если цикл CNLoop был завершён с помощью команды ret, то возвращается 1.
  17. Выполняется mov (перемещение) регистра EAX значением 0.
  18. Выполняется ret (возврат).

Оцени полезность:

14   голосов , оценка 3.5 из 5
Похожие ответы