Формализация (запись) алгоритма




Цель лабораторной работы

Получить знания о структуре и основных правилах записи программ на языке Ассемблера для ЭВМ типа IBM PC, а также приобретение практических навыков по составлению простейших программ на языке Ассемблера, их выполнению и отладке.

Постановка задачи

Написать программу, которая выводит одно под другим следующие сообщения:

Hello!

I am ФИО студента!

Формализация (запись) алгоритма

В текстовом редакторе создаем файл «lab1.asm» и записываем в него

следующий код:

Вариант 1:

data segment mes db 'Hello!',10,13,'I am Gabzalilov Arthur!$' data ends code segment start assume cs:code, ds: data mov ax, data mov ds, ax mov ah, 9   lea dx, mes int 21h mov ax, 4c00h int 21h code ends end start ;описание сегмента данных ;строка для вывода на экран ;'$' - признак конца строки ;конец сегмента данных ;начало сегмента кода ;точка входа start ;директива компилятора ;настройка сегмента данных   ;функция №9 прерывания 21h - вывод;строки на экран ;берём адрес строки ;вызов прерывания для вывода строки ;функция завершения программы ;завершаем программу ;конец сегмента кода ;конец программы с точкой входа start

Компиляция программы

tasm lab1.asm


Компановка программы

tlink lab1.obj

Запуск и тестирование

lab1.exe

 

Вариант 2:

text segment assume CS:text,DS:data   begin: mov AX,data mov DS,AX mov AH,09h mov DX,offset mesg int 21h mov AH,4Ch mov AL,0 int 21h text ends data segment mesg db 'Hello!',10,13,'This is second string$' data ends stk segment stack db 256 dup (0) stk ends end begin ;Начало сегмента команд ;Сегментный регистр CS будет указывать на ;сегмент команд, а DS на сегмент данных ; ;Адрес сегмента данных загрузим в АХ, ;а затем перенесем из АХ в DS ;Функция DOS 9h вывода на экран ;Адрес выводимого сообщения должен быть в DX ;Вызов DOS ;Функция 4Ch завершения программы ;Код 0 успешного завершения ;Вызов DOS ;Конец сегмента команд ;Начало сегмента данных ;Выодимый текст ; ;Конец сегмента данных ;Начало сегмента стека ;Резервируем 256 байт для стека ;Конец сегмента стека ;Конец программы с точкой входа begin

 

Вывод

При выполнении лабораторной работы я получил знания о структуре и основных правилах записи программ на языке Ассемблера для ЭВМ типа IBM PC, а также приобрел практические навыки по составлению простейших программ на языке Ассемблера, их выполнению и отладке.


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

«Программирование арифметических операций»

Цель лабораторной работы

Изучить форматы и правила работы с командами сложения, умножения, вычитания и деления микропроцессоров семейства х86.

Постановка задачи

Организовать два массива по 5 элементов каждый. Выполнить поэлементно операции сложения, умножения, вычитания и деления. Каждый раз результат выводить в новый массив.

Формализация (запись) алгоритма

В текстовом редакторе создаем файл «lab2.asm» и записываем в него

следующий код:

assume cs:code,ds:data,es:stk   data segment mas1 dw 5 dup (?) mas2 dw 5 dup (?) mes1 db 0ah,0dh,'Massiv(summa)- ','$' mes2 db 0ah,0dh,'Massiv(raznos)- ','$' mes3 db 0ah,0dh,'Massiv(proizv)- ','$' mes4 db 0ah,0dh,'Massiv(chastn)- ','$' mes db 10,13,'$' e dw 9h i dw 1h tmp db 0 abz dw ' ','$' data ends code segment prep proc near mov i,1h mov e,9h mov ax,data mov ds,ax xor ax,ax xor bx,bx mov SI,0 MOV CX,5 go: mov bx,i mov mas1[si],bx mov ax,e mov mas2[si],ax inc i inc e inc si inc si LOOP go ret prep endp     add_proc proc near mov si,0 MOV CX,5 sum: mov bx,mas1[si] mov ax,mas2[si] add ax,bx mov mas1[si],ax inc si inc si loop sum ret add_proc endp   sub_proc proc near mov si,0 MOV CX,5 minus: mov bx,mas1[si] mov ax,mas2[si] sub ax,bx mov mas1[si],ax inc si inc si loop minus ret sub_proc endp   div_proc proc near mov si,0 MOV CX,5 del: xor dx,dx mov bx,mas1[si] mov ax,mas2[si] div bl mov dl,al mov mas1[si],dx inc si inc si loop del ret div_proc endp   mul_proc proc near mov si,0 MOV CX,5 umn: xor dx,dx mov bx,mas1[si] mov ax,mas2[si] mul bx mov dx,ax mov mas1[si],dx inc si inc si loop umn ret mul_proc endp     outp proc near mov si,0 mov cx,5 show: mov ax,mas1[si] mov dl,10 div dl mov tmp,ah mov dl,al add dl,30h mov ah,02h int 21h mov dl,tmp add dl,30h mov ah,02h int 21h inc si inc si mov ah,09h lea dx,abz int 21h loop show ret outp endp   outp2 proc near mov si,0 mov cx,5 show2: mov ax,mas2[si] mov dl,10 div dl mov tmp,ah mov dl,al add dl,30h mov ah,02h int 21h mov dl,tmp add dl,30h mov ah,02h int 21h inc si inc si mov ah,09h lea dx,abz int 21h loop show2 ret outp2 endp   begin: call prep call outp lea dx, mes int 21h call outp2   mov ah,09h lea dx,mes1 int 21h call add_proc call outp call prep mov ah,09h lea dx,mes2 int 21h call sub_proc call outp call prep   mov ah,09h lea dx,mes3 int 21h call mul_proc call outp call prep   mov ah,09h lea dx,mes4 int 21h call div_proc call outp int 21h mov ax,4c00h int 21h code ends stk segment stack db 256 dup('*') stk ends end begin ;CS->Сегмент команд, DS->сегмент данных, ;ES-> сегмент стека ;Начало сегмента данных ;Создание пустых массивов mas1 и mas2 ;размером 5 ;Выводимый текст ;Выводимый текст ;Выводимый текст ;Выводимый текст ;Перевод строки и возврат каретки ;Начальное значение элементов mas2 ;Начальное значение элементов mas1 ;0 для отображения цифр ;Пробел для вставки между элементами массива ;Конец сегмента данных ;Начало сегмента команд ;Начало процедуры prep ;Записываем в i 1 ;Записываем в e 9 ;Адрес сегмента данных загрузим в АХ, ;а затем перенесем из АХ в DS ;Быстрая очистка регистра AX ;Быстрая очистка регистра BX ;Загружаем индекс первого эл-та массива ;Задаем счетчик на 5 ;начало цикла go :Загружаем в BX первый эл-нт массива mas1 ;Загружаем в mas1[si] элемент из BX :Загружаем в AX первый эл-нт массива mas2 ;Загружаем в mas2[si] элемент из AX ;Увеличиваем на 1 i, e, чтобы получить ;следующие элементы массивов ;Дважды увеличиваем SI, чтобы получить ;правильный индекс следующего элемента ;повтор цикла go ;возврат из процедуры ;конец процедуры prep     ;Начало процедуры сложения add_proc ;Загружаем индекс первого эл-та массива ;Задаем счетчик на 5 ;Точка входа sum ;Записываем в BX элемент массива mas1[si] ;Записываем в AX элемент массива mas2[si] ;Прибавляем к AX BX ;Результат сложения записываем в mas[si] ;Дважды увеличиваем на 1 индекс элементов ;обоих масивов ;повтор sum ;возврат из процедуры ;конец процедуры сложения add_proc   ;начало процедуры вычитания sub_proc ;Загружаем индекс первого эл-та массива ;Задаем счетчик на 5 ;Точка входа minus ;Записываем в BX элемент массива mas1[si] ;Записываем в AX элемент массива mas2[si] ;Вычитаем из AX BX ;Результат вычитания записываем в mas[si] ;Дважды увеличиваем на 1 индекс элементов ;обоих массивов ;повтор minus ;возврат из процедуры ;конец процедуры вычитания sub_proc   ;начало процедуры деления div_proc ;Загружаем индекс первого эл-та массива ;Задаем счетчик на 5 ;Точка входа del ;быстро сбрасываем регистр DX ;Записываем в BX элемент массива mas1[si] ;Записываем в AX элемент массива mas2[si] ;Делим AX на BL(low) ;Записываем в DL(low) AL(low) ;Результат деления записываем в mas[si] ;Дважды увеличиваем на 1 индекс элементов ;обоих массивов ;повтор del ;возврат из процедуры ;конец процедуры деления div_proc   ;начало процедуры умножения mul_proc ;Загружаем индекс первого эл-та массива ;Задаем счетчик на 5 ;Точка входа umn ;быстро сбрасываем регистр DX ;Записываем в BX элемент массива mas1[si] ;Записываем в AX элемент массива mas2[si] ;Умножаем AX на BX ;Записываем в DX AX ;Результат деления записываем в mas[si] ;Дважды увеличиваем на 1 индекс элементов ;обоих массивов ;повтор umn ;возврат из процедуры ;конец процедуры умножения mul_proc     ;начало процедуры вывода outp ;Загружаем индекс первого эл-та массива ;Задаем счетчик на 5 ;Точка входа show ;Записываем в AX элемент массива mas1[si] ;Записываем в DL 10 ;Делим AX на DL ;Записываем в tmp AH(high) ;Записываем в DL AH ;Конвертация в цифру(30h – ‘0’) ;Вывод на экран содержимого DL ;Вызов ДОС ;Записываем в DL tmp ;Конвертация в цифру(30h – ‘0’) ;Вывод на экран содержимого DL ;Вызов ДОС ;Дважды увеличиваем на 1 индекс элементов ;обоих массивов ;функция вывода сообщения на экран ;берём адрес строки ;вызов ДОС ;повтор show ;возврат из процедуры ;конец процедуры outp ; ;начало процедуры вывода outp2 ;Загружаем индекс первого эл-та массива ;Задаем счетчик на 5 ;Точка входа show2 ;Записываем в AX элемент массива mas2[si] ;Записываем в DL 10 ;Делим AX на DL ;Остаток от деления AH записываем в tmp ;Записываем в DL результат деления AL ;Конвертация в цифру(30h – ‘0’) ;Вывод на экран содержимого DL ;Вызов ДОС ;Записываем в DL tmp ;Конвертация в цифру(30h – ‘0’) ;Вывод на экран содержимого DL ;Вызов ДОС ;Дважды увеличиваем на 1 индекс элементов ;обоих массивов ;функция вывода сообщения на экран ;берём адрес строки ;вызов ДОС ;повтор show2 ;возврат из процедуры ;конец процедуры outp2   ;Начало программы begin ;вызов процедуры prep ;вызов процедуры outp ;берём адрес строки ;вызов ДОС ;вызов процедуры outp2   ;функция вывода сообщения на экран ;берём адрес строки ;вызов ДОС ;вызов процедуры add_proc ;вызов процедуры outp ;вызов процедуры prep ;функция вывода сообщения на экран ;берём адрес строки ;вызов ДОС ;вызов процедуры sub_proc ;вызов процедуры outp ;вызов процедуры prep   ;функция вывода сообщения на экран ;берём адрес строки ;вызов ДОС ;вызов процедуры mul_proc ;вызов процедуры outp ;вызов процедуры prep   ;функция вывода сообщения на экран ;берём адрес строки ;вызов ДОС ;вызов процедуры div_proc ;вызов процедуры outp ;вызов ДОС ;функция 4сh завершения программы ;вызов дос ;конец сегмента команд ;начало сегмента стека ;Резервируем 256 байт для стека ;конец сегмента стека ;конец begin

Компиляция программы

tasm lab2.asm

Компановка программы

tlink lab2.obj

Запуск и тестирование

lab2.exe


Вывод

При выполнении лабораторной работы я изучил форматы и правила работы с командами сложения, умножения, вычитания и деления микропроцессоров семейства х86, а также приобрел практические навыки по составлению простейших программ на языке Ассемблера, их выполнению и отладке.

СПИСОК ЛИТЕРАТУРЫ

1. Юров В. И., Assembler: Практикум. 2-е изд. 2007 год, 400 с.

2. Абель П. Язык ассемблера для IBM PC и программирования: Пер.с англ.-М.:Высшая шк.2006 г.- 336 с.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-11-19 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: