Показать сообщение отдельно

  #9  
Старый 28.12.2007, 01:18
Heavy Metal
Новичок
Регистрация: 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..
 
Ответить с цитированием