Проверка числа на простоту - Assembler
Формулировка задачи:
Всем вновь привет! Не можете ли вы объяснить мне что делается в программе с 29 по 52 строки. А то нужную программу нашел но не все понимаю из этих строк. Заранее благодарю за помощь и понимание!
.386 .model flat,stdcall option casemap:none include E:\masm32\include\windows.inc include E:\masm32\include\kernel32.inc include E:\masm32\include\msvcrt.inc includelib E:\masm32\lib\kernel32.lib includelib E:\masm32\lib\msvcrt.lib .data num db ? MSG1 DB "ENTER NO:", 0 MSG2 DB "NOT PRIME", 0 MSG3 DB "PRIME", 0 format1 db "%d", 0 .code start: invoke crt_printf,ADDR MSG1 invoke crt_scanf,ADDR format1,ADDR num mov al, num cmp al,1 jle @LBL2 mov ah,00 cmp al,3 jle @LBL3 mov ah,00 mov cl,2 div cl mov cl,al @LBL1: mov ah,00 mov al,num div cl cmp ah,00 jz @LBL2 dec cl cmp cl,1 jne @LBL1 jmp @LBL3 @LBL2: invoke crt_printf,ADDR MSG2 jmp @exit @LBL3: invoke crt_printf,ADDR MSG3 @exit: invoke ExitProcess, 0 end start
Решение задачи: «Проверка числа на простоту»
textual
Листинг программы
; fasm-code ; число лежит в буфере 'NUM' ;-------------------------- xor eax,eax ; ЕАХ = 0 mov esi,num ; ESI = адрес буфера mov bx,1 ; начальный делитель @cycle: inc bx ; (..следующий) mov ax,word[esi] ; берём число в АХ xor dx,dx ; обнулить остаток div bx ; АХ / ВХ or dx,dx ; остаток нуль? jnz @cycle ; нет.. cmp bx,[num] ; иначе: сравнить с делителем jz @ok ; если равно - простое число!!! cinvoke printf, MSG2 jmp @exit @ok: cinvoke printf, MSG3 @exit: jmp $ invoke ExitProcess, 0
Объяснение кода листинга программы
- Инициализация:
- EAX = 0 (счётчик)
- ESI = адрес буфера с числом
- BX = 1 (начальный делитель)
- Цикл проверки делителей:
- Увеличить BX на единицу
- Загрузить число из буфера в AX
- Очистить остаток в DX
- Разделить AX на BX (остаток сохраняется в DX)
- Если остаток не равен нулю (и, следовательно, число не является простым), то выполнить:
- CMP BX с делителем (сохраняется в буфере)
- Если BX равен делителю (т.е. число простое), то перейти к метке @ok
- Если остаток равен нулю (и, следовательно, число является простым), то перейти к метке @exit
- Вывод сообщения о числе:
- Если число простое, то вызвать функцию вывода сообщения MSG2
- Если число не является простым, то вызвать функцию вывода сообщения MSG3
- Завершение работы программы:
- Вызвать функцию ExitProcess с аргументом 0
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д