Страниц: 1
Записей на странице: 45
Список | Удалить из друзей | Добавить в закладки
10.06.07 03:58
- <Камышовый>
- Сообщений: 1421
тваюжмать, а она работает!
Код::
.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
#209.12.07 17:13
- <Камышовый>
- Сообщений: 1421
в любом случае можно. тока я тупой в ассме, да и актуальность отпала))
Offline
Страниц: 1
Записей на странице: 45
Список | Удалить из друзей | Добавить в закладки

