Написать процедуру, определяющую, делится ли ччисло на все четные числа из диапазона 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, иначе возвращается число, которое не делится на эти числа. Ниже представлен разбор кода по шагам:
- Входные данные: число в регистре EAX.
- Начало цикла CNLoop:
- Проверка регистра ECX на равенство 0. Если это так, то выполняется переход к метке CNLoop.Done, что означает, что число не делится на чётные числа в диапазоне от 2 до 12.
- Переменная EDX инициализируется значением 0.
- Выполняется push (откладывание) регистра EAX в стек.
- Деление регистра EAX на ECX.
- Умножение результата на ECX.
- Сравнение результата с отложенной копией регистра EAX.
- Если результат равен отложенной копии регистра EAX, то выполняется переход к метке CNLoop.Done.
- Выполняется pop (восстановление) регистра EAX из стека.
- Выполняется loop (повтор) цикла CNLoop.
- Конец цикла CNLoop.
- Если цикл CNLoop был завершён с помощью команды loop, то выполняется переход к метке CNLoop.Done.
- Выполняется pop (восстановление) регистра EAX из стека.
- Выполняется ret (возврат).
- Если цикл CNLoop был завершён с помощью команды ret, то возвращается 1.
- Выполняется mov (перемещение) регистра EAX значением 0.
- Выполняется ret (возврат).