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 ;Прибавляем считанное число
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
;*****************************************************************************
ЗАКЛЮЧЕНИЕ
Ассемблер является символическим аналогом машинного языка. По этой причине программа, написанная на ассемблере, должна отражать все особенности архитектуры микропроцессора: организацию памяти, способы адресации операндов, правила использования регистров и т. д. Из-за необходимости учета подобных особенностей ассемблер уникален для каждого типа микропроцессоров.
В данной курсовой работе рассмотрены основные этапы программирования на ассемблере, реализован алгоритм выполнения поставленной задачи, а также выполнена трансляция кода в исполняемый файл.
СПИСОК ЛИТЕРАТУРЫ:
1. Финогенов К.Г. Основы языка Ассемблера. – М.: Радио и связь,2000.
2. Юров В. Assembler. Специальный справочник. – СПб.: Питер, 2001.
3. Юров В. Assembler. Практикум. – СПб.: Питер, 2001.
4. Юров В., Хорошенко В. Assembler – Учебный курс.- СПб.: Питер, 2000.