Определить является ли введенное число простым - 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

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

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