Вы находитесь на странице: 1из 28

Архитектура

вычислительных
систем
Лабораторный практикум

Чита, 2010
УДК 681.14 (075.3)
ББК З97 я73

Печатается по решению Ученого совета Забайкальского


государственного гуманитарно-педагогического университета
им. Н. Г. Чернышевского

Ответственный за выпуск: С.Е. Старостина, канд. пед. наук, доцент,


проректор по учебной работе ЗабГГПУ

Рецензенты: А.А. Гурулев, канд. физ.-мат. наук, старший научный сотрудник


Читинского Института природных ресурсов, экологии и криологии СО РАН
В.Б. Венславский, канд. физ.-мат. наук, доцент кафедры
информатики, теории и методики обучения информатике
ЗабГГПУ им. Н.Г. Чернышевского

Архитектура вычислительных систем: Лабораторный практикум/ сост. А.С. Истомин,


Е.И. Холмогорова; Забайкал. гос. гум.-пед. ун-т. – Чита: Изд-во ЗабГГПУ, 2010 г. – 27 с.

Лабораторный практикум предназначен для проведения практических занятий по


дисциплине «Архитектура вычислительных систем» и организации самостоятельной
работы студентов 3-4 курсов физико-математического факультета.

2
ОГЛАВЛЕНИЕ

ВВЕДЕНИЕ................................................................................................................................4
Архитектура компьютера......................................................................................................4
Лабораторная работа №1..........................................................................................................8
Создание программы на языке ассемблера.........................................................................8
Задание для выполнения:......................................................................................................9
Лабораторная работа №2........................................................................................................10
Применение функций DOS и BIOS....................................................................................10
Задания для выполнения:....................................................................................................10
Задания для самостоятельного выполнения:....................................................................10
Лабораторная работа №3........................................................................................................11
Линейные алгоритмы..........................................................................................................11
Задания для выполнения:....................................................................................................12
Задания для самостоятельного выполнения:....................................................................12
Лабораторная работа №4........................................................................................................13
Десятичная арифметика......................................................................................................13
Задания для выполнения:....................................................................................................14
Задания для самостоятельного выполнения:....................................................................14
Лабораторная работа №5........................................................................................................15
Команды передачи управления..........................................................................................15
Задания для выполнения:....................................................................................................16
Задания для самостоятельного выполнения:....................................................................16
Лабораторная работа №6........................................................................................................17
Организация циклов. Циклы с условием...........................................................................17
Задания для выполнения:....................................................................................................18
Задания для самостоятельного выполнения:....................................................................18
Лабораторная работа №7........................................................................................................19
Организация циклов. Циклы со счетчиком.......................................................................19
Задания для выполнения:....................................................................................................19
Задания для самостоятельного выполнения:....................................................................20
Лабораторная работа №8........................................................................................................21
Работа с массивами..............................................................................................................21
Задания для выполнения:....................................................................................................22
Задания для самостоятельного выполнения:....................................................................22
Лабораторная работа №9........................................................................................................23
Цепочечные команды..........................................................................................................23
Задания для выполнения:....................................................................................................24
Задания для самостоятельного выполнения:....................................................................25
Приложение 1...........................................................................................................................26
Таблица кодов символов ASCII.........................................................................................26
Приложение 2...........................................................................................................................27
Функции DOS и BIOS.........................................................................................................27

3
ВВЕДЕНИЕ
Архитектура компьютера
Архитектура компьютера (АК) - абстрактное представление компьютера, которое
отражает его схемотехническую, логическую и функциональную организацию. В понятие
архитектуры компьютера входят:
1. Структурная схема
2. Организация и разрядность интерфейсов
3. Набор и доступность регистров
4. Организация памяти

1. Структурная схема

Рис 1

где МП - микропроцессор, АЛУ - арифметико-логическое устройство, УУ - устройство


управления, ОЗУ - оперативное запоминающее устройство, ША - шина адреса, ШД - шина
данных, ШУ - шина управления.
2. Организация и разрядность интерфей сов
При рассмотрении общей схемы ЭВМ под интерфейсами подразумевают шины обмена
информацией (на схеме ША - шина адреса, ШД - шина данных, ШУ - шина управления).
Посредством этих шин организован интерфейс (связь, взаимодействие) между МП и
другими частями компьютера.
Для ПК на базе процессора i8086 эти шины имеют следующие разрядности:
шина адреса - 20;
шина данных - 8;
шина управления - 1.
3. Набор и доступность регистров
Регистр - 16ти-разрядная ячейка памяти, расположенная непосредственно в МП. Доступ к
таким ячейкам осуществляется намного быстрее, чем к ячейкам памяти в ОЗУ. МП
содержит большое количество регистров, и каждый из них имеет собственное название.
Не все регистры доступны для практического использования. Ниже приведена
классификация по функциональному назначению доступных регистров.
a) Регистры общего назначения
4
ax  ah al si   
 
bx  bh bl di   
 
cx  ch cl sp   
 
dx  dh dl bp   
 
Рис 2

Особенностью данной группы регистров является то, что они могут использоваться при
различных арифметико-логических операциях (регистры арифметико-логического
устройства).
Для регистров ax, bx, cx, dx можно получить доступ отдельно к старшему или младшему
байту слова. Старший байт обозначается h (high), младший - l (low). Так регистр ax может
использоваться и целиком, и по частям: ah - старший байт регистра ax, al - младший байт
регистра ax (см. Рис 2).
Регистры si и di называют индексными регистрами, их можно использовать по своему
усмотрению, но официально они предназначены для поддержки цепочечных команд.
Регистры sp и bp лучше не использовать без особой необходимости на начальном этапе
изучения ассемблера. Данные регистры используются при работе со специальной
областью памяти - стеком, неправильное их использование может внести в программу
труднообнаруживаемые ошибки.
b) Сегментные регистры
Название «сегментные» данные регистры получили от применяемого в МП Intel способа
адресации памяти. Этот способ состоит в поблочном использовании памяти, блоки
называются сегментами. Каждая программа может одновременно использовать 4 сегмента
(блока) памяти:
 сегмент с кодом программы;
 сегмент с данными;
 сегмент стека;
 дополнительный сегмент данных.
Для задания местоположения этих сегментов в памяти (для адресации) и применяются
сегментные регистры. В данную группу входят 4 регистра:
 cs (code segment) - сегмент кода;
 ds (data degment) - сегмент данных;
 ss (stack segment) - сегмент стека;
 es (extension data segment) - дополнительный сегмент данных.
c) Регистры состояния и управления
Регистры данной группы предоставляют доступ к некоторой дополнительной информации
о состоянии МП и о результате выполнения последней арифметико-логической операции.
Регистр указатель (ip)
В регистре ip содержится адрес команды, которая будет выполняться следующей.
Фактически этот адрес содержится в паре регистров cs:ip. cs содержит адрес сегмента
кода, а ip - смещение (положение относительно начала сегмента) нужной команды (см.
организация памяти).
Флаговый регистр (flags)
Флаговый регистр особо выделяется среди всех остальных. У этого регистра каждый бит
(для флагового регистра биты именуется флагами) имеет определённое назначение и
собственное название. Флаги отражают состояние микропроцессора и особенности
5
результата выполнения последней арифметической или логической операции. Флаг либо
установлен, либо сброшен (0, 1).
x 0 x x OF DF IF TF SF ZF 0 AF 0 PF 1 CF
Флаги состояния:
 CF (Carry) - флаг переноса. Используется арифметическими командами и
командами сдвигов;
 PF (Parity) - флаг контроля четности. Содержит 1, если сумма единиц в восьми
младших разрядах регистра является четным числом, или 0, если она нечетна;
 AF (Auxiliary) - дополнительный флаг переноса. Содержит значение переноса из
3-го бита восьмибитовых данных;
 ZF (Zero) - флаг ноля. Содержит 1, если результат арифметической операции или
операции сравнения нулевой, в противном случае содержит 0;
 SF (Sign) - знаковый флаг. Содержит знак результата (старший бит) после
выполнения арифметических операций (0 = '+',1= '-');
 OF (Overflow) - флаг переполнения. Указывает, что в результате выполнения
арифметической команды возникло переполнение старшего разряда результата;
Флаг управления:
 DF (Direction) - флаг направления. Определяет, в каком направлении будут
обрабатываться данные цепочечными командами - от младших адресов к старшим
или наоборот;
Системные флаги:
 IF (Interrupt) - флаг разрешения прерываний. Указывает на возможность внешних
прерываний;
 TF (Trap) - флаг пошагового выполнения. Устанавливает выполнение
команд процессора в пошаговом режиме (для отладки программ).
4. Организация памяти
Физическая память, к которой МП имеет доступ, называется оперативной памятью (ОП)
или оперативным запоминающим устройством (ОЗУ). Память можно условно представить
в виде простой последовательности пронумерованных байт. Порядковый номер байта
называется его физическим адресом.
Доступ к любому байту ОЗУ осуществляется по шине адреса, которая, как мы уже
говорили, является 20-разрядной (для i8086). Разрядность шины ограничивает объём
доступной памяти, так 20 разрядов шины позволяют записать адреса от 0 до 2 20-1 (1
Мбайт). Все адреса удобнее записывать в шестнадцатеричном виде (диапазон физических
адресов от 00000h до FFFFFh).
Для записи любого физического адреса необходимо 20 разрядов. Но все регистры МП 16-
разрядные. Для получения 20-разрядного адреса используется следующий механизм:
1. Всю физическую память условно можно разбить на параграфы (1 параграф = 16 байт);
2. Память будем выделять программам только небольшими блоками, данные блоки
будем в дальнейшем называть сегментами памяти или просто сегментами.
3. Программа может состоять из любого количества сегментов;
4. Каждый сегмент может начинаться только с начала параграфа, т.е. адресом сегмента
будет номер его первого параграфа (такой адрес уже 16-разрядный);

6
Рис 3
Такой механизм называется сегментацией, он поддерживается на аппаратном уровне (мы
не можем его заменить или изменить). В МП имеются специальные сегментные регистры,
которые содержат адреса сегментов в памяти.
Так как под адресом сегмента понимается номер параграфа, с которого он начинается, то
для получения физического адреса начала сегмента необходимо умножить его на 16.
Например, сегмент 0032h имеет физический адрес 0032h x 10h = 00320h.
Для определения адреса конкретной ячейки памяти недостаточно знать адрес сегмента, в
котором она находится. Необходимо знать позицию этой ячейки относительно начала
сегмента. Этот относительный адрес называют эффективным адресом или смещением.
Поскольку максимальный размер сегмента ограничен 64 килобайтами, то смещение будет
записываться 16-разрядным значением.
Таким образом, от 20-разрядного физического адреса мы перешли к адресу, состоящему
из двух 16-разрядных частей: адрес сегмента и смещение. Такие составные адреса
называются логическими и записываются так:
96AF : E305

сегмент смещение
Механизм сегментации служит не только для перехода от 20-разрядных физических
адресов к 16-разрядным логическим, он необходим для защиты программ от взаимного
влияния.

7
Лабораторная работа №1
Создание программы на языке ассемблера
В отличие от языков программирования высокого уровня, язык ассемблера поставляется
без среды разработки программ. Поэтому разработчику приходится самостоятельно
контролировать весь процесс создания программы. Для языка ассемблера этот процесс
включает в себя следующие этапы:
1. Постановка задачи (точное и подробное описание функциональности будущей
программы, а также описание всех входных и выходных данных и способа их
передачи программе);
2. Разработка алгоритма программы (построение блок схемы, граф-схемы или
текстовое или математическое описание решения);
3. Формализация алгоритма (запись алгоритма на языке программирования).
Создание текстового файла программы с расширением .asm (например my.asm).
Отсутствие среды разработки позволяет программисту самостоятельно выбрать
текстовый редактор для написания кода программы. Для этой цели подойдет любой
текстовый редактор с нумерацией строк, мы рекомендуем редактор, встроенный в
оболочку «FAR Manager».
4. Компиляция программы;
Компиляция - процесс перевода программы из текстового вида в машинный код. При
использовании компилятора фирмы Borland необходимо выполнить:
tasm my.asm
т.е. запускаем компилятор tasm и передаем с командной строки имя файла,
содержащего программу. Если программа имеет синтаксические ошибки, компилятор
выдаст сообщение об ошибке с указанием номера строки и описанием для каждой
ошибки (нужно вернуться на этап №3 и исправить синтаксические ошибки).
В случае успешной компиляции будет создан файл, содержащий объектный код
программы my.obj, который ещё не является исполняемым модулем.
5. Компоновка программы;
Компоновка - создание из файла объектного кода исполняемого модуля.
tlink my.obj
В качестве параметра компоновщик tlink принимает имя файла содержащего
объектный код программы (в нашем случае - my.obj). В случае успешной компоновки
будет создан исполняемый модуль my.exe
6. Запуск и тестирование исполняемого модуля программы.
На данном этапе необходимо проверить, соответствует ли написанная программа
постановке задачи, сделанной нами на этапе №1. Неправильная работа программы
говорит об алгоритмической ошибке (семантическая ошибка), поэтому для успешного
её устранения нужно вернуться на этап разработки алгоритма (этап №2).
Написание первой программы на языке ассемблера
1. Постановка задачи. Написать программу, которая выводит на экран строчку
«Привет!».
2. Разработка алгоритма программы. Алгоритм линейный, разработки не требует.
3. Формализация (запись) алгоритма.
В текстовом редакторе создаем файл privet.asm и записываем в него следующий
код (без номеров строк):
1 data segment ;описание сегмента данных
2 mes db 'Привет!$' ;строка для вывода. '$' - конец строки
3 data ends ;конец сегмента данных
4
5 code segment ;начало сегмента кода
6 start: ;метка start - начало нашей программы
8
7 assume cs:code, ds: data ;директива компилятора
8 mov ax, data ;настройка сегмента данных
9 mov ds, ax  
10
11 mov ah, 9 ;функция №9 - вывод строки на экран
12 lea dx, mes ;берём адрес строки
13 int 21h ;вызов прерывания для вывода строки
14
15 mov ax, 4c00h ;функция завершения программы
16 int 21h ;завершаем программу
17 code ends ;конец сегмента кода
18 end start ;конец программы с точкой входа start

4. Компиляция программы
tasm privet.asm
5. Компоновка программы
tlink privet.obj
6. Запуск и тестирование
privet.exe
Описание программы privet.asm
Строки 1-3 программы privet.asm содержат описание сегмента данных. Сегмент данных
– область память, в которой будут храниться данные для наших программ.
Строки 5-17 – это код программы, её исполняемая часть.
В 8 и 9 строках выполняется настройка сегмента данных программы.
Строки 11-13 – вывод строки на экран при помощи функции №9 прерывания 21h
(подробнее о функциях и работе с ними на следующей лабораторной работе).
15 и 16 строки – стандартное завершение программы.
После символа ';' пишутся комментарии, они не обрабатываются компилятором.
Переход на новую строку
Для организации перехода на новую строку достаточно вывести на экран символы
перевода строки и возврата каретки (CR/LF). Эти символы имеют коды 10 и 13. Если в
нашей программе необходимо после вывода строки перейти на новую, то для этого
достаточно переписать вторую строку программы:
mes2 db 'Выводим строку и переходим на новую...', 10, 13, '$'
Переход на новую строку можно выполнить и до вывода сообщения на экран:
mes3 db 10, 13, 'Выводим с новой строки...$'
Задание для выполнения:
Написать программу, которая выводит одно под другим следующие сообщения:
Привет!
Меня зовут компьютер!
До свидания!

9
Лабораторная работа №2
Применение функций DOS и BIOS
В лабораторной работе №1 приведена программа вывода строки на экран. Вывод строки в
этой программе осуществляется посредством обращения к функции операционной
системы (ОС). Кроме этой функции ОС содержит большое количество других функций,
которые можно использовать при разработке программ. Для вывода строки на экран
использовалась функция №9 прерывания №21h. Прерывание - специальный набор
готовых процедур, постоянно доступный для использования.
В приложении 2 приведены две таблицы, которые содержат описания некоторых наиболее
часто используемых функций. Функции из первой таблицы относятся к прерыванию ОС
№21h, функции второй таблицы - к прерыванию BIOS (№10h).
Общий алгоритм применения функций любого прерывания
1. Поместить номер вызываемой функции в регистр ah;
2. Подготовить, если необходимо, входные данные для функции;
3. Вызвать прерывание;
4. Сохранить или обработать выходные данные
Пример 1: Вывести на экран символ '$'
mov ah, 02 ;номер функции
mov dl, '$' ;входные данные
int 21h ;вызов прерывания
Пример 2: Очистить экран
mov ah, 0fh ;получить параметры видеорежима
int 10h
mov ah, 00 ;установить параметры видеорежима
int 10h
Задания для выполнения:
1. В центре чистого экрана вывести слово «Привет». (5 баллов)
2. Вывести по углам экрана (с отступом по 3 символа от углов) символы от '1' до '4'. (5
баллов)
Задания для самостоятельного выполнения:
1. В центре чистого экрана вывести слово «Привет» вертикально. (5 баллов)
2. Вывести приглашение к вводу символа, ввести символ, вывести введенный символ в
центре очищенного экрана. (8 баллов)

10
Лабораторная работа №3
Линейные алгоритмы
Вопросы для повторения:
1. Какие алгоритмы называются линейными?
2. Какие действия обычно выполняются на линейных участках алгоритмов?
3. Что такое программа-отладчик? Назовите примеры таких программ.
4. Для чего необходимо кодирование информации? Приведите примеры кодирования
информации, которые вы применяете.
5. Что называется ASCII-кодами?
Линейными называются такие алгоритмы, в которых все действия выполняются
поочередно, друг за другом.
На линейных участках алгоритмов обычно выполняются манипуляции данными,
вычисление выражений, перекодировка информации.
Команда пересылки данных:
mov <приемник>, <источник>
команда mov – команда пересылки данных, результатом ее исполнения является
копирование данных из операнда <источник> в операнд <приемник>.
mov ah, 09 ; записать в регистр ah число 09
mov cl, ah ; скопировать байт из регистра ah в ch
mov bx, cx ; скопировать слово из регистра cx в регистр bx
mov ch, 0fh
mov ch, bl
Вопрос: чему будет равно содержимое регистра ch после выполнения данного участка
программы?
Простейшие арифметические команды:
Команда Описание
add <слагаемое 1>, <слагаемое 2> Записать в операнд <слагаемое 1> значение
суммы обоих операндов;
inc <операнд > Увеличить <операнд > на единицу;
sub <операнд 1>, <операнд 2 > Записать в операнд <операнд 1> значение
разности операндов;
dec <операнд > Уменьшить <операнд> на единицу.
mul <сомножитель 2> Умножает <сомножитель1> на <сомножитель2>
если <сомн2> - байт, то <сомн1> - регистр al
(результат - слово в ax);
если <сомн2> - слово, то <сомн1> - регистр ax
(результат - двойное слово в dx:ax);
div <делитель> Делит <делимое> на <делитель>
если <делитель> - байт, то <делимое> - регистр
ax (результат - частное в al, остаток в ah);
если <делитель> - слово, то <делимое> -
регистровая пара dx:ax (результат - частное в ax,
остаток в dx);
Отладчик Turbo Debugger
Отладчик Turbo Debugger ( TD) – оконная среда отладки программ, позволяет
производить отладку программ, написанных на языках Pascal, C, assembler.
TD позволяет определить:
 место логической ошибки (семантической);
 причину логической ошибки.
11
Для использования TD необходимо выполнить следующие действия:
tasm /zi *.asm ;откомпилировать с добавлением отладочной информации
tlink / v *. obj ;скомпоновать с добавлением отладочной информации
td *. exe
Файл с исходным кодом программы должен находиться в директории отладчика.

Задания для выполнения:


1. Вывести на экран сумму двух введенных с клавиатуры цифр (значение вводить так,
чтобы сумма была меньше 10). (10 баллов)
2. Изучите работу отладчика TD на примере задачи из первого задания.
Необходимо изучить:
a) Систему меню программы TD.
b) Выполнение программы в четырех режимах
 режим безусловного выполнения;
 выполнение по шагам;
 до текущего положения курсора;
 с установкой точек прерывания.
с) Систему вспомогательных окон
 CPU;
 Dump.
Задания для самостоятельного выполнения:
1. С клавиатуры вводятся два символа. Вывести их в обратном порядке (Например:
'1gg1', 'assa', '-==-'); (5 баллов)
2. Имеется два числа (цифры) a и b. Вычислить y = 2a - b + 1; (8 баллов)
3. Вывести на экран сумму двух любых введенных с клавиатуры цифр (сумма может
быть больше 10) (12 баллов)

12
Лабораторная работа №4
Десятичная арифметика
Вопросы для повторения:
1. Что такое позиционные системы счисления?
2. Что называется двоичной (десятичной) арифметикой?
3. Каково назначение BCD-кода?
4. Какие команды работают с BCD-числами?
5. Как работают команды daa и das?
Команды десятичной арифметики
Рассматриваемые ниже команды предназначены для работы с неупакованными BCD-
числами. Изучите их работу по приведенным в таблице примерам.
  Назначение Алгоритм работы Пример
aaa коррекция результата сложения 1. проанализировать значение mov al, 7
двух одноразрядных младшего полубайта регистра al и mov ch, 6
неупакованных BCD-чисел значение флага af; add al, ch
2. если (значение младшего полубайта aaa
регистра al >9) или (AF=1), то выполнить
следующие действия: ; ah=1
o увеличить значение al на 6; ; al=3
o очистить старший полубайт
регистра al;
o увеличить значение ah на 1;
o установить флаги: af = 1, cf = 1,
иначе сбросить флаги af = 0 и cf = 0.
aas коррекция результата вычитания если (младший полубайт регистра al mov al, 5
двух неупакованных меньше 9) или (флаг af=1), то выполнить mov ch, 6
одноразрядных BCD-чисел следующие действия: sub al, ch
1. уменьшить значение младшего aas
полубайта регистра al на 6;
2. обнулить значение старшего ; al=9
полубайта регистра al;
3. установить флаги af и cf в 1;
иначе установить флаги af и cf в 1
aam 1. коррекция результата 1. разделить значение регистра al на mov al, 7
умножения двух неупакованных 10; mov ch, 6
BCD-чисел; 2. записать частное в регистр ah, mul ch
2. преобразование двузначного остаток - в регистр al. aam
числа (<= 9910) из двоичного
вида в его неупакованный BCD- ; ah=4
эквивалент ; al=2
aad 1. подготовка двух 1. умножить значение регистра ah на mov ah, 4
неупакованных BCD-чисел для 10 и сложить полученное значение с mov al, 2
операции деления; содержимым регистра al: (ah*10)+al; aad
2. преобразование двузначного 2. присвоить регистру al значение ; al=42
неупакованного ВCD-числа в (ah*10)+al; mov cl, 6
двоичное представление 3. обнулить регистр ah div cl
; al=7
13
Задания для выполнения:
1. Вывести на экран сумму двух введенных с клавиатуры двузначных чисел (Вводить
посимвольно функцией 01 прерывания 21h, значение вводить так, чтобы сумма была
меньше 100). Для решения задачи применить команды десятичной арифметики.
Проследить за выполнением операций с использованием отладчика. (10 баллов)
Задания для самостоятельного выполнения:
1. Вывести на экран байт в десятичном виде (10 баллов)

14
Лабораторная работа №5
Команды передачи управления
Вопросы для повторения:
1. Какие операторы используются в языках высокого уровня на нелинейных участках
программы?
2. Что такое регистр флагов, флаги и для чего они используются?
3. Запишите оператор выбора (case) в виде последовательности условных конструкций
языка высокого уровня.
Для организации безусловного перехода используется команда jmp <метка> (от слова
jump - прыжок)
jmp m1 ;безусловный переход на метку m1
mov dl, '$' ;данная команда не будет выполнена
m1: mov dh, 100 ;

Все команды условного перехода имеют одинаковый синтаксис:


Jxx <метка>, где xx определяется условием перехода.
В качестве источника условия может использоваться регистр cx, любая арифметическая
или логическая команда или специальная команда сравнения cmp:
Команда сравнения cmp <оп1>,<оп2> работает почти также как и команда вычитания sub,
разница состоит лишь в том, что команда cmp не записывает результат вычитания в
первый операнд, результатом выполнения данной команды является установка флагов
состояния (команды условного перехода анализируют эти флаги).
Таблица 1. Перечень команд условного перехода для команды cmp
<операнд_1>,<операнд_2>
Типы операндов Команда Критерий перехода Значения флагов
Любые  je  операнд_1 = операнд_2  zf = 1 
Любые  jne  операнд_1<>операнд_2  zf = 0 
Со знаком  jl / jnge  операнд_1 < операнд_2  sf <> of
Со знаком  jle / jng  операнд_1 <= операнд_2  sf <> of or zf = 1 
Со знаком  jg / jnle  операнд_1 > операнд_2  sf = of and zf = 0
Со знаком  jge / jnl  операнд_1 => операнд_2  sf = of 
Без знака  jb / jnae  операнд_1 < операнд_2  cf = 1 
Без знака  jbe / jna  операнд_1 <= операнд_2  cf = 1 or zf=1 
Без знака  ja / jnbe  операнд_1 > операнд_2  cf = 0 and zf = 0 
Без знака  jae / jnb  операнд_1 => операнд_2  cf = 0 
Таблица 2. Команды перехода по состоянию флагов
Команда Флаг Команда Флаг
jc cf = 1 jnc cf = 0
jp pf = 1 jnp pf = 0
jz  zf = 1  jnz  zf = 0 
js  sf = 1  jns  sf = 0 
jo  jo = 1  jno  jo = 0 
Команда перехода по состоянию регистра cx:
15
jcxz <метка> ;прейти, если cx = 0
Пример: С клавиатуры вводятся два символа, вывести на экран сообщение 'одинаковые',
если введены два одинаковых символа, иначе вывести 'разные'.
1    data segment ;
2           mes_e db 10, 13, 'Одинаковые$'  
3           mes_ne db 10, 13, 'Разные$'  
4   data ends  
5        
6   code segment  
7   start:  
assume cs:code, ds:
8     data      
9     mov ax, data  
10    mov ds, ax  
11       
12    mov ah, 01 ;вводим первый символ и запоминаем его в bl
13    int 21h  
14    mov bl, al  
15       
16    int 21h ;вводим второй символ
17       
18    mov ah, 09  
19    lea dx, mes_ne ;пусть символы неравны
20    cmp bl, al ;сравниваем их
21    jne m_ne ;если они неравны, переходим на вывод
сообщения
22    lea dx, mes_e ;иначе загружаем адрес другой строки
23  m_ne: int 21h ;и выводим
24       
25    mov ax, 4c00h  
26    int 21h  
27  code ends  
28  end start  
 
Задания для выполнения:
1. Определить, ввел ли пользователь букву 'Y' или любую другую. (3 балла)
2. Вывести два введенных с клавиатуры числа в порядке возрастания. (3 балла)
3. Вывести максимальное из трёх введенных с клавиатуры чисел. (5 баллов)
Задания для самостоятельного выполнения:
1. С клавиатуры вводятся два числа задающие отрезок [a, b]. Определить, попадает ли
третье число c в заданный отрезок. (8 баллов)
2. Написать программу, которая по введенному номеру месяца выводит время года (15
баллов)

16
Лабораторная работа №6
Организация циклов. Циклы с условием
Вопросы для повторения:
1. Какие операторы цикла используются в языках программирования высокого уровня?
2. Можно ли записать эти циклы используя только условные операторы.
Цикл – особая алгоритмическая структура, без которой не обойдется ни один язык
программирования. Организовать циклическое выполнение части кода программы можно
при помощи команд передачи управления.
Задача: необходимо вывести на экран цифры от ‘0’ до ‘9’, используя цикл с предусловием
и цикл с постусловием.
Цикл с предусловием:

  mov dl, '0'


  mov ah, 02
cikl: cmp dl, '9'
  ja end_cikl
  int 21h
  inc dl
  jmp cikl
end_cikl:  

Цикл с постусловием:

  mov dl, '0'


  mov ah, 02
cikl:  
  int 21h
  inc dl
  cmp dl, '9'
  jbe cikl

Задания для выполнения:


1. С клавиатуры вводится цифра, необходимо вывести на экран все цифры, начиная с ‘0’
и заканчивая введенной с клавиатуры. (5 баллов)

17
2. С клавиатуры вводится последовательность цифр. Ввод цифр заканчивается нажатием
клавиши Enter (код 13). Необходимо вывести на экран количество введенных цифр. (8
баллов)
Задания для самостоятельного выполнения:
1. С клавиатуры вводится последовательность цифр. Вывести на экран количество
четных и сумму нечетных элементов. (5 баллов)
2. С клавиатуры вводится последовательность цифр. Вывести количество чисел,
попадающих в отрезок [a , b], a и b также вводятся с клавиатуры. (8 баллов)

18
Лабораторная работа №7
Организация циклов. Циклы со счетчиком
Вопросы для повторения:
1. Какие операторы цикла используются в языках программирования высокого уровня?
2. Можно ли записать эти циклы, используя только условные операторы?
Цикл – особая алгоритмическая структура, без которой не обойдется ни один язык
программирования. Организовать циклическое выполнение части кода программы можно
при помощи команд передачи управления.
Задача: необходимо вывести на экран цифры от ‘0’ до ‘9’, используя цикл со счетчиком.
Цикл со счетчиком можно организовать, используя те же условные команды, взяв в
качестве счетчика любой свободный регистр. Но в микропроцессоре предусмотрены
специальные команды для организации таких циклов: loop / loope / loopne . Эти команды
используют в качестве счетчика регистр cx, они сами уменьшают его значение после
каждой итерации цикла и сравнивают после уменьшения с нулём.
Команда loop <метка перехода> выполняет следующие действия:
 уменьшает регистр cx ;
 сравнивает cx с нулем, если cx >0, то управление передается на метку перехода
(продолжаем цикл).
Команды loope/loopne позволяют выйти из цикла по дополнительному условию.
Примечание: при написании вложенных циклов loop , необходимо помнить, что все они
используют для счетчика один и тот же регистр – cx . Для правильной работы необходимо
сохранить счетчик внешнего цикла ( push cx ) до инициализации внутреннего и
восстановить его ( pop cx ) после команды loop внутреннего цикла.

  mov cx, 10
  mov dl, '0'
  mov ah, 02
cikl:  
  int 21h
  inc dl
  loop cikl

Задания для выполнения:


1. С клавиатуры вводится 10 цифр. Вывести на экран их сумму. (8 баллов)
2. Используя цикл в цикле, вывести на экран следующий прямоугольник:
12345
23456
19
34567
45678
56789 (8 баллов)
Задания для самостоятельного выполнения:
1. Найти сумму натуральных чисел от 1 до N (N вводится с клавиатуры). (5 баллов)
2. Вывести на экран прямоугольник из символов h размером m x n , начиная с позиции
(x , y). x , y , m , n , h – вводятся с клавиатуры. (10 баллов)

20
Лабораторная работа №8
Работа с массивами
Вопросы для повторения:
1. Для каких данных целесообразно использовать массивы?
2. Как организуется работа с массивами в языках высокого уровня?
3. Какие алгоритмы существуют для сортировки массивов и поиска элементов в них?
В языке ассемблера не существует специальных средств для организации работы с
массивами. Массивы описываются в виде последовательности элементов нужной
размерности; работа с ними ведется с использованием методов косвенной адресации.
Пример: Задан массив. Вывести на экран сумму его элементов.
1    data segment  
mas db 12, 2, 7, 3, 2, 0, 21, 9,
2           0, 16  ;исходный массив
3           len dw $-mas ;размер массива в байтах
4   data ends  
5        
6   code segment  
7   start:  
8     assume cs:code, ds: data      
9     mov ax, data  
10    mov ds, ax  
11       
12    lea bx, mas ;берём в bx адрес первого элемента
13    mov cx, len ;счетчик цикла
14    xor ax, ax  
;прибавляем к al байт, адрес которого
15  cikl: add al, [bx]
хранится в bx
16    inc bx ;переходим к следующему элементу
17    loop cikl  
18       
19    aam ;преобразуем сумму в BCD-код
20    add ax, 3030h ;затем в ASCII-код
21    mov bx, ax ;и выводим
22    mov ah, 02  
23    mov dl, bh  
24    int 21h  
25    mov dl, bl  
26    int 21h  
27       
28    mov ax, 4c00h  
29    int 21h  
30  code ends  
31  end start  
При обработке не байтовых массивов следует учитывать размер элементов. Так в
приведенном выше примере в строке 3 вычисляется размер массива в байтах, и в строке
13 он берётся за количество элементов. Для массива слов это значение придется поделить
на 2. В строке 16 для перехода к следующему элементу используется простой инкремент
адреса, для массива слов эта строка может выглядеть так: add bx, 2.

21
Задания для выполнения:
1. Подсчитать в массиве количество элементов, равных введённому N. (5 баллов)
2. Заменить в массиве все четные элементы нулями. (7 баллов)
3. Определить номер первого равного нулю элемента. (7 баллов)
Задания для самостоятельного выполнения:
1. Вывести на экран все нечетные элементы массива. (5 баллов)
2. Отсортировать массив по возрастанию, используя любой известный алгоритм
сортировки. (15 баллов)

22
Лабораторная работа №9
Цепочечные команды
Вопросы для повторения:
1. Что такое массивы и в каких случаях они используются?
2. Как организуется доступ к элементам массивов?
3. Какие еще структурированные типы данных поддерживаются языками высокого
уровня?
Кроме привычного всем понятия массивов в ассемблере существует структура называемая
цепочкой. Цепочка – непрерывная последовательность байт, слов или двойных слов,
обрабатываемая как единое целое. Основное отличие цепочек от массивов состоит в
способе доступа к элементам: для массивов – произвольный доступ, для цепочек – только
последовательный (от начала цепочки к концу или от конца к началу). Цепочечные
команды - команды для обработки цепочек. Особенностью всех цепочечных команд
(кроме обработки очередного элемента цепочки) является автоматическое продвижение к
следующему элементу цепочки.
Цепочечные команды:
Название Команды Действие
movs копирует один элемент цепочки
<адр. приемника>,
пересылка цепочки <адр. источника> из операнда источника в операнд
movsb, movsw, mowsd приемник
cmps сравнивает элементы цепочек из
<адр. приемника>,
сравнение цепочек <адр. источника> операнда источника и операнда
cmpsb, cmpsw, cmpsd приемника
сканирует цепочку приёмник на
сканирование scas <адр. приемника> присутствие некоторого
цепочки scasb, scasw, scasd элемента (задаётся в регистре
аккумуляторе)
загрузить элемент из цепочки
загрузка элемента из lods <адр. источника>
lodsb, lodsw, lodsd источника в регистр
цепочки
аккумулятор
восстановить элемент из
сохранение элемента stos <адр. приемника>
stosb, stosw, stosd регистра аккумулятора в
в цепочке
цепочку
получение элемента ins <адр. приемника>, загрузить элемент в цепочку
цепочки из порта <номер порта> приемник из указанного порта
ввода/вывода insb, insw, insd ввода/вывода
вывод элементов outs <номер порта>, переслать элемент из цепочки
цепочки в порт <адр. источника> источника в указанный порт
ввода/вывода outbs, outws, outds ввода/вывода
Особенности использования
Адресация операндов
цепочка источник – ds:si
цепочка приёмник – es:di
Направление обработки
1. от начала к концу

23
df = 0; si и di автоматически увеличиваются
команда cld (clear direction flag) сбрасывает флаг df
2. от конца к началу
df = 1; si и di автоматически уменьшаются
команда std (set direction flag) устанавливает флаг df
Префиксы повторения
Префиксы повторения зацикливают выполнение команды, позволяя обрабатывать всю
цепочку одной командой. Префиксы повторения указываются перед нужной цепочечной
командой в поле метки. Цепочечная команда без префикса повторения выполняется один
раз, с префиксом - в цикле.
rep выполнять, пока cx<>0 (cx уменьшается автоматически);
repe выполнять, пока cx<>0 или zf=1 (cx уменьшается автоматически);
repne выполнять, пока cx<>0 или zf=0 (cx уменьшается автоматически);
Пример: Написать программу копирования строки.
1    data segment  
2           s1 db 'Тестируемая строка$' ;строка которую будем копировать
3          s2 db 20 dup (' ') ;строка куда будем копировать
4   data ends  
5        
6   code segment  
7   start:  
8     assume cs:code, ds: data     
9     mov ax, data  
10    mov ds, ax ;цепочка источник
11    mov es, ax ;и цепочка приёмник в одном сегменте
12       
13    cld ;обработка от начала к концу
14    lea si, s1 ;цепочка источник
15    lea di, s2 ;цепочка приёмник
16    mov cx, 20 ;количество элементов для обработки
17  rep   movsb ;копируем строку
18       
19    mov ah, 09  
20    lea dx, s2  
21    int 21h ;выводим строку-приёмник на экран
22       
23    mov ax, 4c00h  
24    int 21h  
25  code ends  
26  end start  
Задания для выполнения:
Реализовать на языке ассемблера набор процедур обработки строк из системы Turbo
Pascal
1. Write(S). Вывести строку S на экран (конец строки задается символом с кодом 0). (3
балла)
2. Length(S). Определить длину строки S (конец строки задается символом с кодом 0). (3
балла)
3. Copy(S, p, i). Скопировать из строки S подстроку длиной i символов начиная с
позиции p. (5 баллов)
4. Concat(S1, S2). Выполнить операцию конкатенации строк S1 и S2. (5 баллов)

24
Задания для самостоятельного выполнения:
Реализовать на языке ассемблера набор процедур обработки строк из системы Turbo
Pascal
1. Delete(S, p, i). Удалить из строки S i символов начиная с позиции p. (7 баллов)
2. Insert(S1, S2, p). Вставить подстроку S1 в строку S2 начиная с позиции p. (8 баллов)
3. Pos(S1, S2). Найти номер позиции, с которой начинается подстрока S1 в строке S2. (9
баллов)

25
Приложение 1
Таблица кодов символов ASCII
ASCII - сокращение от American Standard Code for Information Interchange (Американский
стандартный код для обмена информацией). Согласно стандарту ASCII каждому символу
и некоторым операциям соответствует свой числовой код.
Расширенная таблица ASCII состоит из двух частей. Первая (символы с кодами 0-127)
является универсальной (см. табл.), а вторая (коды 128-255) предназначена для
специальных символов и букв национальных алфавитов и на компьютерах разных типов
может меняться.
Символ hex Символ hex Символ hex Символ hex Символ hex Символ hex
  20 0 30 @ 40 P 50 ` 60 p 70
! 21 1 31 A 41 Q 51 a 61 q 71
" 22 2 32 B 42 R 52 b 62 r 72
# 23 3 33 C 43 S 53 c 63 s 73
$ 24 4 34 D 44 T 54 d 64 t 74
% 25 5 35 E 45 U 55 e 65 u 75
& 26 6 36 F 46 V 56 f 66 v 76
' 27 7 37 G 47 W 57 g 67 w 77
( 28 8 38 H 48 X 58 h 68 x 78
) 29 9 39 I 49 Y 59 i 69 y 79
* 2A : 3A J 4A Z 5A j 6A z 7A
+ 2B ; 3B K 4B [ 5B k 6B { 7B
, 2C < 3C L 4C \ 5C l 6C | 7C
- 2D = 3D M 4D ] 5D m 6D } 7D
. 2E > 3E N 4E ^ 5E n 6E ~ 7E
/ 2F ? 3F O 4F _ 5F o 6F ^ 7F
Символы с кодами 0-31 относятся к служебным. Они представляют собой команды, вывод
которых на стандартное выходное устройство приводит к выполнению определённых
действий.

26
Приложение 2
Функции DOS и BIOS
Функции DOS (Int 21h)

Назначение Данные на входе Данные на выход
Функции
Ввод символа с ожиданием и
01 - al - ASCII код
эхосопровождением
Вывод символа 02 dl - ASCII ко -
Ввод символа с ожиданием и без
08 - al - ASCII код
эхосопровождения
Вывод строки на экран   ds:dx - адрес строки
09 с символом '$' на -
конце
Ввод строки с клавиатуры 0ah ds:dx - адрес
буфера со
следующим
форматом:
 1й байт - размер
буфера; Введенная строка
 2й байт - число в буфере с 0dh на
фактически конце
введенных
символов;
 3й байт и
следующие за ним
- буфер под строку

Функции BIOS (Int 10h)



Назначение Данные на входе Данные на выход
Функции
Установить положение курсора dh – строка
02 -
dl - колонка
Прочитать символ и атрибут с bh - № экранной ah – атрибут
08
экрана страницы al - символ
Вставить символ с атрибутом bh - № экранной
страницы;
bl - атрибут;
09 -
al - ASCII код;
cx - число
повторений
Получить параметры al – видеорежим
видеорежима 0fh - bh - № экранной
страницы
Установить параметры al – видеорежим
видеорежима 00h bh - № экранной -
страницы
27
28

Вам также может понравиться