Анализ программы Assembler - Контрольная работа

бесплатно 0
4.5 41
Рассмотрение основных особенностей компьютерной программы Assembler: функции, структурное описание. Характеристика собственных векторов обработчиков прерываний. Div64 как функция-вычислитель, реализующая операцию деления знаковых чисел в формате 64:16.


Аннотация к работе
Задание Знаковое деление четырёхсловного делимого на однословный делитель на основе использования штатной команды процессора div src (формат 64:16=64). Структурное описание программы На входе программы получаем десятичное число - делимое и делитель. Нам необходимо произвести с их помощью деление. Поэтому в нашем программном комплексе используем его для реализации механизма общения между резидентом и транзитной программой. При этом результат содержится в dx:ax, в случае если процедура умножения не была вызвана значение регистра cx равно 0ffffh Обработчик прерывания клавиатуры New_09h Рис. программа assembler вектор В случае если установлен флаг активности сканирования клавиатуры, выполняет проверку на нажатие Alt A, если нажата эта клавиатурная комбинация, то вызывается процедура деления, устанавливается флаг выполнения деления и снимается флаг активности сканирования клавиатуры. ;Строка, которая будет выводится Mes db Резидент в памяти!,13,10,$ Mes1 db Резидент выгружен!,13,10,$ Mes2 db Резидент установлен!,13,10,$ new_2fh endp ;конец обработчика Operand DQ 0 Deler Dw 0 Result DQ 0 Rem DW 0 SignR DB 0 SignC DB 0 Active DB 0 ;флаг активации резидента fl_active db 0 ;флаг активности клавиатуры Error db 0 buf dd ? Neg64 proc ;cмена знака 64 разрядного числа ;bx- адрес числа ;перевод по схеме !A 1 push ds cs pop ds not [word ptr bx 6] not [word ptr bx 4] not [word ptr bx 2] not [word ptr bx] add [word ptr bx],1 adc [word ptr bx 2],0 adc [word ptr bx 4],0 adc [word ptr bx 6],0 pop ds ret Neg64 endp ---------- Div64 proc ;деление 64 разрядного числа cmp bx, 0 ;если нулевой делитель jne ggood mov [cs:Error],1 ;то ошибка ret ggood: push ds cs pop ds mov [SignR],1 mov [SignC],1 or bx,bx ;знак делителя jns positive1 neg [SignR] ;учитываем если - neg bx positive1: mov si, [word ptr Operand 6] ;знак делимого or si,si jns positive2 ;учитываем если минус neg [SignR] neg [SignC] push bx mov bx, offset Operand call Neg64 pop bx positive2: xor dx, dx ;деление mov ax, [word ptr Operand 6] div bx mov [word ptr result 6], ax mov ax, [word ptr Operand 4] div bx mov [word ptr result 4], ax mov ax, [word ptr Operand 2] div bx mov [word ptr result 2], ax mov ax, [word ptr Operand] div bx mov [word ptr result], ax mov [Rem], dx cmp [word ptr result 6], 8000h ;если получили дольше максимального полодительного jne welldon cmp [word ptr result 4], 0000h jne welldon cmp [word ptr result 2], 0000h jne welldon cmp [word ptr result], 0000h jne welldon mov [cs:error], 1 ;то ошибка welldon: cmp [SignC], 1 je ok1 neg [Rem] ;востановим верные знаки ok1: cmp [SignC],1 je ok2 mov bx, offset operand call Neg64 ok2: pop ds ret Div64 endp new_09h proc ;Новый обработчик прерывания 09h pusha ;Сохраним регистры push ds es mov ax,cs mov ds,ax ;ds=cs cmp [fl_active],1 ;Производить проверку кодов нажатия клавиш? je @@work ;Да jmp @@Exit ;Нет @@work: ;Отфильтровываем комбинацию Alt-A in al,60h ;Читаем из порта данных клавиатуры скан-код клавиши cmp al,1Eh ;Если это [А], то работаем дальше jz @@ok @@Exit: pop es ds popa jmp dword ptr cs:[old_09h] ;в старый обработчик без возврата @@ok: mov ax,40h mov es,ax mov al,[es:17h] ;Получим первый байт флагов состояния клавиатуры test al,08h ;Клавиша Alt нажата? je @@Exit ;Нет, перейдём в системный обработчик sti ;Разрешим аппаратные прерывания mov [fl_active],0 ;Запретим дальнейшую проверку нажатия клавиш mov [active],1 mov bx, [cs:Deler] call DIV64 ;Вызов процедуры деления при ds=cs и es=40h cli ;Запретим аппаратные прерывания in al,61h ;Разрешим дальнейшую работу контроллеру клавиатуры or al,80h out 61h,al and al,7fh out 61h,al mov al,20h ;Пошлём в контроллер команду EOI out 20h,al pop es ds ;Восстановим регистры и выйдем из прерывания popa iret new_09h endp Init: mov ax,0c800h ;проверка на наличие в памяти int 2fh cmp al, 0ffh jne install cmp dx, 8888h jne install mov ax, [cs:82h] cmp ax , u/ je deinstall mov ah, 9 mov dx, offset message int 21h jne exit проверка на off deinstall: mov ax, 0c803h int 2fh jmp exit install: mov ah, 09h mov dx, offset Mes2 int 21h mov ah,35h ;AH содержит номер функции (это понятно) mov al,09h ;AL указывает номер прерывания, адрес (или вектор) ;которого нужно получить int 21h;Теперь в ES:BX адрес (вектор) прерывания (ES - сегмент, BX - смещение) mov [word ptr cs:old_09h],bx mov [word ptr cs:old_09h 2],es mov ax,2509h mov dx,offset new_09h ;DX должен указывать на наш обработчик int 21h mov ah,35h ;AH содержит номер функции (это понятно) mov al,2fh ;AL указывает номер прерывания, адрес (или вектор) ;которого нужно получить int 21h;Теперь в ES:BX адрес (вектор) прерывания ;(ES - сегмент, BX - смещение) mov [word ptr cs:old_2fh],bx mov [word ptr cs:old_2fh 2],es mov ax,252fh mov dx,offset new_2fh ;DX должен указывать на наш ;обработчик int 21h mov dx,offset Init int 27h exit: mov ax, 4c00h int 21h message db Копия резидента уже присутствует в памяти.,13,10,Pапустите с опцией /u для выгрузки,13,10,$ CSEG ends end Start h.asm p586n %TITLE HELLO.ASM IDEAL MODEL small STACK 256 Macro window
Заказать написание новой работы



Дисциплины научных работ



Хотите, перезвоним вам?