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 ;
Объяснение кода листинга программы
На языке ассемблера написано следующее:
- org 100h — начало работы программы, все смещения в коде будут относительны этого адреса.
- jmp start — переход на метку
start
, с которой начинается выполнение основной программы. - mes0 db 13,10,'Type digit: $' — описание сообщения, которое выводится на экран при запуске программы. В данном случае, пользователю предлагается ввести цифру.
- mes1 db 13,10,'Simple! $' — описание сообщения, которое выводится на экран, если число простое.
- mes2 db 13,10,'Component! $' — описание сообщения, которое выводится на экран, если число не является простым.
- num dw 0 — переменная для хранения числа, которое проверяется на простоту.
- N dw 0 — переменная для хранения результата проверки числа на простоту (1 - число простое, 0 - число не является простым).
- start: — метка начала выполнения основной программы.
- mov ah,9 — подготовка регистров к выполнению функции вывода на экран.
- mov dx,mes0 — указание, какое сообщение нужно вывести на экран.
- int 21h — выполнение функции вывода на экран.
- mov ah,1 — подготовка регистров к выполнению функции ввода с клавиатуры.
- int 21h — выполнение функции ввода с клавиатуры.
- and ax,0fh — очистка регистра AX, который использовался для ввода числа.
- mov [num],ax — сохранение введенного числа в переменной num.
- mov si,num — подготовка переменной si для цикла.
- mov bx,1 — инициализация переменной bx для цикла.
- @L: inc bx — увеличение значения переменной bx на 1.
- mov ax,[si] — получение значения переменной num для проверки на простоту.
- xor dx,dx — подготовка регистра DX для проверки числа на простоту.
- div bx — деление числа на переменную bx.
- or dx,dx — получение остатка от деления, который будет равен 0, если число простое.
- jnz @L — если число не простое, то повторный цикл.
- cmp bx,[num] — сравнение значения переменной bx с числом, которое было введено пользователем.
- jz ok — если число не простое, то переход на метку
ok
. - inc [N] — увеличение значения переменной N на 1.
- mov dx,mes2 — вывод на экран сообщения, что число является составным.
- jmp pri — переход на метку
pri
. - ok: mov dx,mes1 — вывод на экран сообщения, что число простое.
- pri: mov ah,9 — подготовка регистров к выполнению функции вывода на экран.
- int 21h — выполнение функции вывода на экран.
- exit: xor ax,ax — подготовка регистра AX для выполнения функции завершения работы программы.
- int 16h — завершение работы программы.
- int 20h — завершение работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д