1. Представление данных в компьютере: двоичная, шестнадцатиричная системы исчисления, числа со знаком. I Двоичная система исчисления. В двоичной системе исчисления 2 цифры, а вместо степени здесь применяется степень двойки. 10010111b, “b” – означает двоичная системы исчисления. 10010111b = 1*2^7 + 0 *2&6 + 1*2^4 + 0*2^3 + 1*2^2 + 1*2^1 + 1*2^0 = 151 a) Перевести из Bin в Dec a)Перевести из Dec в Bin 151 / 2 = 75 | 1 младший 75 / 2 = 37 | 1 37 / 2 = 18 | 1 18 / 2 = 9 | 0 9/2 =4 |1 4/2 =2 |0 2/2 =1 |0 1 / 2 = 1 | 1 старший Бит, байт и слово. Минимальная единица цифры - бит. Он может принимать два значения 0 или 1. Единица цифры размером в 8 бит называется байтом. Байт – минимальный объём данных, который реально может использовать компьютерная программа. Ст. бит|7||6||5||4||3||2||1||0|мл. Бит. Т.к. в Байте 8-бит ,то он может принимать 2*e8-1 или 256 различных значений. Байт используется для представления: целых чисел [0..255] целых чисел со знаком [-128..127] наборов символов ASCII кодов или символов принимающих <256 значений/ Следующий тип данных слово, его размер 2 байта. Может принимать до 2*у16-1=65563 значений. |15__старший байт____8|7__младший байт____0| Слово или 2Байта используется для представления: целых чисел без знака [0..65563] целых чисел со знаком [-32768..32767] адреса сегментов и адресаций при 16-ти битной адресации. Два слова подряд образуют двойное слово, состоящее из (32 бит), два двойных-учетверённое (64 бит), слово и двойное слово – основной тип данных. Шестнадцатеричная система исчисления: Использует 16 цифр. 0123456789ABCDEF Номер позиции цифры в числе соответствует степени, в которую надо возвести число 16. 96h , “h” – означает шестнадцатеричную систему исчисления. 9h = 1001b 6h= 0110b 96h = 9*16^1 + 6*16^0 = 150 |_Dec | _ Bin_ | Hex__| |_0 | _ 0000 | 00 __| |_1 | _ 0001 | 01 __| |_2 | _ 0010 | 02 __| |_3 | _ 0011 | 03 __| |_4 | _ 0100 | 04 __| |_5 | _ 0101 | 05 __| |_6 | _ 0110 | 06 __| |_7 | _ 0111 | 07 __| |_8 | _ 1000 | 08 __| |_9 | _ 1001 | 09 __| |_10 | _ 1010 | 0A _| |_11 | _ 1011 | 0B _| |_12 | _ 1100 | 0C _| |_13 | _ 1101 | 0D _| |_14 | _ 1110 | 0E _| |_15 | _ 1111 | 0F __| |_16 | _10000 | 10h__| Числа со знаком. Чтобы применить арифметические операции для представления отрицательных чисел, Существует специальная операция дополнения до двух. Для изменения знака числа выполняется инверсия, т.е. заменяют в двоичном коде 1 на 0, а 0 на 1, а затем прибавляют 1. 150 = 0096h = 00000000 1010110 в инверсии 11111111 011010101 = 0FF6Ah = -150 2.Организация памяти. Модели памяти. Любая программа начинаеться с описания модели памяти: самая простая .model tiny – сегментированнная модель памяти (каждый размером). Формирование адреса осуществляется как сегмент + смещение относительно данного сигмента. Память занимает до 4Гб. model small, В данной модели памяти код размещается в одном сегменте, а данные и стек в другом, для их описания могут применяться разные сегменты, но объединённые в одну группу. model compact, В данной модели памяти код размещается в одном сегменте, а для хранения данных может быть использовамно несколько сегментов. Таким образом, для обращения данным требуется указывать сегмент и смещение. model medium, код нескольких сегментах, а данные в одном => для доступа к данным используется только смещение. model large & model huge и код и данные могут занимать несколько сегментов. model flat – память рассмартривается как единый массив, используется 32 битные сегменты, таким образом максимальный размер сегмента содержащие и данные и код и стек достигает 4 Мб. Пример .model tiny .data – директива указания ала сегмента данных. X dB 13,10’Привет’,13,10,$ - под переменную Х выделить память 1 байт, поместить туда “Привет”, 13,10- перевод каретки, ; завершение ввода строки. .code указывает на начало сегмента кода. .startup – указывает что далее идёт текст программы. Команда пересылки данных: mov пр., аист. – Копирует источник в приёмник, значение источника не изменяеться. add пр., ист. – сложение, складывание содержимое источника с приёмником, соохраняем в нём результат. div пр., ист. – деление mul пр., ист. – умножение sub пр., ист. – вычитание В качестве приёмника может использоваться регистры. В качестве источника – регистр, переменная, символьное значение. Память с точки зрения Центрального процессора – последовательность байтов, каждому из которых присвоен свой уникальный адрес со значение от 0 до 4 Г б. Программы могут работать с памятью как с одним непрерывным массивом и как с несколькими. Во втором случае для задания адреса любого байта требуются два числа: адрес начала массива и адрес искомого байта внутри массива. Помимо основной памяти программы могут использовать регистры - специальные ячейки памяти расположенные физически внутри процессора, доступ к которым осуществляется не по адресам, а по именам. Физический адрес состоит и двух 16-битных частей: адреса сдвинутого относительно адреса сегмента влево на 4 бита, сдвиг влево на 4 бита, эквивалентен умножению на 16. Исполнительный адрес называется эффективным, он всегда кратен 16. Таким образом, физический адрес имеет разрядность в 20 бит: PA = FA*16+EA 3. Регистровая структура процессоров Intel ix86: регистры общего назначения, сегментные регистры, регистр флагов. Регистровая структура процессоров Intel ix86 EAX 31|_______15|__AH__8|AX|7__AL__|0 аккумулятор | EBX 31|_______15|__BH__8|BX|7__BL__|0 база | 32- разрядные регистры ECX 31|_______15|__CH__8|CX|7__CL__|0 счётчик | EDX 31|_______15|__DH__8|DX|7__DL__|0 регистр данных | ESI 31|_______15|________|SI|_________|0 Индекс источника | Используються в строковых операциях EDI 31|_______15|________|DI|_________|0 Индекс приёмника | EBP 31|_______15|________|BP|_________|0 Указатель базы | Используються при работе со стеком ESP 31|_______15|________|SP|_________|0 Указатель стека | AX, BX, CX, DX – 16 разрядные регистры имеют старший и младший байт. Стек – организованный специальным образом участок памяти для временного хранения данных. Действует по принципу, первый зашёл последний вышел. Команда Push ax – помещает содержимое AX в стек, Push BX, Push CX, Чтобы получить AX? Необходимо сначала взять CX и BX потом AX. POP CX, POP BX, POP AX – Pop считывание данных из стека Push a – помещает все регистры общего назначения в стек. Pop – обратная команда. Пример: mov AX,3 ; mov BX ,4; mul AX,BX; mov CX,AX; xor AX,AX Начиная с 386 процессора представляют 16 основных регистров для использования в пользовательских программах. +11 регистров для работы с мультимедиями (MMX multimedia Extension) и числами с плавающей запятой. Помимо основных регистров доступны также: регистры управления памятью CDTR, IDTR, TR, LDTR; регистры управления CR0,CR1 … CR4, отладочные регистры DR0 … DR7? И регистры общего назначения EAX, EBX, ECE, EDX, ESI, EDI, EBP, ESP. Сегментные регистры. При использовании сегментированных моделей памяти. Для формирования любого адреса необходимы 2 числа, адрес начала сегмента и смещение начального байта относительно этого сегмента. В без сегментной модели памяти адреса начала всех сегментов равны. Т.к. сегмент способны оказаться где угодно, то программа, обращаясь к ним, применяет вместо настоящего адреса начала сигмента 16-битное числоселектор. В процессорах Intel предусмотрено 6 16-битных регистров: CS, DS, ES, FS, GS,SS. Регистры CS и SS отвечают за сегмент двух типов – сегмент кода и сегмент стека. Регистр Флагов (FLAGS) 15|_0_|_NT_|_IO PL_|_OF_|_DF_|_IF_|_TF_|_SF_|_ZF_|_0_|_AF_|_0_|_PF_|_ 1_|_CF_|0 Регистр флагов представляет собой слово, каждый бит которого является флагом и устанавливается в 0 и 1 при определённых условиях, тем самым, изменяя поведение процессора. CF – флаг переноса, устанавливается в 1 если результат предыдущей операции не изменяется в приёмнике, т.е. произошёл перенос из старшего бита. PF – флаг четности 1 если младший байт результата предыдущей команды содержит чётное число битов равных 1 AF – флаг полпереноса вспомогательного переноса; 1, – если в результате предыдущее операции произошел перенос из 3-его бита в 4ый; автоматически используется командами двоичной и десятичной коррекции ZF – флаг нуля, если 1 то результат предыдущей операции 0. SF – флаг знака – всегда равен старшему биту результата ЕА – флаг ловушки, предусмотрен для работы отладчиков не использующих защищённый режим. Установка его в 1 приводит к тому, что после выполнения каждой команды управление временно передается отладчику, вызывается первое прерывание INT 1. DF - флаг направлений, контролирует поведение команд обработки строк. При единичном его значении обрабатываться 1 сторону уменьшения адресов, при 0 – наоборот. OF – флаг переполнении, 1 если результат предыдущей арифметической операции над числами со знаком выходит за допустимый для них предел. IO PL эти два флага обрабатывают уровень привилегий ввода вывода. NT – означает о вложенной задаче, применяется в защищённом режиме. 4. Директивы определения данных dB – 1 байт DW – слово DD – двойное слово DF – 6 байт DQ – учетверённое слово DT – 10 байт По данным директивам отводятся определённое место в памяти. Пример 1 Имя – директива X DB? – под переменную отвести 1 байт, в котором ничего не записывается X DB ? DB 12h | DB ‘*’ |=> X DB ? , 12h , ‘*’ , 0 DB 0 | Под X отводиться 4 байта подряд. Если под переменную X нужно поместить 8 одинаковых значений (X DB 0,0, … 0)? То удобно использовать конструкцию повторения: X DB 8 DUP (0) X DB 2 DUP (‘ab‘,?,1) X DB ‘ab‘,?,1, ‘ab‘,?,1 A BD 20 DUP (30Dup(?)) - байтовая матрица 20 на 30. Пример 2 X DW 1234h – слова в памяти храняться в перевёрнутом виде: |__34h__|__12h__| В регистре приведённый выше пример переварачиваеться. Директивы эквиваленитности: EQU: A DW ? B EQU A C DW B = С DWA Оператор указания типов PTR Если величина данных заведомо неизвестна, то существует оператор указания типа: mov [si],0 mov [si], byte PTR 0 Если необходимо изменить какое-то значение байта не трогая другое: Z DW 1234h Если mov z,0 , to то mov byte ptr z,0, получим z=00h, 12 h, а чтобы изменить младший байт: mov byte ptr z11,0 5. Способы адресации: регистровая, непосредственная, прямая, косвенная. 1. Регистровая адресация – большинство команд процессора вызываются с аргументами, которые в ассемблере называються операндами, операнды могут располагать в любых регистрах общего назначения и сегментных регистрах. 2. Непосредственная адресация – некоторые коды позволяют указывать один из операторов непосредственно в тексте программы: mov ax, 2 3. Прямая адресация – если у операнда располагающегося в памяти известен адрес, то его можно использовать. Если операнд слово находиться в сегменте, на который указывает регистр ES со смещением от начала сегмента 0001, то команда: mov ax, es, 0001 поместит это слово в регистр AX. Если в сегменте указанном в регистре ES была описана переменная word_var размером в слово, то можно записать (1), тогда ассемблер сам заменит слово word_var на соответствующий адрес. 4. Косвенная адресация – по аналогичным с регистровой адресацией операндов так же можно не указывать адрес операндов, хранить в любом регистре ax, [bx] – перемещает в регистр AX слово из ячейки памяти, селектор сегмента которых находиться в DS, а смещение в BX/ 5. Адресация по базе со сдвигом – mov ax, [bx+2] помещает в регистр AX слово, которое есть в сегменте с указанием DS со смещением на 2 больше чем число из BX. 6. Текстовый и графический режимы видеопамяти. Адресное пространство. Вывод символов и пикселей на экран. Примеры. Адресное пространство – набор адресов, которые может формировать процессор. В зависимости от модификации компьютера и состава его периферийного оборудования распределение адресного пространства может несколько различаться. Текстовая память включает 8 видео-страниц и занимает в адресном пространстве 32 кб от сегментного адреса 0BS00h. Для того, чтобы из программы получить доступ к видеопамяти, надо занести в один из сегментных регистров данных ее сегментный адрес. После этого задавая те или иные смещения, мы сможем выполнять запись в любые места видео-памяти. 1. mov ax, 0B800h mov es, ax 2. mov si, 80*2*12+40*2 ‘ смещение к центру экрана mov woid ptr es:[si], 3130h ‘ нолик на экран mov ah, 01h ‘ остановка программы для наблюдения результата int 21h 1) Непосредственная адресация в сегментный регистр запрещена, операция замещения адреса текстового режима видео-памяти в es осуществляется через промежуточный ax. 2) Для задания смещения воспользуемся базовыми и индексными регистрами. Каждая строка содержит 80 символов, а символ требует 2 байта. Запись строки в видео-память. txt DB ‘Word’ mov ax, 0B800h mov es, ax mov di,(80*10+10)*2 ‘ di – смещение в приемнике mov si,offset txt ‘ si – смещение источника mov dx,4 m: mov bl,ds:[si] mov ex:[di],bl inc di add si,2 dec dx jnz m ‘ пока dx не станет равным 0, будет возвращаться на метку. mov ah,4ch int 21h end. Графический режим В отличие от DOS, ко всем функциям, к которым мы обращаемся с помощью прерывания int 21h, в BIOS за каждым устройством компьютера закреплено свое прерывание. int 16h – с клавиатурой int 10h – обмен с видеоадаптером (работа с графическим изображением) .model iny .code .startup mov ah,13h ‘ записывает строку в текущую страницу видеобуфера. int 10h ‘ вызов BIOS mov ax, DA000h ‘ адрес графического видеорежима mov es,ax mov di,0 ‘ линию рисуем с начала экрана m: mov byte ptr es:[di],3 add di,1 cmp di,320 jnz m ‘ выполняется пока di не станет равным 320 xor ah,ah ‘ обнуление счетчика int 16h ‘ обмен с клавиатурой mov ah,03 ‘ текстовый режим int 10h ‘ вызов BIOS mov ah,1 ‘ ждет нажатия клавиши int 21h mov ah,4ch ‘ стандартная функция завершения DOS end. В фрагменте предусмотрено переключение видеоадаптера в стандартный текстовый режим. Если видеоадаптер останется в графическом режиме, это может помешать выполнению прикладных программ. 0ch – функция вывода пикселя. 7. Структура стека. Команды для работы со стеком. Синтаксис. Примеры. Стек – это некоторая область ОП, которая использует механизм безадресной записи и выборки элементов данных. Эти механизмы полагают, что элемент, который записан последним, будет всегда прочитан первым. Адрес сегмента памяти, в котором находится стек, определяется значением в регистре SS. Размер стека задается первоначальным значением регистра SP. Пара регистров SS:SP всегда указывает на текущую величину стека. Для занесения слова в стек используется команда push. При этом сначала смещение в SP уменьшается на 2, а затем проверяется запись слова. Для извлечения – pop. Сначала производится чтение слова, а затем смещение в SP увеличивается на 2. Стек растет в направлении к началу памяти и уменьшается в направлении к ее концу. Пример: push ax pop bx Эти 2 команды позволяют переписать слово из регистра ax в регистр bx. Особенности работы со стеком: 1. Значение можно произвольно изменять в программе, но этого делать не следует. 2. Необходимо обратить внимание на выделение достаточного объема памяти для стека. Язык Ассемблер допускает упрощение команды для работы со стеком. push ax | push bx | push cx | push ax bx cx | = pop ax pop bx pop cx | | | pop ax bx cx pusha – все регистры общего назначения в стек. popa – считывание данных из стека. 8. Прерывания. Прерывание – изменение текущей последовательности команд. По происхождению делится на программное, внутреннее и аппаратное. Процессор может выполнять 256 типов прерываний, каждому из которых соответствует свой вектор прерывания – дв. слово, сод-е дальний адрес в ряде регистров CS:IP, выз-й подпр-й. Под векторы прерываний в общ. пр-и адресов памяти зарезервирована область 0-3FFh Программные прерывания. Вызываются исп-м пр-мы INT XX Когда вып-ся прерывания, сначала адрес прерываний программы сохраняется в прер. Программе в паре регистров CS:IP. После обработки прерываний считается значение адреса, которое было сохранено ранее и возвр. на место прер. команды. Внутренние прерывания. Возникают при работе процессора по особым условиям. При переполнении также возможно внутреннее прерывание. Аппаратные прерывания. Инициируются клавиатурой. К ним можно отнести прерывания мыши. 9. Функции DOS: ввод с клавиатуры, печати строки, завершение инициализации. 1) Печать строки 09h ah=09h ds:dx – адрес выводимой строки. mov ah,09h mov dx,offset x int 21h В ah заносится номер функции DOS, реализующей вывод на экран строки текста. DOS, получив управление с помощью int 21h определяет номер функции именно по содержимому ah, поэтому другим регистром здесь пользоваться нельзя. Функция DOS 09h извлекает адрес выводимой строки из dx. 2) Завершение инициализации. 4ch Завершает текущую программу. В процессе завершения освобождает всю выделенную процессу память. При вызове ah=4ch al – код возврата mov ah,4ch int 21h end. 3) Ввод с клавиатуры 01h – ввод символа с эхом. Вводит символ с клавиатуры и отображает его на экран. При отсутствии символа ждет ввода. Допустимо перенаправление ввода на другое устройство. При вызове ah=01h mov ah,01h int 21h Пример: Программа-диалог, где встречаются все три функции. .model tiny .data txt1 DB ‘This is time am – [y/n]$’ txt2 DB 13,10 ‘Good morning’,13,10,’$’ txt3 DB 13,10 ‘Good afternoon’,13,10,’$’ .code .startup mov dx, offset txt1 ‘ вывод строки txt1 mov ah,09h int 21h mov ah,01h ‘ ввод с клавиатуры y или n int 21h cmp al,’y’ jnz m1 cmp al,’n’ jnz m2 m1: m2: m3: mov dx, offset txt3 jmp m3 mov dx, offset txt2 jmp m3 mov ah,09h ‘ вывод строки txt2 или txt3 jmp m3 mov ah,4ch ‘ завершение инициализации int 21h end. 10. Команды двоичной арифметики add пр, ист - сложение. Рез-т в пр., не изменяя содерж. ист. adс пр, ист - слож-е с переносом. Аналог. предыд. Вып-т сложение пр, ист и флага CF. Для слож-я чисел повыш. точности. ех: сложением 2 64-битн. ч-ла. edx:eax ebx:ecx Пусть одно знач-е наход. в паре р-р edx и eax, а др. в паре р-в ebx:ecx add eax,ecx adc edx,ebx Если при слож. младш. двойн. слов произошел перенос из старшего разряда, то он будет учтен командой adc. xadd пр, ист - обменять между собой и сложить. Вып-т слож-е, а сумму операндов в пр. Ист. всегда р-р, пр. мб рр или переменная. sub пр, ист - вычитает. Рез-т в приемник sbb пр, ист - вычитание с займом. Аналог. пред-й, вычит. из пр. знач-е ист. и доп-но вычитает знач. флага CF. Для вычит. 64бит ч-л. 1) imul ист. - команда умн-я ч-л со знаком. Ист. явл. р-р или перем. умнож. al, ax или eax в завис-ти от разм. опер. ax, dx:ax edx:eax imul bl 2) imul пр, ист - ист. - это число, р-р или перем. умнож на пр. - р-р. Рез-т заносится в пр. 3) imul пр, ист1, ист2 - ист1 умнож. на ист2 только ч-ло, рез-т в пр, только р-ре. mul ист - умн-е чисел без знака. Сод-е ист-ка, р-р или пер-я, на р-р al, ax или eax mov ax, 2 mov bx, 3 mul bx idiv ист - целочисл. деление со знаком р-ра. ae, ax или eax на ист., р-р или пер-ю, а остаток в ah, dx или edx соотв. div ист. - целочисл. деление без знака inc пр. - вызывают инкрименты. Увел. пр., р-р или пер-ю на 1. Флаг CI в данной команде не затрагивается. Остальные флаги устан. в соотв. с рез-том. dec пр. - уменьш. на 1 neg пр. - изменение знака. Выполн. над числом в пр., операцию дополнения до 2х. cmp пр, ист - сравнение. Сравнить пр. и ист. путем вычитания ист (число, р-р или перем) из пр. (р-р и пер-я) mov cx, 32 cmp cx, 0 CMPXCH6 пр, ист - сравнить и обменять сравн. знач-е в рре al, ax и eax копир. в пр. Флаг СF устан. = в противн. случае содерж. пр. копир. в al, ax или eax и флаг ZF устан. =0 CMPXCH68B пр. - сравн. и обмен. 8 байт - выполн. сравн-е содерж. edx, eax как 64битн. ч-ла с пр. (8ми байт пер-яв памяти). Если = ecx:ebx как в 4битн. число, помещ. в пр., в противн. случае, пр. копир. в cdx eax. 11. Команды десятичной арифметики языка assembler. Синтаксис. Примеры. Процессоры поддерживают операции с двумя форматами десятичных чисел: - неупакованное двоично-десятичное число, т.е. байт принимает значения от 00 до 09h - упакованное двоичное число (00—99h) Все обычные арифметические операции над такими числами приводят к неправильным результатам, например если 19h+1, то 1ah, а на самом деле 20h Коррекция после сложения. DAA – если эта операция выполняется после ADD и в регистре al находится сумма двух упакованных чисел, то в al записывается упакованное двоично-десятичное число, которое должно стать результатом сложения. DAS – коррекция после вычитания AAA – ASCII коррекция после сложения AAS - ASCII коррекция после вычитания AAM - -//- после умножения AAD - -//- после деления AAA – коррекция суммы двух неупакованных двоичнодесятичных чисел. Example: mov ax, 5 mov bx, 6 add ax, bx ; ax = 000Bh aaa; ax = 0101 AAD – выполняет коррекцию неупакованного двоичнодесятичного числа в регистре ax так, чтобы последующее деление привело к десятичному результату. Example: mov ax, 0205 mov be, 5 aad ; ax = 19h div be ; ax = 0005 15. Безусловный переход 12. Логические команды языка ассемблер. Синтаксис. Примеры. Первоочередное назначение логических операций в микропроцессоре 8088 - работа с битами. Ни одна из арифметических команд не может непосредственно выделить или изменить единственный бит, а логические команды позволяют программе обрабатывать отдельные биты. Четырьмя основными логическими командами являются AND (и), OR (или), XOR (исключающее или), NOT (не). Эти четыре команды работают непосредственно с нулями и единицами двоичного кода. Простейшая функция выполняется командой NOT. Эта команда основывается на определении единицы и нуля, как истины (TRUE) и лжи (FALSE) соответственно. Предложение NOT TRUE (не истина) - это FALSE (ложь), а предложение NOT FALSE (не ложь) - это TRUE (истина). Команда NOT инвертирует все биты числа данных. Иначе говоря, команда NOT эквивалентна вычитанию данных из величины, состоящей из всех единиц. действует на единственный бит. Значение Not 0 1 1 0 Остальные три логические функции имеют два операнда.Так будут выглядеть результаты действий, произведенных каждой функцией над парой бит. X Y X AND Y X OR Y X XOR Y 0 0 0 0 0 0 1 0 1 1 1 0 0 1 1 1 1 1 1 0 16. Команды сравнения и передачи управления. Если переход осуществляется только при выполнении некоторого условия и не осуществляется в противном случае, то такой переход называется условным. Условный переход обычно реализуется в два шага: сначала сравниваются некоторые величины, в результате чего соответствующим образом формируются флаги (ZF, SF и т. д.), а затем выполняется собственно условный переход в зависимости от значений флагов. Поэтому мы сейчас рассмотрим и команду сравнения, и команды условного перехода. Сравнение (compare): CMP op1,op2 Эта команда эквивалентна команде SUB op1,op2 за одним исключением: вычисленная разность op1-op2 никуда не записывается. Поэтому единственный и главный эффект от команды сравнения - это установка флагов, характеризующих полученную разность, или, что то же самое, характеризующих сравниваемые величины ор1 и ор2. Как формируются флаги при вычитании, мы уже рассматривали (см. лаб. 5), поэтому повторяться не будем. Что же касается команд условного перехода, то их в ПК достаточно много, но в ЯА они все записываются единообразно: Jxx <метка> где операнд указывает метку той команды программы, на которую надо сделать переход в случае выполнения некоторого условия, а мнемокод начинается буквой J (от jump), за которой следует одна или несколько букв, в сокращенном виде описывающих это условие. Все команды условного перехода можно разделить на три группы. В первую группу входят команды, которые ставятся после команды сравнения. В их мнемокодах с помощью определенных букв описывается тот исход сравнения, при котором надо делать переход. Это такие буквы: Е - equal (равно) N - not (не, отрицание) G - greater (больше) - для чисел со знаком L - less (меньше) - для чисел со знаком А - above (выше, больше) - для чисел без знака В - below (ниже, меньше) - для чисел без знака Как видно, для условий "меньше" и "больше" введены две системы обозначений. Это связано с тем, что после сравнения чисел со знаком и сравнения чисел без знака надо реагировать на разные значения флагов. Отметим, что одна и та же команда условного перехода может иметь в ЯА несколько названий-синонимов. Это объясняется тем, что одно и то же условие перехода может быть сформулировано по-разному. Например, условие "меньше" - это в то же время и условие "не верно, что больше или равно", поэтому переход по меньше для знаковых чисел обозначается и как JL, и как JNGE. Какое из этих названий-синонимов использовать - это личное дело автора программы. Теперь приведем названия всех команд условного перехода, используемых после команды сравнения (через косую черту указаны названия-синонимы): 96h and 0Fh 1001 0110 and 0000 1111 = 0000 0110 = 6h 1001 0110 or 0000 1111 = 1001 1111 = 9Fh 1001 0110 xor 0000 1111 = 1001 1001 = 99h 13. Команды пересылки данных. Синтаксис. Примеры. Оператор PTR. Mov – замещает приемник на источник. Значение источника сохраняется. В зависимости от описания операторов пересылается слово или байт. Команда не воздействует на флаги процессора. Приемник – регистр, переменная. Источник – регистр, переменная, число. movs – пересылка данных из строки в строку movsb байта movsw слова mowsd двойного слова mov пр., ист. – синтаксис mov ax,bx mov ax,5 mov ax,z Примеры: MOV АХ,500 ; АX:=500 MOV BL,DH ; BL:=DH PTR – задания типа переменной или метки. Если операнды описаны по разному или режим адресации не позволяет однозначно определит размер операнда. Тип PTR выражение – синтаксис Выражение – любой операнд Тип – byte, word, dword, qword (для операндов), near, far или proc (для меток или имен процедур). mov byte ptr es:[di],3 mov копирует источник в приемник. оператор указания типа PTR (от pointer, указатель), который записывается следующим образом: <тип> PTR <выражение> где <тип> - это BYTE, WORD или DWORD (есть и другие варианты, но мы их пока не рассматриваем), а выражение может быть константным или адресным. Если указано константное выражение, то оператор "говорит", что значение этого выражения (число) должно рассматриваться ассемблером как величина указанного типа (размера); например, BYTE PTR 0 - это ноль как байт, a WORD PTR 0 - это ноль как слово (запись BYTE PTR 300 ошибочна, т. к. число 300 не может быть байтом). Отметим, что в этом случае оператор PTR относится к константным выражениям. Если же в PTR указано адресное выражение, то оператор "говорит", что адрес, являющийся значением выражения, должен восприниматься ассемблером как адрес ячейки указанного типа (размера); например: WORD PTR A адрес А обозначает слово (байты с адресами А и А+1). В данном случае оператор PTR относится к адресным выражениям. 14. Сдвиговые операторы. Синтаксис. К их числу относят shl, sal, shr, sar, ror, rol, rcr, rcl. shl, sal – осуществляют сдвиг влево числа в первом операнде на 1 бит, либо на n>1 бит. В последнем случае число n должно быть положительно записано в регистр cl, который задается в качестве второго операнда. Выделяется левый бит помещается в с освобожденный правый бит – в нуль. mov al, 10010001b shl al,1; al=00100010b и с=1 (al=al*2) shl al,1; al=01000100b и с=0 (al=al*2) sal al,1; al=10001000b и с=0 (al=al*2) Сдвиг числа влево на 1 бит эквивалентен умножению на 2. mov al,10010001b mov cl,3 shl al,cl; al=10001000b и с=0 (al=al*8) shr подобна shl, но сдвиг осуществляется вправо. Сдвиг вправо эквивалентен делению на 2. sar так-же подобно shr, но в отличии от нее не изменяет ставший бит. mov bl,10001001b sar bl,1; bl=11000100b; c=1 Использование этой команды позволяет сохранять знак результата. Команды ror, rol, rcr, rcl называют командами вращения. Поворот битов осуществляется либо на 1, либо на число, значащееся в регистре cl. ror подобна shr за исключением того, что правый выдвинутый бит наряду с параметром с помещается в левый выдвинувшийся бит. rcr и rcl – возвращает бит через признак переноса с. rol – левый выдвинутый бит наряду с с помещается в правый выдвинутый бит. Команды машинной программы выполняются в том порядке, как они записаны в памяти. Но время от времени этот естественный порядок выполнения команд приходится нарушать с тем, чтобы следующей выполнялась не очередная команда программы, а какая-то иная. Такую возможность обеспечивают команды перехода. Переходы бывают условными и безусловными. Если переход делается только тогда, когда выполнено некоторое условие, то такой переход называется условным, а если он делается независимо от каких-либо условий, то это безусловный переход. Отметим, что в ПК команды перехода не меняются флаги: какое значение флаги имели до команды перехода, такое же значение они будут иметь и после нее. Дальше мы уже не будем об этом упоминать. Изучение команд перехода начнем с безусловного перехода. В ПК имеется несколько машинных команд безусловного перехода, но в ЯА они все обозначаются одинаково: Безусловный переход (jump): JMP op Здесь операнд тем или иным способом указывает адрес перехода, т. е. адрес команды, которая должна быть выполнена следующей. Различают следующие переходы: - short (короткий). Исп-ся, если адрес перехода находится в пределах со значением -128 to +127 от к-ды jmp - near (ближний) – если адрес перехода находится в том же сегменте памяти, что и к-да jmp. - far (дальний) – адрес перехода в другом сегменте. Может выполняться в том же самом сегменте при условии, что в сегментной части операнда указано число, совпадающее с текущим значением регистра cs. Мнемокод Содержательное условие для перехода после СМР ор1,ор2 JE JNE op1 = op2 op1 <> op2 JL/JNGE JLE/JNG op1 < op2 op1 <= op2 JG/JNLE JGE/JNL op1 > op2 op1 <= op2 JB/JNAE JBE/JNA op1 < op2 op1 <= op2 JA/JNBE JAE/JNB op1 > op2 op1 <= op2 Состояние флагов для перехода для любых чисел ZF=1 ZF=0 для чисел со знаком SF<>OF SF<>OF или ZF=1 SF=OF и ZF=0 SF=OF для чисел со знаком CF=1 CF=1 или ZF=1 CF=0 и ZF=0 CF=0 (Объясним, к примеру, почему в команде условного перехода "по меньше" для знаковых чисел (JL) проверяется соотношение OF<>SF. Если в команде СМР op1,op2 сравниваемые числа трактуются как знаковые, тогда возможны две комбинации флагов, соответствующие условию op1<op2. Во-первых, если при вычитании op1op2 не было переполнения мантиссы (OF=0), тогда флаг SF фиксирует настоящий знак разности op1-op2 и потому SF=1 означает, что op1-op2<0, т. е. op1<op2. Во-вторых, если при вычитании произошло переполнение мантиссы (OF=1), тогда результатом команды будет число с противоположным знаком, чем у настоящей разности, и поскольку флаг SF фиксирует не знак настоящей разности, а знак результата команды, то условие SF=0 означает, что у искаженного результата знак положителен, а значит, у настоящей разности знак отрицателен, т. е. op1<op2. Итак, условию op1<op2 соответствует либо OF=0 и SF=1, либо OF=1 и SF=0, что можно записать более коротко: OF<>SF. Именно это условие и указано в таблице для команды JL.) Пример. Пусть X, Y и Z - переменные размером в слово. Требуется записать в Z максимальное из чисел X и Y. Решение этой задачи различно для чисел со знаком (см. слева) и для чисел без знака (см. справа), т. к. приходится использовать разные команды условного перехода: ;числа со знаком ;числа без знака MOV АХ,Х MOV АХ,Х СМР AX,Y ;х=у? СМР AX,Y JGE М ;х>=у а M JAE M MOV AX,Y MOV AX,Y M: MOV Z,AX M: MOV Z,AX Во вторую группу команд условного перехода входят те, которые ставятся после команд, отличных от команды сравнения, и которые реагируют на то или иное значение какого-нибудь определенного флага. В мнемокодах этих команд указывается первая буква проверяемого флага, если переход должен быть выполнен при значении 1 у флага, либо эта буква указывается с буквой N (not), если переход надо сделать при нулевом значении флага: Мнемокод Условие Мнемокод Условие JZ JS JC JO JP перехода ZF=1 SF=1 CF=1 OF=1 PF=1 JNZ JNS JNC JNO JNP перехода ZF=0 SF=0 CF=0 OF=0 PF=0 (Замечание. Легко заметить, что следующие пары мнемокодов эквиваленты: JE и JZ, JNE и JNZ, JB и JC, JNB и JNC.) Пример. Пусть А, В и С - беззнаковые байтовые переменные. Требуется вычислить С=А*А+В, но если ответ превосходит размер байта, тогда надо передать управление на метку ERROR. Возможное решение этой задачи: MOV AL,A MUL AL JC ERROR ;A*A > 255 (CF=1) а ERROR ADD AL,B JC ERROR ;перенос (CF=1) а ERROR MOV C,AL И, наконец, в третью группу входит только одна команда условного перехода, проверяющая не флаги, а значение регистра СХ: JCXZ <метка> Действие команды JCXZ (jump if CX is zero) можно описать так: if CX=0 then goto <метка> 17. Организация циклов. Синтаксис. Примеры. Цикл – выполнение некоторого участка программы заданное число раз. LOOP выполняет декремент содержимого cx (счетчик цикла), и если сх не равно 0, то осуществляет переход на указанную метку. LOOPE = LOOPNE > < LOOPZ 0 LOOPNZ не 0 Пример: программа выводит на экран последовательность символов mov cx,223 ‘ счетчик цикла mov si,0 ‘ индекс элемента в массиве mov al,32 ‘ код первого символа. fill: mov symbols[si],al inc al ‘ код следующего элемента inc si ‘ сдвинем массив на 1 байт loop fill Symbols db 223 dup (‘*’) – заполняемый массив mov ex,n – число повторений m: … … loop m (Синтаксис) 18. Строковые команды. Синтаксис. Все команды для работы со строками считают, что строка источник находится по адресу в паре регистров ds:esi, т.е. в сегменте памяти указанного в ds со смещением в si, а строка приемник cs:di или cs:edi все строковые команды работают только с одним эл-том строки: байтом, словом или 2-м словом за один раз. movs пр, ист - копирование строки movs b – копирует один байт movs w – копирует 1 слово movs d – копирует 2ое слово.1 1 из последовательности по адресу ds:si в cs:di или ds:esi в cs:edi при использовании movs Assembler указывает параметры операндов. с mp s пр, ист. cmp sb cmp sw cmp sd2 2 команды сравнения. lods ист. lods b lods w lods d3 3 команды чтения из строки (байта, слова, 2сл). Копируют байт, w, dw, из памяти по адресу ds:si или ds:esi в регистр al, ax или eax stos пр stos b stos w stos d4 4 запись в строку. Копирует AL, AX или EAX в cs:di, cs:edi ins ист, dx ins b ins w ins d5 5 чтение из порта I10, считывает из порта I10(номер указан в dx) в память по адресу cs:di (cs:edi) outs dx, пр outs b outs w outs d6 6 запись строки в порт I10 из памяти по адресу ds:si (ds:esi) 19. Расширение MMX Начиная с процессоров Intel Pentium все процессоры поддерживают MMX, предназначенные для увеличения эффективности программ, работающих с большими потоками данных. (обработка изображений, звук, видео). MMX – представляет несколько новых типов данных, регистров и команд, позволяющих осуществить логические и арифметические операции на несколькими числами одновременно. Регистры MMX. Расширение MMX включает в себя 8 64-х битных регистров общего назначение. MM 7,MM 6,MM 5,MM 4,MM 3,MM 2,MM 1,MM 0. 8 регистров точно совпадают с регистрами FPU R(0)-R(7). При записи числа в регистр MMX, оно записывается в биты от 0-63 соответствующего регистра FPU. Типы данных. 1). Учетверенное слово (8 байт) 64-битные числа. 2). Упакованные двойные слова (2 32-битных двойных слова упаковываются в 64 битный тип данных). 3). Упаковываются слова ( 4 16-битных слова, упакованное в 64-битный тип данных ). 4). Упакованные байты (8 байт, упакованные в 64-битный тип данных). Команда MMX перемещает упакованные данные в память или в обычные регистры. Выполняет арифметические и логические операции над каждым элементом в отдельности. MOV D пр. ист. – пересылка двойных слов. Команда копирует двойное слово из источника в приемник. Регистры MMX, обычные регистры или переменные. Если приемник регистр MMX соответствует двойному слову, то это двойное слово записывается в его младшую половину. MOV Q пр .ист. – копирует учетверенное слово из источник в приемник. Оба операторов не могут быть переменными. Арифметические команды MMX. PADDB – пр. ист. PADDW - пр. ист. – СЛОЖЕНИЕ PADDD - пр. ист. Данные команды выполняют сложение отдельных элементов данных: данных, слов, двойных слов. Регистр MMX или переменная (источник). Приемник – регистр MMX. PSUBB - пр. ист. PSUBW - пр. ист PSUBD - пр. ист PMULHW пр. ист PMULLW пр. ист - ВЫЧИТАНИЕ - УМНОЖЕНИЕ Источник регистр ли переменная (MMX). Приемник регистр - 20. Структура резидентных программ. Загрузка и выгрузка резидентной программы. TSR (резидентные) программы делаются путем ввода 27 прерывания. При этом программа остается в области памяти, которую DOS в дальнейшем не использует. Большинство TSR программ вызывается с помощью превывания, которое может быть сформировано несколькими способами. Наиболее распространенными являются прерывания по таймеру, прерывания клавиатуры и печати. Для TSR программ, формирующих изображение на экране обычно используются прирывания клавиатуры или печати экрана, поскольку позволяет вызывать программу TSR путем одиночного нажатия клавиши. Когда происходит прерывание, то любые другие прерывания запрещаются. Программа обработки прерывания должна завершиться командой IRET/ Когда TSR программа выполняется, ни DOS, ни процессор не знает, что программа станет резидентной, пока программа не завершается используемой TSR функцией. Существует две разновидности TSR программ: программа обслуживания и резидентные утилиты. 1). Программа обслуживания прерывания ISR. Обслуживает прерывание генерируемым аппаратным устройством и обычно существуют для поддержки аппаратного устройства ISR, соответствующего системному прерыванию называется mouse com. Обрабатываются также программные прерывания когда прикладные программы определяют позицию мыши и состояние ее кнопок. 2). Резидентные утилиты могут включать несколько таких же ISR программ. Резидентные утилиты – это ISR, которое обычно не обслуживают специальной аппаратурой, а соответствует определенной назначенной клавишей и запускают свои процессы по запуску пользователя. Утилиты сохраняются состояние компьютера на момент прерывания и восстанавливают предыдущее состояние по завершению. Типичная резидентная программная утилита используется для связи с пользователем, включающее технику окон. Требования к резидентным программам. 1). Размеры программы: Если программы не может быть скомпилирована и связан с моделью очень малой памяти (tiny) 64 кБ кодов и стека, то она вероятна не должна быть TSR. 2). Ресурсы, необходимые программе: Если программа требует много памяти или ее производительность уменьшается, когда память ограничена, то не должна быть резидентной. Построение резидентной программы. Чтобы стать резидентной TSR программа должна объявить себе резиденты, т.е. когда программа выполнилась, связалась со своими векторами прерывания и сделала все, что требовалось сделать для резидентной программы, она должна вызвать одну из двух TSR функций: int 31h, int 27h. Эти функции не могут оставлять резидентные программы размером не больше 64 кБ, поскольку резидентные программы уменьшают объем основной памяти. Их всегда пишут на Ассемблере и оптимизируют для достижения минимального размера. Никогда не известно по каким ????? оказываются загруженные в разное время резидентные программы, поэтому единтсвенным несложным способом получения управления является механизм прерывания. Принято разделять резидентные программы на активные и пассивные, в зависимости от того перехватывают ли они прерывания от внешнего устройства или получают управление. Только если программа специально вызовет команду IRET с нужным номером прерывания и параметром. Общий план TSR программ. Все TSR программы обычно строятся из 2 разделов: 1). Для инициализации TSR программы и возврата управления в DOS путем использования целенаправленного системного вызова. Эта часть не выполняется до тех пор, пока не возникает необходимость перезагрузки программ. При этом производится запись адреса точки входа TSR программы и соответствующее место таблицы векторов. 2). Занимается формированием изображений. При этом почти всегда используются окна и программы управления окнами. При этом изображение на экране восстанавливается после завершения работы прикладной части У большинства TSR программ прикладные части представляют собой утилиты формирования изображений (F.E. калькулятор). Они восстанавливают изображения на экране в том же виде, каким оно было перед запуском этих программ. Выгрузка резидентной программы из памяти. Чтобы выгрузить необходимо сделать 3 действия: 1). Закрыть открытые программой файлы и устройства. 2). Восстановить все перехваченные векторы прерываний. 3). Освободить всю занятую программой память. Трудность может вызвать 2 шаг: Загрузка резидента, после него может быть загружены другие программы, перехватившие те же прерывания. Если в такой ситуации восстановить вектор прерывания в значение, которое он имел до загрузки программы, то загруженные позже программы не будут получать управление, т.е. не будут получать управление по тем же прерываниям, которые у них совпали с прерываниями, перехваченные вашей программой. Таким образом, если хоть 1 вектор прерывания не указывает на ваш обработчик, выгрузить резидентную программы невозможно. Последний шаг можно сделать вручную, вызывая функцию DOS 49h на каждый блок памяти, который программа выделила через функцию 48h. Другой способ. Вызов функции 4ch (выгрузка программы автоматически) и объявив резидента текущим процессом. 21. Драйверы устройств DOS. Формат и загрузка драйвера устройства. Файл IBMIO.COM включает резидентные драйвера устройств, формирующие базовую систему ввода/вывода BIOS (DOS). Эти драйвера вызываются системой для обработки запросов прикладных программ на ввод/вывод. Возможности DOS позволяют вводить новые устройства. Включаются устройства командной строкой DEVICE в файле config.sys. Во время начальной загрузки должны присутствовать минимум 5 резидентных драйверов. Все они находятся в связанном списке. Заголовок каждого содержит двойное слово-указатель на следующий. Заголовок последнего содержит маркер конца списка 4fh (все биты установлены). Каждый драйвер в этой цепи имеет 2 точки входа. Указатели на программу стратегии и программу прерывания. DOS сразу после программы стратегии вызывает программу прерывания. Программа стратегии выстраивает очередь из запросов и быстро возвращает управление. Дальше вся ответственность на выполнение поступивших запросов лежит на программе прерывания, которая считывает запросы из прерывания. Запросы различаются размером и форматом, и состоят из двух секций: заголовок запроса, имеющий стандартный формат, для всех запросов и конкретная информация к запросу. Формат драйвера устройства. Драйвера устройств – это программный сегмент, отвечающий за коммуникацию между DOS и аппаратной частью. Он имеет в начале заголовок, идентифицирующий его как драйвер устройства , определяющий точки входа и различные атрибуты файла. Драйверы символьного устройства и блокового устройства. Символьные устройства осущ-ют послед. ввод/вывод. Такими устройствами являются console, последовательный порт, часы и принтер. Блоковые устройства включают все дисководы и обозначаются A,B,C. Загрузка драйверов. Происходит во время начальной загрузки системы. Загрузка выполняется кодом инициализации, находящимся в файле IBMIO.COM и обрабатывающем файл config.sys DOS вызывает драйвера устройств следующем образом: 1). DOS делает дальнейший вызов программы-стратегии. 2). DOS передает информацию из заголовка запроса программе-стратегии. 3). DOS делает дальнейший вызов программе-прерывания. 22. Программирование на уровне портов ввода/вывода. Системный таймер. Последовательный порт. Параллельный порт. Системные таймеры. Компьютеры содержат 2 устройства для управления процессом: Часы реального времени получают питание от аккумулятора на материнской плате. Данной устройство можно применять для определения текущей даты, времени. Установки будильника с целью выполнения какого-либо действия и для вызова прерывания IRQ8 или INT4Ah. Каждую миллисекунду системный таймер используется одновременно для управления контроллером прямого доступа к памяти, для управления динамиком и как генератор импульсов, вызывающих прерывание IRQ0 или INT8h 18.2 раз в секунду. Системный таймер на уровне портов ввода/вывода используется только как средство определения установки текущего времени и организации задержек. Обработка прерываний системного таймера. При инициализации BIOS устанавливает свой обработчик для прерывания таймера. Этот обработчик каждый раз увеличивает на 1 текущее значение 4-х байтовой переменной, располагающейся в области данных BIOS по адресу 0000:046ch – сегмент: смещение (счетчик таймера). Если этот счетчик переполняется из-за того, что прошло более 24 часов с момента запуска таймера, в ячейку по адресу 0000:0470h заносится значение единица. Другое действие, выполненное стандартным образом прерывания таймера – это контроль за работой двигателей и если после последнего обращения к гибким магнитным дискам прошло более 2 секунд, ячейка с адресом 0000:0440р содержит время, оставшееся до включения двигателя. Это время постоянно уменьшается обработчиком прерывания таймера. Последнее действие INT ch выполняет обработчик. После инициализации системы вектор 1ch указывает на команду IRET? То есть обработчик ничего не делает. Прерывание INT1ch вызывается обработчиком прерывания INT8h до сброса контроллером прерываний, поэтому во время выполнения прерывания INT1ch все аппаратные прерывания запрещены. Перед завершением его работы необходимо сбросить контроллер прерываний. Сделать можно следующим образом: mov al, 20h out 20h, al 8253 8254 Эти две микросхемы состоят из 3 независимых каналов или счетчиков. Каждый канал содержит регистры. Состояние каналов RS 8 разрядов, управляющего слова RSW 8 разрядов, буферный регистр OL 16 разрядов, регистр-счетчик CE – 16 разрядов, регистр const пересчета CR – 16 разрядов. Каналы таймера подключается к внешним устройствам при помощи 3 линий, управляющий вход GATE, CLOCK – ход тактовой частоты, OUT - выход таймера. Каналы таймеров. 0 – используется в системных часах времени суток 18,2 Гц – тактовая частота 1 – используется для регенерации содержимого памяти допуска DMA, который выполняет обновления содержимого памяти компьютера. 2 – подключен к громкоговорителю компьютера и может быть использован для генерации звуков и музыки или как генератор случайных чисел. Таймеру соответствует 4 порта ввода/вывода: 40h – 0 41h – 1 42h - 2 43h – управляющий регистр Последовательный порт: Каждый компьютер оснащен двумя портами для мыши и модема, а также для других дополнительных устройств или соединения компьютеров между собой. Для работы с устройствами, такими как мышь применяются драйвера, которые «общаются» с последовательными портами на уровне порта вводы/вывода и представляют собой программу, некоторый набор функций, связанных с языком высокого уровня. Таким образом прямая работа с последовательными портами оказывается необходимой только при написании таких драйверов или для работы с нестандартными устройствами, или модемами. Параллельный порт. Обнаруж. только 3 пар. порта: LPT1, LPT2, LPT3. таблица базовых адресов распол. по адресу 0000 0400h. LPT1 - 378h, LPT2 - 278h, LPT3 - 3BCh. LPT3 - это уже редкость, на плате адаптера монохромного дисплея. LPT1(IRQ7) / int 0Fh. LPT2(IRQ5) / int 0Dh. LPT1 доступ. и для записи, и для чтения. Предн. для вывода данных. Прг. может прочитать байт, запис. в данный порт. Порт 37Ah примен. для управл. принтером, подкл. к парал. адаптеру. Для того, чтобы вывести символ на принтер, прг. должна убедиться, что уровень сигнала на контакте под номером 7 (busy(379h)) равен 0, а ур-нь сигнала нна линии АСК (в контакт) = 1. После этого следует установить код выходн. символа на линиях data(376h) (от 2 по 9 контакт). Линию strobe необх. привести в сост-е логич. 0 (1й контакт). При этом выходной символ запишется во внутр. буфер принтера и сохр. в буфере ~0,5 мс (столько же, сколько поставлялся). Этот бит strobe сбрасывается потом (после отпечатки) в 1 и дает готовность к след. символу. 23.Команды ввода-вывода Все устройства ЭВМ принято делить на внутренние и внешние. Внутренние устройства - это центральный процессор (ЦП) и оперативная память, а внешние -все остальные устройства (внешняя память, клавиатура, дисплей, принтер и т. д.). В широком смысле, под вводомвыводом понимается обмен информацией между ЦП и любым внешним устройством. При этом "отсчет" ведется от ЦП: ввод - это передача данных в ЦП из внешнего устройства, а вывод - передача данных из ЦП во внешнее устройство. В ПК передача информации между ЦП и внешними устройствами, как правило, осуществляется через порты. Порт - это некоторый регистр размером в байт или слово, причем этот регистр находится вне ЦП и не имеет никакого отношения к обычным регистрам типа AX, SI и т. п. Вообще-то все порты являются байтовыми, но два соседних порта рассматриваются как порт размером в слово. Порты нумеруются, их номера - от 0 до 0FFFFh. Таким образом, потенциально может быть 65536 портов, однако реально их значительно меньше (несколько десятков). С каждым внешним устройством связан свой порт или несколько портов, их номера заранее известны. Как ЦП, так и внешнее устройство может записывать информацию в порт и может считывать из него. Со стороны ЦП (а точнее, той программы, которую он выполняет) эти операции осуществляются с помощью следующих машинных команд: Чтение из порта (ввод): IN AL,n или IN AX,n Запись в порт (вывод): OUT n,AL или OUT n,AX По команде IN в регистр AL(AX) переносится содержимое порта с номером n, а команда OUT реализует обратное действие: в порт с номером n записывается содержимое регистра AL(AX). Номер порта (n) в этих командах может быть задан двояко - либо явным числом от 0 до 255, либо регистром DX, значение которого и трактуется как номер порта. Например: IN AL,97h ;AL:= порт 97h MOV DX,836 OUT DX,AX ;порт 836:=AX Первый вариант операнда n используется, когда номер порта небольшой и известен заранее, а второй вариант когда номер порта может быть любым или когда он становится известным только во время счета программы. Сценарий ввода-вывода через порты существенно зависит от специфики того внешнего устройства, с которым ведется обмен, но достаточно типичным является следующий сценарий. Часто ЦП связан с внешним устройством двумя портами: через один передаются данные - это порт данных, а через другой пересылается всякого рода управляющая информация - это порт управления. Когда ЦП (а точнее, программа, которую он выполняет) хочет начать обмен с каким-то внешним устройством, то он записывает в порт управления этого устройства определенную комбинацию битов, которая трактуется как призыв к установлению связи. Если устройство функционирует и не занято, то в ответ оно записывает в этот порт другую комбинацию битов, сигнализирующую о том, что оно готово к обмену. ЦП же, выждав определенное время, считывает информацию из порта и, если там оказался сигнал о том, связь установлена, начинает собственно обмен. Пусть ЦП хочет что-то вывести. Тогда он записывает в порт управления комбинацию символов, трактуемую как команда "выводи", а в порт данных - выводимую величину (например, код символа). Внешнее же устройство, считав из портов эту информацию, записывает в порт управления сигнал "занято" и начинает собственно вывод (например, печатает символ на бумаге). В это время ЦП либо переходит в состояние ожидания, опрашивая (считывая) в цикле порт управления, либо занимается другой работой до тех пор, пока в порте управления не сменится сигнал "занято". Когда внешнее устройство закончит вывод, то оно записывает в этот порт сигнал об успешном завершении своей работы или сигнал об ошибке (например, порвалась бумага в принтере). Далее ЦП продолжает свою работу (например, осуществляет следующую операцию обмена) или как-то реагирует на сбой в работе устройства. Осуществлять подобным образом ввод-вывод в каждой программе - занятие трудоемкое. Оно требует знания многих технических деталей - номеров портов, управляющих сигналов и сигналов ответа, порядка опроса портов и т. п., причем эта информация различна для разных внешних устройств. А, кроме того, в каждой новой программе приходится заново описывать все действия, связанные с вводом-выводом, что, конечно, накладно. В то же время в большинстве программ используются, в общемто, одни и те же операции ввода-вывода. Учитывая все это, поступают так: один раз описываются часто используемые операции ввода-вывода, которые скрывают всю "кухню" работы с портами, и эти операции включают в состав операционной системы (ОС), постоянно находящейся в ОП, чтобы ими могла пользоваться любая программа, выполняемая на ЭВМ. Такой способ существенно упрощает жизнь программистов, поэтому обычно используют только эти операции и не пользуются портами напрямик. С портами работают лишь тогда, когда надо реализовать какой-нибудь необычный, экзотический ввод-вывод. 24. Переферийные устройства. Структура FDD, HDD, CD-ROM. FDD. Используется FDD (3.5) 1,44 Мб. Принцип действия – состоит из большого числа механических элементов (конструктивно) и малого числа электронных. Имеются 4 элемента: 1 – рабочий двигатель. Включается только тогда, когда в дисковод вставлена дискета. Двигатель обеспечивает постоянную скорость вращения дискеты 3.5 д. = 300 об./мин., 5.25. = 360 об./мин. 2 – рабочая головка. Предназначена для записи или чтения данных. Дисковод оснащен двумя комбинированными головками для чтения/записи каждая, которая располагается над рабочей поверхностью дискеты. 3 – шаговые двигатели. Движение и позиционирование головок осуществляется с помощью двух двигателей. 4- управляющая электроника. Включает функцию передачи сигналов контроллеру, т.е. отвечает за преобразование информации, которую считывает и записывает головка. Логическое разбиение дискет. исковод служит для записи/считывания информации, содержащейся на дискете. Для записи и чтения информации необходимо разбиение дисткеты на несколько частей. Данное разбиение выполнятеся с помощью форматирования. При этом дискета разбивается на дорожки и сектор Кол-во информации, которое может быть записано в сектор произвольно DOS составляет 512 Б. Формула, которая считает общий дисекеты Число сторон*число дорожек*число секторов*число байтов в секторе = V дискеты HDD. Самый первый винчестер был емкостью 10 Мб. Конструкция: она подобна дискетам (рабочий двигатель, рабочая головка, шаговые двигатели, управляющая электроника). В них инф-ия записывается на магнитный слой диска, но в отличие от дискет накопитель сделан из жесткого материала. В корпусе из пресованного алюминия содержатся такие эл-ты, как управляющий двигатель, носитель информации, головки записи/считывания, электроника. Кол-во дисков: В отличие от дискет, винчестер состоит из нескольких одинаковых дисков, расположенных друг под другом. В зависимости от кол-ва этих дисков, зависит и общий объем памяти винчестера. Головки: Головки чтения/записи соответствуют рабочим головкам дисковода. Для каждого диска имеется пара таких головок, которые приводятся в движение и позиционируются шаговым двигателем. Все головки расположены гребнем. Позиционирование одной головки вызовет аналогичные перемещения всех остальных. Поэтому обычно говорят о цилиндрах, а не о дорожках. Рабочий двигатель приводит пакет дисков во вращение, скорость которого в зависимости от модели варьируется 3000-360 об./мин., а новые модели 7200 об./мин. В отличие от дисководов, где головки имеют непосредственный контакт с носителем инф-ии, у винчестера головки записи/чтения нах-ся на воздушной подушке, которая между диском и головкой составляет примерно 0.0001 мм. Повреждение поверхности диска: В следствие большой скорости вращения и в совокупности с малым расстоянием, на кот-ом движется головка, частицы грязи представляют потенциальную угрозу разрушения. Общий объем информации на винчестере. Кол-во головок*цилиныды*сектора*кол-во байт в секторе (512 байт) Физическое разбиение диска: 1 2 3 4 5 обл.данных 1 обл. – загрузочная запись О.С. 2 обл. – зарезервирована 3 обл. – таблица размещения файлов (FAT 1). 4 обл. – (FAT 2) 5 обл. – корневой каталог В практике устнавливается следующая классификация при обозначении приводов жестких дисков: IDE, SCSI Старые: MFM, RLL, ESDI. CD-ROM CD-ROM значительно надежнее. В CD-ROM носители информации (без механического контакта) обр-ся лазерным лучем, выжигающим тот участок, который хранит логическую единицу и оставляет нетронутым тот участок, который хранит логический 0. В результате чего на поверхности CD образуется маленькие углубления, называемые PIT/ Приводы CD-ROM управляются через IDE сопряжение или через SCSI интерфейс, или звуковую карту. В целях обеспечения совместимости CD-ROM производителями компакт-дисков был разработан стандарт ISO 9660, определяющий методы хранения и доступа к информации на CD-ROM. Инициирующая дорожка данных CD-ROM начинается со служебной области, необходимой для синхронизации между приводом и диском. Далее расположена системная область, содержащая данные об организации диска, а также адрес таблицы содержимого тома, с помощью которого возможен непосредственный доступ к данным. Основное отличие структуры каталога CD-ROM от структуры каталога дискеты (DOS) является то, что на CD в системной области записаны адреса файлов, что позволяет осуществить прямое позиционирование на них. Т.о. для доступа к данным, хранящимся на CD-ROM необходимо преобразования форматов. Для этих целей Microsoft был выпущен специальный драйвер MSCDEX.EXE.