Проверка числа на простоту - 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

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

  1. Инициализация:
    • EAX = 0 (счётчик)
    • ESI = адрес буфера с числом
    • BX = 1 (начальный делитель)
  2. Цикл проверки делителей:
    • Увеличить BX на единицу
    • Загрузить число из буфера в AX
    • Очистить остаток в DX
    • Разделить AX на BX (остаток сохраняется в DX)
    • Если остаток не равен нулю (и, следовательно, число не является простым), то выполнить:
      • CMP BX с делителем (сохраняется в буфере)
      • Если BX равен делителю (т.е. число простое), то перейти к метке @ok
    • Если остаток равен нулю (и, следовательно, число является простым), то перейти к метке @exit
  3. Вывод сообщения о числе:
    • Если число простое, то вызвать функцию вывода сообщения MSG2
    • Если число не является простым, то вызвать функцию вывода сообщения MSG3
  4. Завершение работы программы:
    • Вызвать функцию ExitProcess с аргументом 0

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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