p> BegOffs DW (?); Качан перевірочного масиву
Result DW (?); Результат обчислення
FuncNum DB (?); Звертаючись Операція
_Data ENDS
; ********************************************** ***
; Сегмент програми
; ********************************************** ***
. CODE
; ********************************************** ***
call cls; Очищення екранах
call SetDATSeg; Завантаження адреси сегмента змінніх
call SetArrSeg; Установлення покажчика сегменту масиву
; Головне меню
Mnu: call SelectFunction; Вибір Операції
call cls; Очищення екранах
mov AL, FuncNum;
Mnu1: cmp AL, 1; Визначення парності
jne Mnu2
; Установка параметрів
mov DX, OFFSET TestTab; Зміщення качану масиву
mov BX, 30; Розмір перевіряється блоку даніх
; Call TestOdd
call CalcCRC
mov Result, AX; Збереження результату
; *******************************
Mnu2: cmp AL, 2; Візначіті парність І порівняті з перед.
jne Mnu3
mov DX, OFFSET TestTab; Зміщення качану масиву
mov BX, 30; Розмір блоку даніх
call CalcCRC
cmp Result, AX
je Mnu2End
; Результат не співпав. Дані спотворені. Видати ПОВІДОМЛЕННЯ про Помилка
mov DX, OFFSET ErrorResult
mov AH, 9h
int 21h; Висновок ПОВІДОМЛЕННЯ про помилки
mov DX, OFFSET ByeStr; Висновок запрошення
mov AH, 9h
int 21h
mov AH, 0Ch
mov AL, 01h
int 21h; Очікування натіскання будь-якої клавіші
Mnu2End:
call cls
jmp Mnu
; *******************************
Mnu3: cmp AL, 3; Спотворення масива (перший байт)
jne Mnu4
mov DI, OFFSET TestTab
mov AX, ES: [DI]
xor AX, 1; Інвертуємо молодший біт
mov ES: [DI], AX
; *******************************
Mnu4: cmp AL, 4; Вихід з програми
jne Mnu
; *******************************
jmp Exit
; Завершення програми
; Exit:
; Прізупініті перед виходом
mov DX, OFFSET ByeStr;? Натісніть клавішу?? p> mov AH, 9h
int 21h
mov AH, 0Ch
mov AL, 01h
int 21h
Exit:; Вихід
mov AH, 4Ch
int 21h
; ********************************************** ***
; Друк нового рядка
NewStr:
mov AH, 02h
mov DL, 0Dh
int 21h
mov DL, 0Ah
int 21h
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 ​​p>
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 - результат обчислень
...