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 — завершение работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д