Официальный сайт студ.городка НГТУ

Список блогов » 1982 Sinclair Research Ltd. (c) » тваюжмать, а она работает!

10.06.07 03:58

<Камышовый>
Сообщений: 1421
Email Профиль Приват 

тваюжмать, а она работает!

Код::

.code					;начало программы
main:
	mov ax, @DATA
	mov ds,ax
	mov es,ax

back1:	lea dx, msg1
	mov ah, 9
	int 21h

	lea dx, inpstr 			;запрос строки
	mov ah, 0ah
	int 21h
	
	mov si, dx			;проверка длины строки
	lodsb
	lodsb
	cmp al, 11
	js cont1	
	lea dx, err1
	mov ah, 9
	int 21h
	jmp back1
	
	jmp cont1
msgns:	lea dx, err2
	mov ah, 9
	int 21h
	jmp back1

cont1:	lodsb				;парсер введенной строки
	sub al, 30h			;сначала получаем число месяца
	js msgns
	cmp al, 10			
	jns msgns
	mov bl, al
	lodsb
	cmp al, '.'
	jz cont2
	sub al, 30h
	js msgns
	cmp al, 10			
	jns msgns
	add bl,bl			;умножение на 10
	mov cl, bl			;умножение делается более быстрым способом, чем
	add bl,bl			;если делать командой mul
	add bl,bl
	add bl,cl
	add bl,al
	lodsb				;теперь получаем номер месяца
	cmp al, '.'
	jnz msgns
cont2:	mov bh,bl
	lodsb		
	sub al, 30h
	js msgns
	cmp al, 10			
	jns msgns
	mov bl, al
	lodsb
	cmp al, '.'
	jz cont3
	sub al, 30h
	js msgns
	cmp al, 10			
	jns msgns
	add bl,bl			
	mov cl, bl
	add bl,bl
	add bl,bl
	add bl,cl
	add bl,al
	lodsb	
	cmp al, '.'
	jnz msgns
cont3:	mov cx, bx
	lodsb				;сейчас получаем год
	sub al, 30h			;первая цифра
	js msgns2
	cmp al, 10			
	jns msgns2
	xor bx,bx
	mov bl,al
	add bx,bx			
	mov dx,bx
	add bx,bx
	add bx,bx
	add bx,dx
	lodsb				;вторая цифра...
	sub al, 30h
	js cont9
	cmp al, 10			
	jns cont9

	xor ah,ah
	add bx,ax
	add bx,bx			
	mov dx,bx
	add bx,bx
	add bx,bx
	add bx,dx

	lodsb				;третья...
	sub al, 30h
	js cont9
	cmp al, 10			
	jns cont9
	xor ah,ah
	add bx,ax
	add bx,bx			
	mov dx,bx
	add bx,bx
	add bx,bx
	add bx,dx
	lodsb				;и четвертая цифра
	sub al, 30h
	js cont9
	cmp al, 10			
	jns cont9
	xor ah,ah
	add bx,ax			;получаем в cx - число и месяц, в bx - год
	lodsb 				;проверяем, что строка окончилась нормальным кодом
	cmp al,	13
	jnz msgns2

					;окончание парсинга введеной строки
	jmp cont4
msgns2:	lea dx, err2			;выводит сообщение об ошибке ввода
	mov ah, 9
	int 21h
	jmp back1

cont9:	xor dx,dx			;обработка, если кол-во цифр во введенном годе меньше 4-х
	mov ax,bx
	div nw10
	mov bx,ax	

					;далее приводим число и месяц к нормальному 
					;для прораммиста виду и одновременно проверяем, 
					;не введены ли нули в месяце и числе

cont4:	dec cl				;месяц - 1
	js msgns3
	dec ch				;число месяца - 1
	js msgns4
	mov al, cl			;проверяем корректность введенных чисел:
	cmp cl, 12			;номер месяца - не больше 12-го	
	jns msgns3
	
	push bx				;число месяца - не больше положенного в этом месяце
	lea bx, dpm
	add bl, cl
	adc bh, 0
	mov al, [bx]
	pop bx
	cmp ch, al
	js cont6		
	
	cmp cl, 1			;..., учитывая високосный год
	jnz msgns4
	cmp ch, 28
	jnz msgns4
	test bx, 3
	jnz msgns4
	

	jmp cont6
msgns3:	lea dx, err3			;отрабатывается неверный номер месяца
	mov ah, 9
	int 21h
	jmp back1

msgns4:	lea dx, err4			;отрабатывается неверный ввод числа месяца
	mov ah, 9
	int 21h
	jmp back1
					;проверка пройдена, приступаем к расчету

cont6:					;расчет дня недели
	push bx
	push cx
	mov ax, bx
	div byte ptr n28		;делим текущий год на 28, получая остаток
	mov al,ah			;28 лет - это НОК между 4 (период високосного года) 
	xor ah,ah			;и 7 (число дней в неделе)
	mov bx,ax
	div byte ptr n4			;деление на 4 - учет високосных дней
	mov bh,al
	xor ax,ax
	mov al, bl
	mul word ptr n365		;умножение на 365 - получение дней
	add al,bh			;+ високосные дни
	adc ah,0
	add al, ch			;+ число месяца
	adc ah,0
	lea bx,dpm
	or cl,cl
	jz outrez
loop1:	add al, byte ptr [bx]		;+ количество дней в предыдущих месяцах
	adc ah,0
	inc bx
	dec cl
	jnz loop1
	pop cx
	pop bx
	test bl,3			;+ еще один високосный день, если этот год високосный и 
	jnz outrez			;февраль уже прошел
	cmp cl,2
	jns outrez
	inc ax
	
outrez:	xor dx,dx			;корректируем число получившихся дней
	dec ax				;и считаем номер дня недели
	dec ax
	div word ptr [n7]		;в dl - день недели

	xor dh, dh			;получаем адрес строки с названием дня недели
	shl dx, 4
	mov ax, dx
	lea dx, dow
	add dx, ax
	push dx

	lea dx, msg2			;выводим день недели на экран
	mov ah, 9h
	int 21h
	pop dx
	mov ah, 9h
	int 21h

	mov ax, 4C00h 			;выход из программы
        int 21h


end main				; КОНЕЦ ;-)

Offline

#112.11.07 23:13

asp
Сообщений: 3063
Email Профиль Приват 

Отрабатывает предельно быстро или можно соптимизировать еще?

Offline

#209.12.07 17:13

<Камышовый>
Сообщений: 1421
Email Профиль Приват 

в любом случае можно. тока я тупой в ассме, да и актуальность отпала))

Offline

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.066 сек.
Выполнено 14 запросов.