|
Новичок
Регистрация: 16.09.2007
Сообщений: 25
С нами:
9816424
Репутация:
62
|
|
Хелп. На асме (Tasm) надо накодить прогу, вычисляющую все простые числа в диапазоне от 2 до вводимого с клавы числа.
upd:
Кое как разобрался, написал ) выкладываю на всякий случай
Код:
.model tiny
.386
.Stack 70h
.code
start:
mov ax,@data
mov ds,ax
push cs
pop ds
mov ah,09h ; приглашение к вводу
mov dx,offset str1
int 21h
mov di,0 ; введенные символы
mov si,0 ; номер позиции
mov bp,10 ; основание системы
r1: mov ah,08h
int 21h ;читаем символ
cmp al,'0' ;если это служебный символ -> r3
jb r3
cmp al,'9' ;если это не цифра -> r1
ja r1
mov bl,al ;сохраним символ в bl
mov ax,di
mul bp ;умножаем на 10
mov dl,bl
sub dl,'0' ;преобразуем символ в цифру
mov dh,0 ;DX - цифра
add dx,ax
jc r1 ;Если перенос -> переполнение
inc si
mov di,dx
mov dl,bl
mov ah,02h
int 21h
jmp r1
r3: cmp si,0
je r1
cmp al,13
je enter2 ;нажали ввод
cmp al,8
jne r1
enter2:
mov ah,09h ;новая строка
mov dx,offset newline
int 21h
mov mem,di ;дублируем эталон
mov nen,di
mov ax,mem ; эталон в AX для работы
mov cnt,1 ; счетчик в еденицу
mov bl,1
mul bl ; переводим AX в DX:SI
main_cycle: ;главный цикл
add cnt,1 ; проверяем следующее число
mov bx,mem
mov ax,cnt
cmp ax,bx ; проверены все числа...
jg qall
mov bx,1 ; переносим AX в DX:AX
mul bx
mov cx,2 ; делим с тройки
internal:
push ax
push dx ; сохраняем текущее проверяемое число
;mov bx,cx
div cx ; делим DX:AX на CX
cmp dx,0 ; если остатка нету
je main_cycle; то число не простое
pop dx
pop ax
add cx,1
cmp ax,cx
jle prime
jmp internal
prime:
mov ah,09h ;выводим простое число
mov dx,offset space
int 21h
mov ax,cnt
call print_prime
jmp main_cycle
qall:
mov ax,4c00h;Выход
int 21h
print_prime proc ;вывод числа
push -1
l: xor dx,dx;чистим dx
div bp ;делим
push dx ;сохраним цифру
cmp ax,0 ;остался 0?
jne l ;если нет, продолжим
mov ah,2h
l2: pop dx ;восстановим цифру
cmp dx,-1 ;дошли до конца -> выход
je qex
add dl,'0' ;преобразуем число в цифру
int 21h ;выведем цифру на экран
jmp l2 ;и продолжим
qex:
ret
endp print_prime
str1 db '.-==[Prime Numbers]==-.',10,13
db '> $'
space db ' $'
newline db 10,13,'$'
mem dw 0
nen dw 0
cnt dw 0
end start
Последний раз редактировалось Heavy Metal; 29.12.2007 в 04:58..
|