отчёт по системному. Лабораторная работа 1 Использование потоков Цель работы Получить практический опыт в использовании потоков на языке Assembler
Скачать 497.58 Kb.
|
Лабораторная работа № 1 Использование потоков Цель работы Получить практический опыт в использовании потоков на языке Assembler
Таблица 1 – команды использований потоков в языке Assembler Несмотря на то что присутствие в программе большого числа команд безусловного перехода считается признаком плохого стиля программирования, такие команды обязательно входят в АСК любой ЭВМ. Для их обозначения в языке ассемблера обычно используется английское слово jump (прыжок). Команда безусловного перехода обеспечивает переход по заданному адресу без проверки каких-либо условий. Условный переход происходит только при соблюдении определенного условия, в противном случае выполняется следующая по порядку команда программы. Большинство производителей ЭВМ в своих ассемблерах обозначают подобные команды словом branch (ветвление). Условием, на основании которого осуществляется переход, чаще всего выступают признаки результата предшествующей арифметической или логической операции. Каждый из признаков фиксируется в своем разряде регистра флагов процессора. Возможен и иной подход, когда решение о переходе принимается в зависимости от состояния одного из регистров общего назначения, куда предварительно помещается результат операции сравнения. Третий вариант — это объединение операций сравнения и перехода в одной команде. В системе команд ЭВМ для каждого признака результата предусматривается своя команда ветвления (иногда — две: переход при наличии признака и переход при его отсутствии). Большая часть условных переходов связана с проверкой взаимного соотношения двух величин или с равенством (неравенством) некоторой величины нулю. Последний вид проверок используется в программах наиболее интенсивно. Процедурный механизм базируется на командах вызова процедуры, обеспечивающих переход из текущей точки программы к начальной команде процедуры, и командах возврата из процедуры, для возврата в точку, непосредственно расположенную за командой вызова. Такой режим предполагает наличие средств для сохранения текущего состояния содержимого счетчика команд в момент вызова (запоминание адреса точки возврата) и его восстановления при выходе из процедуры. Контрольные вопросы: Ассемблер (Assembly) — язык программирования, понятия которого отражают архитектуру электронно-вычислительной машины. Язык ассемблера — символьная форма записи машинного кода, использование которого упрощает написание машинных программ. ЛАБОРАТОРНАЯ РАБОТА № 2 ОБМЕН ДАННЫМИ 1. Цель работы: научиться работать с обменом данных в языке Assembler 2. Задание: 1. Написать программу запроса имени пользователя (name) и вывести приветствие: «Здравствуй, » + name. 2. Переслать строку (массив) произвольной длины, включив ее в состав другой, более длинной строки. Вывести полученную строку на экран. 3. Сравнить две строки, вывести на экран результат сравнения. 3. Ход работы: 1) format PE console entry start include 'win32a.inc' section '.data' data readable writable formatStr db '%s', 0 name rd 2 wn db 'What is your name? ',0 hello db 'Hello %s! ',0 Molodec db 'Molodec! Ti vipolnil zadanie: %s ! ', 0 NULL=0 section '.code' code readable executable start: push wn call [printf] push name push formatStr call [scanf] push name push hello call [printf] push hello push Molodec call [printf] call [getch] push NULL call [ExitProcess] section '.idata' import data readable library kernel, 'kernel32.dll',\ msvcrt, 'msvcrt.dll' import kernel,\ ExitProcess, 'ExitProcess' import msvcrt,\ printf, 'printf',\ getch, '_getch',\ scanf, 'scanf' ЛАБОРАТОРНАЯ РАБОТА №3 СЕТЕВОЕ ПРОГРАММИРОВАНИЕ СОКЕТОВ 1. Цель работы: получение навыков разработки сетевых приложений, используя механизм Windows Sockets. 2. Задание: А)Ознакомиться с технологией сетевого взаимодействия приложений посредством технологии WinSock. Изучить основные функции интерфейса сокетов. Б) Создать сокет для передачи данных по инструкции, представленной в видео по ссылке https://www.youtube.com/watch?v=_ifIsru1GOw. 3. Ход работы: А) Ознакомился с технологией сетевого взаимодествия приложений посредством технологии WinSock и изучил основные функции интерфейса сокетов. Б) Создали сокет для передачи данных (Листинг 3.1). Листинг 3.1 – Код «Сокет для передачи данных» #include #include #include int main() { WSADATA ws; WSAStartup(MAKEWORD(2,2),&ws ); return 0; SOCKET s; s = socket(AF_INET, SOCK_STREAM,0); SOCKADDR_IN sa; memset(&sa, 0 , sizeof(sa)); sa.sin_family = AF_INET; sa.sin_port = htons(1234); char c; printf("s - server\nk - client\n" ); scanf ("%c" , &c); if (c =='k') { sa.sin_addr.S_un.S_addr = inet_addr("192.168.1.3"); connect(s, &sa, sizeof(sa)); int mas[]= {1,2,3,4,5}; send(s,mas,sizeof(mas),0); char st[20]; memset(st, 0 ,sizeof(st)); recv(s,st,sizeof(st),0); printf(st); Sleep(3000); } if (c =='s') { bind(s, &sa, sizeof(sa)); listen(s,100); int buf[5]; memset(buf,0,sizeof(buf)); SOCKET client_socket; SOCKADDR_IN client_addr; int client_addr_size = sizeof(client_addr); while (client_socket = accept(s,&client_addr,&client_addr_size)) { printf("connect OK\n"); while (recv(client_socket,buf,sizeof(buf),0)>0) for (int i=0; i < 5; i++) printf("%d\n", buf[i]); char nm[20]="popopopopop "; send(client_socket, nm, sizeof(nm),0); } } closesocket(s); return 0; } В итоге мы в двух приложениях этого кода выбираем за сервера и клиента и нажимем Enter: Рисунок 3.1 – результат сервера Рисунок 3.2 – Результат клиента. 4. Контрольные вопросы: 1) Работа с сокетами содержит ряд этапов: сокет создается, настраивается на заданный режим работы, применяется для организации обмена и, наконец, ликвидируется. Технология сокетов поддерживает работу с любыми стеками протоколов, совмещенные процедуры ввода/вывода, использование большого числа сервис-провайдеров (серверов услуг), возможность группирования сокетов, что позволяет реализовать их приоритетное обслуживание, и многое другое. Набор операторов, поддерживающих интерфейс сервис провайдера, образует отдельную динамическую библиотеку. 2) Windows API (англ. application programming interfaces) — общее наименование набора базовых функций интерфейсов программирования приложений операционных систем семейств Microsoft Windows корпорации «Майкрософт». Предоставляет прямой способ взаимодействия приложений пользователя с операционной системой Windows. Вывод: получил навыкы разработки сетевых приложений, используя механизм Windows Sockets. ЛАБОРАТОРНАЯ РАБОТА № 4. РАБОТЫ С БУФЕРОМ ЭКРАНА 1. Цель работы: научиться работать с буфером экрана. 2. Задание: Написать программу на языке Assembler с надписью «Hello world» и сделать скриншот интерфейса. 3. Ход работы: На листинге 4.1 написан код через Sublime Text 3: Листинг 4.1 – Код для выявления интерфейса с надписью. NULL EQU 0 MB_DEFBUTTON EQU 100h IDNO EQU 7 MB_YESNO EQU 4 EXTERN _MessageBoxA@16 EXTERN _ExitProcess@4 GLOBAL Start section .data MessageBoxMessage db "Hello from MessageBox!" , 0 MessageBoxTitle db "MessageBox" , 0 section .text Start push MB_YESNO | MB_DEFBUTTON push MessageBoxTitle push MessageBoxMessage push NULL call _MessageBoxA@16 cmp EAX, IDNO je Start push NULL CAll _ExitProcess@4 Потом программу запускаем через командную строку. Сначала создаем объект : Рисунок 4.1 – Работа с командной строкой И после этого выявляем приложение через объект: Рисунок 4.2 – Работа с командной строкой Открываем приложение, нажимаем на кнопку «Нет» - интерфейс не пропадет, «Да» - интерфейс закрывается. Рисунок 4.3 – Приложение «MessageBox» 4. Контрольные вопросы: 1) JNE/JNZ - переход по неравенству/переход, если не нуль. Переход осуществляется, если флаг ZF равен 0. Все остальные условия применения этой команды аналогичны предыдущей. 2) Команды inc и dec предназначены главным образом для счёта и широко используются для организации программных циклов. Если в команде neg операнд был равен 00000000 либо 100000, то в результате выполнения команды его значение не изменится. 3) Команда CMP процессоров семейства i80x86 используется для сравнения двух операндов. Говоря проще, эта команда сравнивает два числа, то есть проверяет, равны эти два числа или НЕ равны. Вывод: написал программу на языке Assembler с надписью «Hello world» и сделал скриншот интерфейса. ЛАБОРАТОРНАЯ РАБОТА № 5 ИССЛЕДОВАНИЕ ДАМПА ПАМЯТИ 1.Цель работы: научиться исследовать дамп памяти. 2. Задания: 1. В BIOS вывести строку дампа памяти. 3. Ход работы: Код написан на NASM для вывода строки дампа памяти: Листинг 5.1 – Код вывода строки дампа памяти. cr equ 13 lf equ 10 Send_crlf: push ax push dx mov ah,2 mov dl,cr int 21h mov dl,lf int 21h pop dx pop ax ret Clear_screen: push ax push bx push cx push dx xor al,al xor cx,cx mov dh,24 mov dl,79 mov bh,7 mov ah,6 int 10h pop dx pop cx pop bx pop ax ret После написание кода на NASM и его компиляции получил данный результат: Рисунок 1 – Дамп памяти. 4. Контрольные вопросы: 1) Дамп памяти — это копия содержимого оперативной памяти, находящаяся на жёстком диске или другом энергонезависимом устройстве памяти. Вывод: я научился исследовать дамп памяти. ЛАБОРАТОРНАЯ РАБОТА № 6 ИЗУЧЕНИЕ РЕГИСТРОВ ПРОЦЕССОРА 1. Цель работы: изучить регистры процессора. 2. Задания: 1. Написать 2 программы по своему усмотрению с использованием регистров. Опишите вид, назначение и особенности выбранных регистров. 3. Ход работы: Первая программа: Листинг 5.1 – Код первой программы. Write_word_hex: mov dl,bh call Write_byte_hex mov dl,bl call Write_byte_hex ret Write_byte_hex: push cx push dx mov cl,4 shr dl,cl call Write_digit_hex pop dx and dl,0fh call Write_digit_hex pop cx ret Write_digit_hex: cmp dl,09h ja kr add dl,30h jmp kl kr:add dl,37h kl:call Write_char ret Write_char: push ax cmp dl,1Fh ja .dr mov dl, 2eh .dr:mov ah,2 int 21h pop ax ret Write_word_dec: push cx push dx push dx push bx mov cx,0 mov ax,dx mov dx,0000 mov bx,10h .pv:div bx push dx push dx add cx,1 xor dx,dx or ax,ax jnz .pv .kn:pop dx pop dx call Write_digit_hex sub cx,1 or cx,cx jnz .kn pop bx pop dx pop dx pop cx ret Вторая программа: Листинг 5.2 – Код второй программы. [org 100h] Address dw 100h jmp Disp_sector Sector times 16 db 10h times 16 db 11h times 16 db 12h times 16 db 13h times 16 db 14h times 16 db 15h times 16 db 16h times 16 db 17h times 16 db 18h times 16 db 2Fh times 16 db 0AAh times 16 db 0BBh times 16 db 0CCh times 16 db 0DDh times 16 db 0EEh times 16 db 0FFh; Disp_sector: call Clear_screen mov ah,08 int 21h xor dx,dx mov cx,16 .op call Disp_line call Send_crlf add dx,16 loop .op int 20h Disp_line: push cx push dx mov bx,dx mov cx,16 push cx add dx,[Address] call Write_word_dec mov dl,' ' call Write_char push bx .HEX: mov dl,[Sector+bx] call Write_byte_hex mov dl, ' ' call Write_char inc bx loop .HEX pop bx pop cx .ASCII: xor dx,dx mov dl,[Sector+bx] call Write_char loop .ASCII pop dx pop cx ret %include 'Video_io.asm' %include 'Cursor.asm' В Disp_sec я использовал регистр DX т.к. это единственный регистр, которые может использоваться в качестве указателя адреса ввода-вывода в инструкциях IN и OUT. Фактически, кроме использования регистра DX нет другого способа адресоваться к портам ввода-вывода с 256 по 65535. В Video_io я использовал регистр CX и DL, регистр CX для использования в качестве счетчика, а так-же чтобы обратиться 8-ми разрядному DL регистру. 4. Контрольные вопросы: 1) Регистр представляет устройство для кратковременного хранения двоичной информации. Запоминание временное, поскольку регистр выполняют роль промежуточного звена. Он получает некоторую n-битную двоичную информацию, а затем передает ее на следующий этап по сигналу извне. Регистры состоят из n-триггеров и имеет определенное количество входов и выходов. По принципу работы существуют несколько типов регистров. Регистры делятся на пять категорий: Регистры общего назначения (ax, bx, cx, dx) Регистровые указатели и индексные регистры (sp, bp, si, di) Сегментные регистры (cs, ds, ss, es) Регистр командного указателя (ip) Регистр флагов 2) Регистры могут быть реализованы также на базе JK -триггеров. 3)Кольцевые регистры предназначены для создания схем распределителей импульсов, которые служат для формирования следующих друг за другом импульсных сигналов, появляющихся в различных цепях управления узлами и устройствами. 4) Временный расчет регистров требуется, если нужно выбрать итоги или движения на определенную дату. По умолчанию итоги регистров выдаются на точку актуальности. Вывод: я изучил регистры процессора. ЛАБОРАТОРНАЯ РАБОТА № 7 ИСПОЛЬЗОВАНИЕ АССЕМБЛЕРНОЙ ВСТАВКИ 1. Цель работы: научиться использовать ассемблерные вставки. 2. Задания: Написать ассемблерную вставку на C#. 3. Ход работы: Ассемблерная вставка: Листинг 7.1 – Код программы. public static Tout ToInstance { Tout temp = default; TypedReference tr = __makeref(temp); Marshal.WriteIntPtr(*(IntPtr*)(&tr), ptr); Tout instance = __refvalue(tr, Tout); return instance; } public static void* ToPointer { if (typeof(T).IsValueType) { return *(void**)&tr; } else { return **(void***)&tr; } } 4. Контрольные вопросы: 1) В программировании, ассемблерной вставкой называют возможность компилятора встраивать низкоуровневый код, написанный на ассемблере, в программу, написанную на языке высокого уровня, например, Си или Ada. Использование ассемблерных вставок может преследовать следующие цели. 2) Использование ассемблерных вставок необходимо для оптимизации, доступа к специфичным инструкциям процессора и организация системных вызовов. Вывод: я научился использовать ассемблерные вставки. ЛАБОРАТОРНАЯ РАБОТА № 8 ИСПОЛЬЗОВАНИЕ АРИФМЕТИЧЕСКИХ ОПЕРАЦИЙ НА ЯЗЫКЕ АССЕМБЛЕРА 1. Цель работы: научиться использовать арифметические операций на языке ассемблера. 2. Задание: А) Разработать приложение на языке ассемблера, складывающее два числа. Б) Разработать приложение на языке ассемблера, складывающее два числа с плавающей запятой. В) Разработать приложение на языке ассемблера, выполняющее вычисления по формуле c*(a+b). 3. Ход работы: А) Разработал приложение на языке ассемблера, складывающее 2 числа через flat assembler. Сложение происходит через операцию add. Код данного приложения написан на листинге 8.1: Листинг 8.1 – Код для сложения чисел format PE console entry start include 'win32a.inc' section '.data' data readable writable restStr db 'Result: %d', 0 A dd ? B dd ? C dd ? NULL=0 section '.code' code readable executable start: mov [A], 12 mov [B], 10 mov ecx, [A] add ecx, [B] push ecx push restStr call [printf] call [getch] push NULL call [ExitProcess] section '.idata' import data readable library kernel, 'kernel32.dll',\ msvcrt, 'msvcrt.dll' import kernel,\ ExitProcess, 'ExitProcess' import msvcrt,\ printf, 'printf',\ getch, '_getch',\ scanf, 'scanf' Запускаем программу и видим результат нашего сложения на рисунке 8.1: Рисунок 8.1 – Результат Б) Разработать приложение на языке ассемблера, получившего числа с плавающей запятой, пришлось с новым циклом lp (Листинг 8.2). Листинг 8.2 – Код для получения ответа с плавающей запятой format PE console entry start include 'win32a.inc' section '.data' data readable writable restStr db 'Result: %d', 0 emptyStr db '%d', 0 point db ',',0 A dd ? B dd ? C dd ? NULL=0 section '.code' code readable executable start: mov [A], 12 mov [B], 5 mov eax, [A] mov ecx, [B] mov edx,0 div ecx mov [C], edx push eax push restStr call [printf] push point call [printf] mov ebx, 0 lp: mov eax, [C] mov ecx, [B] imul eax,10 mov edx, 0 div ecx mov [C],edx push eax push emptyStr call [printf] add ebx, 1 cmp ebx, 1 jne lp call [getch] push NULL call [ExitProcess] section '.idata' import data readable library kernel, 'kernel32.dll',\ msvcrt, 'msvcrt.dll' import kernel,\ ExitProcess, 'ExitProcess' import msvcrt,\ printf, 'printf',\ getch, '_getch',\ scanf, 'scanf' В итоге получился такой результат на рисунке 8.2: Рисунок 8.2 – Результат В) Разработал приложение на языке ассемблера, выполняющее вычисления по формуле c*(a+b) на листинге 8.3. Сначала складываем числа A и B, потом делим на C. Листинг 8.3 – Код для вычисления формулы format PE console entry start include 'win32a.inc' section '.data' data readable writable restStr db 'Result: %d', 0 A dd ? B dd ? C dd ? NULL=0 section '.code' code readable executable start: mov [A], 10 mov [B], 5 mov [C], 3 mov eax, [A] add eax, [B] imul eax, [C] push eax push restStr call [printf] call [getch] push NULL call [ExitProcess] section '.idata' import data readable library kernel, 'kernel32.dll',\ msvcrt, 'msvcrt.dll' import kernel,\ ExitProcess, 'ExitProcess' import msvcrt,\ printf, 'printf',\ getch, '_getch',\ scanf, 'scanf' Получаем такой ответ: Рисунок 8.3 – Результат 4. Контрольные вопросы: 1)Основные арифметические операции реализуются в языке ассемблера инструкциями ADD, SUB, NEG, MUL/IMUL, DIV/IDIV. Помимо того, операции уменьшения и увеличения числа на единицу поддержаны инструкциями DEC и INC. Вывод: научился использовать арифметические операций на языке ассемблера. ЛАБОРАТОРНАЯ РАБОТА № 9 РАБОТА С ПАМЯТЬЮ НА ЯЗЫКЕ АССЕМБЛЕРА 1. Цель работы: научиться навыком работы с памятью на языке ассемблера. 2. Задание: А) Разработать приложение на языке ассемблера, выводящее на экран заданное число. Б) Разработать приложение на языке ассемблера, выполняющее поиск максимального числа из двух. 3. Ход работы: А) Разработал так, чтобы число выводилось на экран, которое ввели: Листинг 9.1 – Код для вывода заданного числа format PE console entry start include 'win32a.inc' section '.data' data readable writable restStr db 'Zadannoe chislo: %d', 0 A dd ? NULL=0 section '.code' code readable executable start: mov [A], 18 mov eax, [A] push eax push restStr call [printf] call [getch] push NULL call [ExitProcess] section '.idata' import data readable library kernel, 'kernel32.dll',\ msvcrt, 'msvcrt.dll' import kernel,\ ExitProcess, 'ExitProcess' import msvcrt,\ printf, 'printf',\ getch, '_getch',\ scanf, 'scanf' Получаем число на экране (Рисунок 9.1): Рисунок 9.1 – Результат Б) Максимальное число из заданных чисел находить можно через cmovl на ассемблере: Листинг 9.2 – Код для нахождения максимального значения format PE console entry start include 'win32a.inc' section '.data' data readable writable restStr db 'Result: %d', 0 A dd ? B dd ? NULL=0 section '.code' code readable executable start: mov [A], 18 mov [B], 45 mov eax, [A] cmp eax, [B] cmovl eax, [B] push eax push restStr call [printf] call [getch] push NULL call [ExitProcess] section '.idata' import data readable library kernel, 'kernel32.dll',\ msvcrt, 'msvcrt.dll' import kernel,\ ExitProcess, 'ExitProcess' import msvcrt,\ printf, 'printf',\ getch, '_getch',\ scanf, 'scanf' Видим, что заданы 2 числа (18 и 45). Максимальное значение из этих чисел становится 45 на рисунке 9.2: Рисунок 9.2 - Результат 4. Контрольные вопросы: 1) Назначение PUSH - помещение операнда в стек. Команда PUSH уменьшает значение регистра стека на размер операнда (2 или 4) и копирует содержимое операнда в память по адресу SS:SP. Начиная с 80186 процессора появилась возможность помещать в стек непосредственные значения. При этом, если в стек заносится байт, то он расширяется до слова с сохранением знака. Начиная с 80286 процессоров, команда PUSH SP помещает в стек значение SP до того, как эта же команда его уменьшит, в то время как на 8086 значение SP помещалось в стек уже уменьшенным на два. Если команда выполняется в 32-разрядном режиме, то используется регистр ESP. 2) Назначение POP - извлечение операнда из стека. Команда POP копирует содержимое ячейки памяти по адресу SS:SP в операнд и увеличивает значение регистра стека на размер операнда (2 или 4). Если операнд использует регистр SP для косвенной адресации, команда POP вычисляет адрес уже после того, как она увеличивает SP. Если команда выполняется в 32-разрядном режиме, то используется регистр ESP. Вывод: научился навыком работы с памятью на языке ассемблера. ЛАБОРАТОРНАЯ РАБОТА № 10 ОБРАБОТКА БЛОКОВ ДАННЫХ НА ЯЗЫКЕ АССЕМБЛЕР 1.Цель работы: научиться обрабатывать блок данных на языке ассемблера. 2. Задания: 1. Выполнить обработку блоков данных, рассмотренных в теоретических сведениях используя загрузку, выгрузку и сравнение данных. 3. Ход работы: Я выполнил обработку блоков данных и вот сами программы: Листинг 10.1 - Код Output_ Data stosb Mov byte ptr [edi], al Inc edi /dec edi stosw Mov word ptr [edi], ax Add edi, 2h /sub edi, 2h stosd Mov dword ptr [edi], eax Add edi, 4h / sub edi, 4h Листинг 10.2 – Код Load_Data Lodsb Mov al, byte ptr [esi] Inc esi /dec esi Lodsw Mov ax, word ptr [esi] Add esi, 2h /sub esi, 2h Lodsd Mov eax, dword ptr [esi] Add esi, 4h / sub esi, 4h Листинг 10.3 – Код Comprasion_Data mov si,str1 mov di,str2 mov cx,strlength repz cmpsb 4. Контрольные вопросы: 1) Обработка информации — вся совокупность операций (сбор, ввод, запись, преобразование, считывание, хранение, уничтожение, регистрация), осуществляемых с помощью технических и программных средств, включая обмен по каналам передачи данных. При современном развитии программного обеспечения существует множество различных программных средств обработки информации, написанных на разных языках программирования на основе вышеперечисленных методов. Вывод: научился обрабатывать блок данных на языке ассемблера. ЛАБОРАТОРНАЯ РАБОТА №11 ОБРАБОТКА СТРОК Цель: научиться обрабатывать строки Ход работы: Вариант 4
Листинг 11 – удаление из исходной строки повторные вхождения заданного символа Контрольные вопросы: пересылка строки: MOVSB, MOVSW, MOVSD Сравнение строк: CMPSB, CMPSW, CMPSD Сканирование строки: SCASB, SCASW, SCASD Загрузка элемента из строки: LODSB, LODSW, LODSD Сохранение элемента в строке: STOSB, STOSW, STOSD Получение элементов строки из порта ввода-вывода: INSB, INSW, INSD Вывод элементов строки в порт ввода-вывода: OUTSB, OUTSW, OUTSD ЛАБОРАТОРНАЯ РАБОТА №12 РАБОТА С ПРЕРЫВАНИЯМИ Цель: научиться работать с прерываниями Ход работы:
Листинг 12 – произвольная программа для работы с прерываниями Контрольные вопросы: Прерывание (англ. interrupt) — сигнал от программного или аппаратного обеспечения, сообщающий процессору о наступлении какого-либо события, требующего немедленного внимания. Прерывание извещает процессор о наступлении высокоприоритетного события, требующего прерывания текущего кода, выполняемого процессором. Внешние (аппаратные) прерывания могут возникать в результате действий пользователя или оператора за терминалом или же в результате поступления сигналов от аппаратных устройств – сигналов завершения операций ввода-вывода, вырабатываемых контроллерами внешних устройств компьютера, такими, как принтер или накопитель на жестких дисках, или же сигналов от датчиков управляемых компьютером технических объектов. Внешние прерывания называют также аппаратными, отражая тот факт, что прерывание возникает вследствие подачи некоторой аппаратурой (например, контроллером принтера) электрического сигнала, который передается (возможно, проходя через другие блоки компьютера, например контроллер прерываний) на специальный вход прерывания процессора. Данный класс прерываний является асинхронным по отношению к потоку инструкций прерываемой программы. Аппаратура процессора работает так, что асинхронные прерывания возникают между выполнением двух соседних инструкций, при этом система после обработки прерывания продолжает выполнение процесса уже начиная со следующей инструкции. Внутренние прерывания, называемые также исключениями (exception), происходят синхронно выполнению программы при появлении аварийной ситуации в ходе исполнения некоторой инструкции программы. Примерами исключений являются деление на нуль, ошибки защиты памяти, обращения по несуществующему адресу, попытка выполнить привилегированную инструкцию в пользовательском режиме и т. п. Исключения возникают непосредственно в ходе выполнения тактов команды (“внутри” выполнения). ЛАЮОРАТОРНАЯ РАБОТА №13 ОБРАБОТКА СТРОК С ПОМОЩЬЮ СПЕЦИАЛЬНЫХ ДИРЕКТИВ Цель: научиться обрабатывать строки с помощью специальных директив Ход работы: Рисунок 13 – директива IRPC Рисунок 13.2 – директива IF и IFE Рисунок 13.3 – директива IFDEF Рисунок 13.4 – директива IFB Контрольные вопросы: 1. В программировании термин «директива» (указание) по использованию похож на термин «команда», также используется для описания некоторых конструкций языка программирования (то есть указаний компилятору или ассемблеру особенностей обработки при компиляции). 2. Директивы IFIDN, IFIDNI, IFDIF и IFDIFI, Директивы IFB и IFNB, Директивы IFDEF и IFNDEF, Директивы IF и IFE ЛАБОРАТОРНАЯ РАБОТА №14 СОСТАВЛЕНИЕ ПРОГРАММ С ИСПОЛЬЗОВАНИЕМ ВВОДА ВЫВОДА НА ЭКРАН Цель: научиться использовать программы с вводом выводом на экран Ход работы:
Листинг 14 – программа ввода вывода Контрольные вопросы: Команда int 21h работает точно так же, как любая другая команда int: Передаёт управление от одной ячеки программного сегмента к другой ЛАБОРАТОРНАЯ РАБОТА №15 СОЗДАНИЕ ПРОГРАММЫ НА ПРОГРАММИРОВАНИЕ ПОРТОВ ВВОДА-ВЫВОДА Цель: научиться создавать программы на программирование портов ввода-вывода Ход работы: Рисунок 15 – список стандартных портов ввода-вывода Порты ввода вывода предназначен для общения микроконтроллера с внешними устройствами. С их помощью мы передаём информацию другим устройствам и принимаем информацию от них. Контрольные вопросы: 1. Порт (англ. port) — целое неотрицательное число, записываемое в заголовках протоколов транспортного уровня сетевой модели OSI (TCP, UDP, SCTP, DCCP). Обычно на хосте под управлением ОС в пространстве пользователя исполняется несколько процессов, в каждом из которых выполняется какая-либо программа. В случае если несколько программ используют компьютерную сеть, то ОС периодически получает по сети IP-пакет, предназначенный для одной из программ. |