Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 [ 12 ] 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88

nextbyte;

al, al

cx, localvar

bx, localmas

BYTE PTR [bx], al

loop

nextbyte

sp, bp

myproc ENDP

В заключение рассмотрим законченную программу. Пример (см. рис. 1.2.12, г)

==== Программа шифрования строки байтов =========================

==== crypto.срр - модуль С++ ====================================

# include <stdio.h> i

# include <string.h> I extern "C" void bufcrypto (unsigned char far *mybuf, int bufsize, char key);

char *mystr = "Секретная информация";

int main ()

printf ("Before encryption: %s\n", mystr); bufcrypto (mystr, strlen(mystr), "G"); printf ("After encryption: %s\n", mystr); return 0;

;==== bufcrypto.asm - ассемблерный модуль. =========================

. MODEL small . CODE

PUBLIC bufcrypto bufcrypto PROC

; Директива ARG автоматически формирует правильное смещение ; в стеке для перечисленных параметров

outofproc: bufcrypto

push

raov

jcxz

push

stosb

ENDP

addrbuf: DWORD, bufsize: WORD, key: BYTE bp

bp, sp cx, bufsize outofproc es di

di, addrbuf al, key

di es bp


myargl

myargZ

Вершина стека


SP + 256

SP + 258

SP + 260

SP + 262

localmas [0]

localmas [255]

localvar

BP при вызове

Адрес возврата

Стек

BP - 258

BP-4

ВР-2

BP+ 2

BP при вызове

Адрес возврата

myargl

myarg2

Вершина стека

ВР + 2

ВР + 4

ВР + б

BP+ 8

BP+ 10

BP при вызове

ВР + 2

Адрес возврата

BP+ 4

- addrbuf -

ВР + б

bufsize

BP+ 8

BP+ 10

Вершина стека

L

1.2.12. Использование стека: - Bug стека перед началом выполнения функции myproc; - Bug стека после выполнения команд push bp u mov bp, sp функции myproc; вЬ1деление стека nog локальные переменные;

S4g стека после выполнения команд push bp u mov bp, sp функции bufcrypto

bcc!f*""P°""« И компоновка: =*ypto.cpp buf crypto, asm

Расщире" сначала компилирует CRYPTO.CPP в CRYPTO.OBJ, затем, обнаружив Р иие .ASM, компилятор вызывает TASM.EXE, чтобы ассемблировать



BUFCRYPTO.ASM в BUFCRYPTO.OBJ. Затем компилятор вызывает TL1NK.EXE для объединения модулей с объектными кодами в CRYPTO.EXE. Данный метод подходит если компиляции и ассемблированию подлежит небольшое количество модулей.

Раздельное ассемблирование и компоновка: tasm /ml bufcrypto bcc -с crypto

tlink d:\bc45\lib\c0s crypto bufcrypto, mycrypto,, d:\bc45\lib\cs

Данный метод используется при ассемблировании и компоновке большого количества модулей. Опция /ml включает различение строчных и прописных символов, как это принято в С и С++. Опция - с означает "только компилировать", вызывая создание фай-ла типа .OBJ, но не компоновку программы. Первый параметр после TLINK специфивд. рует файл объектного кода для соответствующей модели памяти, второй параметр - подлежащие компоновке файлы .OBJ, третий параметр - имя конечного файла, четвертый параметр - необязательный, пятым параметром специфицируется рабочая библиотека.

Упрошенный метод компоновки: tasm /ml bufcrypto bcc -с crypto

bcc -ms, crypto.obj bufcrypto.obj

Опция -ms определяет модель памяти (SMALL).

13. Система прерываний ЮМ PC

1.3.1. Способы организации ввода-вывода информации

Существуют следующие способы организации ввода-вывода:

программно-управляемый ВВ;

ВВ по прерываниям;

Ш прямой доступ к памяти - DMA (Direct Memory Access).

Программный ВВ и ВВ по прерываниям основываются на передаче байтов или слоб при этом данные от памяти к портам ВВ и обратно передаются через регистры Uj В режиме DMA выполняется последовательность команд, заставляющая контроллер передать совокупность байтов или слов из порта ВВ в память или в обратном направлен""

Профаммно-управляемый ВВ предполагает постоянный опрос разрядов гoтoвнp регистров состояний УВВ (см. раздел 1.2.11). Хотя реализация програ"" управляемого ВВ чрезвычайно проста, она связана со значительными потерями вре! на ожидание активного состояния ИБ. При вводе-выводе по прерываниям отпадает Н. ходимость в постоянной проверке регистра состояний интерфейсного блока: послед

Ассемблер в задачах aaiMJTbi информ 1 • Основь! прог на Ассемблере IBM PC

сам посылает в ЦП сигнал запроса на прерывание IRQ, когда он имеет данные для ввода g jjpoueccop или готов принимать данные из ЦП. Операция ввода-вывода в этом случае еапизуется специальной процедурой, называемой обработчиком прерывания.

В системе, показанной на рис. 1.1.1, существуют и другие ситуации, когда процессор прекращает выполнение текущей программы и переходит на обслуживание поступившего запроса на прерывания.

1.3.2. Типы прерываний

Существует два типа прерываний: аппаратные и программные (рис. 1.3.1). Прерывания первого типа иногда называют асинхронными, так как они происходят в случайные моменты времени, а прерывания второго типа - синхронными, так как они возникают в том случае, когда процессор в процессе выполнения профаммы всфечает команду INT. Команды прерывания очень похожи на команды вызова подпрофамм. Строго говоря, профаммные прерывания это вовсе не прерывания, это механизм обращения к системным ресурсам ПК: процедурам операционной системы DOS, расположенным в оперативной памяти, и процедурам базовой системы ввода-вывода BIOS, находящимся в постоянной памяти. Эти процедуры реализуют функции ввода-вывода для стандартных УВВ, выделяют и освобождают память, работают с системными часами и т. п.

Прерывания

Аппаратные (асинхронные)

Программные (синхронные)

Внешние

Ваугренние

Немаскируемые

Маскируемые

Ч-З.!. Классификация прерываний

Аппаратное прерывание суть процесс, инициируемый сигналом (запросом прерыва-) который сообщает ЦП, что в системе произошло некое событие (например, нажата ища на клавиатуре), фебующее его внимания. сдуР"Ь1е прерывания, в свою очередь, делятся на внутренние и внешние. В первом Рывя загфоса формируются внуфенними схемами ЦП. Примерами таких пре-

являются прерывание, возникающее при ошибке во время выполнения команды



деления, и прерывание пошаговой работы, возникающее после выполнения кажд: команды при установленном флаге TF.

Внешние аппаратные прерывания делятся на немаскируемые и маскируемые. Запр немаскируемого прерывания, поступающий на вход NMI процессора, должен бы обслужен сразу. Он обычно сообщает о чрезвычайной ситуации, например, об o6Haf жении ошибки в памяти или временном понижении напряжения питания.

Немаскируемые прерывания поступают на вход INT процессора от УВВ, требующих ( служивания. Эти прерьшания можно запрещать или разрешать тремя различными способами.

сбрасывая или устанавливая соответствующие биты INTE (Interrupt Enable) регистров состояний интерфейсных блоков;

устанавливая или сбрасывая соответствующие биты регистра маски контроллера прерываний;

выполняя команды CLI (Clear Interrupt) или STI (Set IntenTipt), соответственно сбрасывающие или устанавливающие флаг IF.

Прерывания от стандартных УВВ желательно запрещать на очень короткие промежутки времени, необходимые для выполнения критических участков программы.

1.3.3. Последовательность прерываний

в процессоре 8086 в общей сложности предусмотрено 256 номеров прерыва! Вектора прерываний (ВП), т. е. полные адреса соответствующих обработчиков, хра в таблице векторов прерываний, которая занимает начало оперативной памяти (а, GOGOOh ... GG3FFh), как показано на рис. 1.3.2. В два старших байта 4-байтовой яча таблицы записывается сегментный адрес обработчика прерываний, в два младших байта - относительный адрес обработчика прерываний. Из рисунка видно, что вектор прерывания с номером G, располагается в памяти, начиная с адреса G, вектор прерывания с номером 1, располагается в памяти, начиная с адреса 4, и т. д. Вектор прерывания с номером N, располагается в памяти, начиная с адреса 4N.

Независимо от источника прерывания (внутренние схемы ЦП, команда INT N, сигналы INT или NMI на одноименных входах процессора) последовательность прерывание выполняется одинаково. При инициировании прерывания с номером N процессор посл довательно выполняет следующие действия:

сохраняет в стеке содержимое регистров F, CS и IP, т. е. информацию, необходим}* для будущего корректного возобновления прерванной программы;

загружает в CS и IP адрес обработчика прерывания с номером N, который хранит* в ячейке таблицы ВП с адресом 4N, осуществляя тем самым переход на програь* обслуживания прерывания;

...™...f.P.l??.?.!!!!l!f. Глава 1 • OcHOBbi программирования на Ассемблере IBM PC 39


g по команде IRET, которой обычно завершается обработчик прерывания, выполняются обратные действия - из стека извлекаются сохраненные там значения IP CS и F в результате чего происходит возврат в прерванную программу в ту точку где произошло прерывание. *

Память

IP о

IP/V

CS/V

BHJV

Вершина стека

Адрес возврата

Рчс-1.3.2. Последовательность\ррьвания с номером N

вийТГГ™ прерываний зарезервированы для выполнения определенных дейст-

призагпЗ,кГпГ н"""," f.™""" ""Р""" системных обработчиков прерываний рузке ПК. На рис. 1.3.3 показаны некоторые из таких векторов прерываний.



0 1 2 3 4 5 6 7 8 9 10 11 [ 12 ] 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88