MS Visual C++ + asm: определить принадлежность числа к классу простых чисел - Assembler

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

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

Определить принадлежность числа к классу простых чисел (С++/asm)
int num; // !!!
//...
_asm
{
lea esi,num
mov ebx,1
@L:
inc ebx
mov eax,[esi] 
xor edx,edx
div ebx
cmp edx,0
jne @L
cmp ebx,num
je  simple
    //пришли сюда если непростое
    jmp done    
simple:
    //сюда если число простое
done:
}
как полностью написать код всей программы? не могу понять

Решение задачи: «MS Visual C++ + asm: определить принадлежность числа к классу простых чисел»

textual
Листинг программы
org 100h
jmp start
 
mes0   db  13,10,'Type digit: $'
mes1   db  13,10,'Simple! $'
mes2   db  13,10,'Component! $'
 
num    dw  0               ;
N      dw  0               ;
 
start:                     ;
     mov   ah,9            ;
     mov   dx,mes0         ;
     int   21h             ;
     mov   ah,1            ;
     int   21h             ;
     and   ax,0fh          ;
     mov   [num],ax        ;
 
     mov   si,num          ;
     mov   bx,1            ;
@L:  inc   bx              ;
     mov   ax,[si]         ;
     xor   dx,dx           ;
     div   bx              ;
     or    dx,dx           ;
     jnz   @L              ;
 
     cmp   bx,[num]        ;
     jz    ok              ;
     inc   [N]             ;
     mov   dx,mes2         ;
     jmp   pri             ;
ok:  mov   dx,mes1         ;
pri: mov   ah,9            ;
     int   21h             ;
 
exit:                      ;
     xor   ax,ax           ;
     int   16h             ;
     int   20h             ;

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

На языке ассемблера написано следующее:

  1. org 100h — начало работы программы, все смещения в коде будут относительны этого адреса.
  2. jmp start — переход на метку start, с которой начинается выполнение основной программы.
  3. mes0 db 13,10,'Type digit: $' — описание сообщения, которое выводится на экран при запуске программы. В данном случае, пользователю предлагается ввести цифру.
  4. mes1 db 13,10,'Simple! $' — описание сообщения, которое выводится на экран, если число простое.
  5. mes2 db 13,10,'Component! $' — описание сообщения, которое выводится на экран, если число не является простым.
  6. num dw 0 — переменная для хранения числа, которое проверяется на простоту.
  7. N dw 0 — переменная для хранения результата проверки числа на простоту (1 - число простое, 0 - число не является простым).
  8. start: — метка начала выполнения основной программы.
  9. mov ah,9 — подготовка регистров к выполнению функции вывода на экран.
  10. mov dx,mes0 — указание, какое сообщение нужно вывести на экран.
  11. int 21h — выполнение функции вывода на экран.
  12. mov ah,1 — подготовка регистров к выполнению функции ввода с клавиатуры.
  13. int 21h — выполнение функции ввода с клавиатуры.
  14. and ax,0fh — очистка регистра AX, который использовался для ввода числа.
  15. mov [num],ax — сохранение введенного числа в переменной num.
  16. mov si,num — подготовка переменной si для цикла.
  17. mov bx,1 — инициализация переменной bx для цикла.
  18. @L: inc bx — увеличение значения переменной bx на 1.
  19. mov ax,[si] — получение значения переменной num для проверки на простоту.
  20. xor dx,dx — подготовка регистра DX для проверки числа на простоту.
  21. div bx — деление числа на переменную bx.
  22. or dx,dx — получение остатка от деления, который будет равен 0, если число простое.
  23. jnz @L — если число не простое, то повторный цикл.
  24. cmp bx,[num] — сравнение значения переменной bx с числом, которое было введено пользователем.
  25. jz ok — если число не простое, то переход на метку ok.
  26. inc [N] — увеличение значения переменной N на 1.
  27. mov dx,mes2 — вывод на экран сообщения, что число является составным.
  28. jmp pri — переход на метку pri.
  29. ok: mov dx,mes1 — вывод на экран сообщения, что число простое.
  30. pri: mov ah,9 — подготовка регистров к выполнению функции вывода на экран.
  31. int 21h — выполнение функции вывода на экран.
  32. exit: xor ax,ax — подготовка регистра AX для выполнения функции завершения работы программы.
  33. int 16h — завершение работы программы.
  34. int 20h — завершение работы программы.

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

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