Главная страница
Навигация по странице:

  • Контрольные вопросы: Ассемблер

  • Язык

  • Прерывание

  • Команда

  • отчёт по системному. Лабораторная работа 1 Использование потоков Цель работы Получить практический опыт в использовании потоков на языке Assembler


    Скачать 497.58 Kb.
    НазваниеЛабораторная работа 1 Использование потоков Цель работы Получить практический опыт в использовании потоков на языке Assembler
    Дата27.12.2021
    Размер497.58 Kb.
    Формат файлаdocx
    Имя файлаотчёт по системному.docx
    ТипЛабораторная работа
    #320307

    Лабораторная работа № 1

    Использование потоков

    1. Цель работы

    Получить практический опыт в использовании потоков на языке Assembler

    Команды безусловного перехода

    Call

    Вызов процедуры

    Jmp

    Безусловный переход

    Ret

    Возврат из процедуры

    Retn

    Возврат из ближайшей процедуры

    Retf

    Возврат из дальней процедуры

    Команды условного перехода

    Jc

    Переход, если был перенос

    Je

    Переход, если равно/нуль

    Jnc

    Переход, если нет переноса

    Jns

    Переход, если нет знака

    Jo

    Переход, если по переполнено

    js

    Переход, если есть знака

    Таблица 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(IntPtr ptr)

    {

    Tout temp = default;

    TypedReference tr = __makeref(temp);

    Marshal.WriteIntPtr(*(IntPtr*)(&tr), ptr);

    Tout instance = __refvalue(tr, Tout);

    return instance;

    }

    public static void* ToPointer(ref T obj)

    {

    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

    .code

                    mov     al,'l'                  ;в al символ от которого надо избавиться

                    mov     edi,str1                ;в edi адрес строки, которую надо исправить

                    mov     ecx,endofstr1           ;в ecx длина строки. можно заменить любым

                    sub     ecx,edi                 ;другим способом определения длины строки

    l1:             repne scasb                     ;ищем символ al, в строке edi, длины ecx

                    jnz     exit                    ;если строка кончилась, прыгаем на конец

                    mov     edx,ecx                 ;иначе сохраняем текущее значение ecx

                    mov     esi,edi                 ;в esi адрес символа следующего за тем, что надо удалить

                    dec     edi                     ;в edi тот, что надо заменить

                    mov     ebx,edi                 ;сохраняем edi на будущее

                    rep movsb                       ;и копируем esi в edi, ecx раз (до конца строки)

                    mov     edi,ebx                 ;возвращаем значение edi: адрес символа следующего за удаленным

                    mov     ecx,edx                 ;возвращаем ecx: оставшаяся длина строки

                    jmp     l1                      ;повторяем

    exit:

    .data

    str1        db 'Hello, world!',0

    endofstr1   db ?


    Листинг 11 – удаление из исходной строки повторные вхождения заданного символа

    Контрольные вопросы:

    пересылка строки: MOVSB, MOVSW, MOVSD

    Сравнение строк: CMPSB, CMPSW, CMPSD

    Сканирование строки: SCASB, SCASW, SCASD

    Загрузка элемента из строки: LODSB, LODSW, LODSD

    Сохранение элемента в строке: STOSB, STOSW, STOSD

    Получение элементов строки из порта ввода-вывода: INSB, INSW, INSD

    Вывод элементов строки в порт ввода-вывода: OUTSB, OUTSW, OUTSD

    ЛАБОРАТОРНАЯ РАБОТА №12

    РАБОТА С ПРЕРЫВАНИЯМИ

    Цель: научиться работать с прерываниями

    Ход работы:

    code segment

    assume DS: data, CS: code

    begin:

    timer dw 0

    mov ax, data

    mov ax, data

    xor ax, ax

    mov ax, 351ch ;

    int 21h

    mov word ptr old_1ch, bx

    mov word ptr old_1ch+2, ES

    mov ax, 251ch

    mov dx, offset new_1ch

    push ds ;сохраняем ds

    push cs ;

    pop ds

    int 21h ;

    pop ds ;

    xor ax, ax

    xor cx, cx

    mov al, 'A'

    mov cl, 'Z' ;

    sub cx, ax inc cx ;

    mov dx, ax mov ax, 0200h

    cycle:

    mov bx, timer

    cmp bx, 36

    jne cycle

    int 21h

    mov cs:timer, 0 ;

    inc dx

    loop cycle ;

    lds dx, old_1ch ;

    mov ax, 251ch

    int 21h ;

    mov ax, 4c00h

    int 21h ;

    new_1ch proc inc cs:timer ;

    iret ;

    new_1ch endp code ends data segment old_1ch dd 0 data ends stk segment stack dw 128 dup (0) stk ends end begin

    Листинг 12 – произвольная программа для работы с прерываниями

    Контрольные вопросы:

    1. Прерывание (англ. interrupt) — сигнал от программного или аппаратного обеспечения, сообщающий процессору о наступлении какого-либо события, требующего немедленного внимания. Прерывание извещает процессор о наступлении высокоприоритетного события, требующего прерывания текущего кода, выполняемого процессором.

    2. Внешние (аппаратные) прерывания могут возникать в результате действий пользователя или оператора за терминалом или же в результате поступления сигналов от аппаратных устройств – сигналов завершения операций ввода-вывода, вырабатываемых контроллерами внешних устройств компьютера, такими, как принтер или накопитель на жестких дисках, или же сигналов от датчиков управляемых компьютером технических объектов. Внешние прерывания называют также аппаратными, отражая тот факт, что прерывание возникает вследствие подачи некоторой аппаратурой (например, контроллером принтера) электрического сигнала, который передается (возможно, проходя через другие блоки компьютера, например контроллер прерываний) на специальный вход прерывания процессора. Данный класс прерываний является асинхронным по отношению к потоку инструкций прерываемой программы. Аппаратура процессора работает так, что асинхронные прерывания возникают между выполнением двух соседних инструкций, при этом система после обработки прерывания продолжает выполнение процесса уже начиная со следующей инструкции.

    Внутренние прерывания, называемые также исключениями (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

    СОСТАВЛЕНИЕ ПРОГРАММ С ИСПОЛЬЗОВАНИЕМ ВВОДА ВЫВОДА НА ЭКРАН

    Цель: научиться использовать программы с вводом выводом на экран

    Ход работы:

    data segment

         string db 0ah,100 dup ('$')

    data ends

     

    code segment

    assume cs:code,ds:data

    start:

        mov ax, data

        mov ds, ax

       

        mov cx,99

        lea bx,string+1

            mov ah,1

    n1:

        int 21h

       

        mov [bx],al

        inc bx

           

        cmp al,'.'     ;текст кончается точкой, или люб др символом по твоему желанию

        je ex

        loop n1

     

    ex:

        mov ah,9

        lea dx,string

        int 21h

       

       

        mov ah, 10h

        int 16h

     

        mov ax, 4c00h

        int 21h

    code ends

    end start


    Листинг 14 – программа ввода вывода

    Контрольные вопросы:

    1. Команда int 21h работает точно так же, как любая другая команда int: Передаёт управление от одной ячеки программного сегмента к другой


    ЛАБОРАТОРНАЯ РАБОТА №15

    СОЗДАНИЕ ПРОГРАММЫ НА ПРОГРАММИРОВАНИЕ ПОРТОВ ВВОДА-ВЫВОДА

    Цель: научиться создавать программы на программирование портов ввода-вывода

    Ход работы:



    Рисунок 15 – список стандартных портов ввода-вывода

    Порты ввода вывода предназначен для общения микроконтроллера с внешними устройствами. С их помощью мы передаём информацию другим устройствам и принимаем информацию от них.

    Контрольные вопросы:

    1. Порт (англ. port) — целое неотрицательное число, записываемое в заголовках протоколов транспортного уровня сетевой модели OSI (TCP, UDP, SCTP, DCCP). Обычно на хосте под управлением ОС в пространстве пользователя исполняется несколько процессов, в каждом из которых выполняется какая-либо программа. В случае если несколько программ используют компьютерную сеть, то ОС периодически получает по сети IP-пакет, предназначенный для одной из программ.


    написать администратору сайта