Определить является ли введенное число простым - Assembler
Формулировка задачи:
Я с Ассемблером на Вы! А препод насел очень плотно.
Ближе к телы, трабл такой надо написать код.
Задание "Определить является ли введенное число простым", числа от 0 до 9 больше не надо, методом сравнения, сильно мудрить не надо но лижбы работало.
Зарание огромное спасибо.
З.Ы. коментарии к коду тоже надо.
Решение задачи: «Определить является ли введенное число простым»
textual
Листинг программы
.model tiny .586 .code org 100h max = 10 ;максимальное количество цифр start: mov ah,9 mov dx,offset a0 ;Введите 9-значное число int 21h xor si,si; si:=0 mov ah,0Ah mov dx,offset buffer ; читаем число в buffer int 21h mov dl,10 mov ah,2 int 21h ; переход на новою строку mov bh,0 mov bl,buffer+1 test buffer+1[bx],1 ; число четное? jnz m3 m10: mov dx,index[si];offset a1 m0: mov ah,9 ; вывод сообщения и выход из программы int 21h retn m3: add si,2 ;mov dx,offset a3 cmp buffer+1[bx],'5' ; число делится на 5? jz m10 add si,2;mov dx,offset a2 m2: mov ax,0 m1: mov dl,buffer+1[bx] ; получаем в DL код очередной цифры and dl,0Fh ; выделение очередной цифры из ASCII-кода add al,dl ; получаем сумму из цифр числа dec bx ; переходим к следующей цифре jnz m1 ; это последняя цифра? db 0D4h,3;div al/3 --> остаток в AL, частное в AH test al,al ; число делится на 3? jz m10 m4: add si,2; xor eax,eax ; переводим ASCII-строку в число cdq ; edx:=0 xor ebx,ebx movzx ecx,buffer+1 m5: mov al,buffer+2[ebx] ; получаем в AL код очередной цифры and al,0Fh ; выделение очередной цифры из ASCII-кода imul edx,10 add edx,eax inc ebx ; переходим к следующей цифре loop m5 mov temp,edx finit ; сброс сопроцессора fild temp ; загрузить число в двоичном коде fsqrt ; получаем квадратный корень fist temp1 cmp temp,7 je m10;9 add si,2 mov ecx,7 m7: xor edx,edx mov eax,temp div ecx test edx,edx jz m6 ; делится без остатка add ecx,2 ; от 7 до квадратного корня числа с шагом в 2 cmp ecx,temp1 jna m7 m9: mov dx,offset a4 ; число -- простое jmp m0 m6: add si,2 mov di,offset a6 ; переводим делитель в ASCII-строку mov eax,ecx ; делитель в eax cmp eax,10 ; число меньше 10? jae b0 add al,'0' stosb jmp m8 b0: cmp eax,100 ; число меньше 100? jae b1 aam add ax,3030h xchg ah,al stosw jmp m8 b1: push eax fninit ; сброс сопроцессора fild dword ptr [esp] ; загрузить число в двоичном коде fbstp Data_BCD ; извлечь число в коде BCD pop eax ; выровнить стековый указатель mov ecx,9 ; в десятом байте информация о знаке числа b2: cmp byte ptr [ecx-1+Data_BCD],0 jnz b3 loop b2 ; пропускаем незначащие (нулевые) разряды слева b3: mov al,byte ptr [ecx-1+Data_BCD];загружаем первую значащую пару разрядов cmp al,9 ;если в старшей тетраде 0 - пропустить старшую тетраду ja b4 add al,30h ; младшую тетраду переводим в ASCII stosb dec ecx b4: xor eax,eax ; распаковываем остальные разряды числа mov al,byte ptr [ecx-1+Data_BCD] ror ax,4 ; выделяем старшую и младшую тетрады shr ah,4 add ax,3030h ; переводим в ASCII-код stosw loop b4 m8: jmp m0 ;---------- данные------------------------- a0 db 'Введите 9-значное число',0Ah,'$' buffer db max,?,max+1 dup(0) a1 db 'число делится на 2$' a2 db 'число делится на 3$' a3 db 'число делится на 5$' a4 db 'простое число$' a5 db 'число делится на ' a6 db 0,max dup ('$') index dw a1,a3,a2,a4,a5 temp dd 0 ; место под число temp1 dd 0 ; место под квадратный корень Data_BCD dt 0 ; число в BCD-формате end start