126091 (690871), страница 3
Текст из файла (страница 3)
ret
;*************************************************
include cls.prc
;*************************************************
; Головне меню
SelectFunction: ; 1.1.Вивод рядка меню
mov DX, OFFSET FSelMsg
mov AH, 9h
int 21h
; 1.2.Вибор функції
mov FuncNum, 0
call input10; Прочитуємо номер пункту меню
mov FuncNum, AL; Зберігаємо номер обраної функції
ExitSF: ret
;*************************************************
; Підпрограма введення числа
input10:
push BX; Зберігаємо регістри
push DX
push CX
mov DX, 0; Обнуляємо регістр зберігання результату
InputChar:
clc
mov AH, 0Ch
mov AL, 1
int 21h; Прочитуємо символ з луною
cmp AL, 13d
je ExitI10; Якщо його код 13? кінець введення
cmp AL, 0 "
jb ErrInput; Якщо код менше коду символи 0 помилка вводу
cmp AL, '9 '
jg ErrInput; Якщо код більше коду символу 9 помилка вводу
clc
sub AX, 30h; Отримуємо з коду символу число
mov CX, 0
mov CL, AL
mov AX, DX
mov BX, 10
mul BX; Множимо на 10 вже накопичений результат
add AX, CX; Додаємо зовсiм небагато
mov DX, AX; Зберігаємо результат
jmp InputChar
ErrInput:
Stc; У випадку помилки введення встановлюємо прапор
ExitI10:
mov AX, DX; Переносимо результат в регістр повернення
pop CX
pop DX
pop BX; Відновлюємо регістри
ret
;*************************************************
; Установка покажчика на сегмент змінних
SetDATSeg:
push AX
mov AX, _Data
mov DS, AX
pop AX
ret
;*************************************************
; Установка покажчика на перевірочний масив
SetArrSeg proc
push AX
mov AX, DataSeg
mov ES, AX
pop AX
ret
SetArrSeg endp
;*************************************************
; Процедура обчислення CRC16
; ES - сегмент масиву
; DX - адресу початку масиву
; BX - довжина блоку даних
; AX - результат обчислень
;*************************************************
CalcCRC proc
push CX; \
push BX; - збереження регістрів
push DI; /
push DX
mov DI, DX; Завантаження індексу початку масиву
mov DX, 8
mov CX, BX; Установка лічильника циклу
shl CX, 1; \
shl CX, 1; - CX = CX * 8
shl CX, 1; /
mov AX, 65535; Очищення регістра результату
mov BX, ES: [DI]
CRNext: loop CRNextTest; Цикл за словами масиву
pop DX
pop DI; \
pop BX;-відновлення регістрів
pop CX; /
ret
CRNextTest:
push AX
mov AX, BX
and AX, 1b
jz Shift
pop AX
xor AL, 31h
push AX
Shift: mov AX, DX
jz NewWord
shr BX, 1
dec DX
jmp EndShift
NewWord:
mov DX, 8
inc DI
mov BX, ES: [DI]
EndShift:
pop AX
jmp CRNext
CalcCRC endp
;*************************************************
END
;*************************************************















