Информатика. Ассемблер для процессора i8086 Одиноков В.В
Заказать
Лабораторная работа N 1. Арифметические операции и вывод символов . . . . .
Лабораторная работа N 2. Ввод-вывод чисел . . . . . . . . . . . . . . . . .
Лабораторная работа N 3. Введение в программирование на ассемблере . . . . .
Лабораторная работа N 4. Дампирование памяти . . . . . . . . . . . . . . Контрольная работа N 1. Представление информации в ЭВМ и
элементы языка ассемблера . . . . . . . . . . . . .
Контрольная работа N 2. Разработка программы на ассемблере .
Лабораторная работа N 1
АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ И ВЫВОД СИМВОЛОВ
Цель работы
Целью настоящей работы является первоначальное знакомство с программой Debug - важнейшим помощником разработчика программ на языке Ассемблер. С помощью этой программы производится анализ и заполнение ячеек регистровой и оперативной памяти, осуществляется пошаговое выполнение программы. Другая цель: знакомство с некоторыми инструкциями Ассемблера, выполняющими арифметические операции, знакомство с инструкциями программного прерывания, а также с инструкциями пересылки данных.
Задание
Р а з р а б о т а й т е с помощью Debug программу, выполняющую вывод на экран текстового сообщения и последующее вычисление выражения:
Y=[(Х1+Х2)ХЗ-Х4]/Х5 ,
где Х1 - Х5 - десятичные целые числа, взятые в соответствии с номером вашего варианта из таблицы 3.
Структура выходного сообщения программы:
"Программа вычисления выражения Y=[(Х1+Х2)ХЗ-Х4]/Х5 , где X1=..., X2=..., X3=..., X4=..., X5=..."
Вместо точек должны выводиться заданные числа (в шестнадцатеричной системе).
Результат вычисления выражения программа помещает в регистры AX и DX. Поэтому этот результат можно наблюдать только при запуске программы из DEBUG (при возврате в DOS содержимое регистров теряется).
Таблица 3
К X1 X2 X3 X4 X5 K X1 X2 X3 X4 X5
1 235 314 11 2320 13 11 417 125 14 3181 11
2 513 248 17 4453 12 12 317 373 13 1920 12
3 197 372 12 3838 17 13 550 241 11 2720 15
4 254 418 14 4118 21 14 632 193 12 3593 21
5 349 517 11 5314 19 15 249 431 17 4111 13
6 267 149 15 2773 14 16 391 463 14 5320 22
7 435 317 13 3815 15 17 561 323 13 6213 23
8 561 273 16 2584 20 18 244 395 15 4713 14
9 321 491 12 4511 13 19 139 456 19 5334 17
10 634 124 19 8416 24 20 286 293 16 4811 21
Результат выполнения работы оформляется в виде .com-файла, помещаемого для пересылки в каталог LAB1.
Примечание 1. Загрузка в регистры заданных чисел (преобразованных вручную в шестнадцатеричную систему) должна производиться только с помощью инструкций MOV.
Примечание 2. Рекомендуется выполнить проверку результата выполнения программы путем сравнения его с результатом ручного счета. Так как при ручном счете используется десятичная система счисления, то перед сравнением результатов их необходимо записать в одной и той же системе.
Лабораторная работа N 2
ВВОД-ВЫВОД ЧИСЕЛ
Цель работы
В процессе выполнения работы решается практически важная задача вывода чисел на экран и их ввода с клавиатуры. Данная задача решается в следующей последовательности. Во-первых, рассматривается вывод на экран двоичного числа в виде последовательности единиц и нулей. Во-вторых, решается задача вывода на экран шестнадцатеричных чисел. В-третьих, рассматривается ввод шестнадцатеричных чисел с клавиатуры.
В ходе работы производится знакомство с очень важными понятиями флагов состояния, стека и процедуры. Изучаются инструкции для работы с этими объектами, а также инструкции сдвига, цикла, условных переходов и некоторые другие.
Одной из целей работы является развитие навыков алгоритмизации задач и отладки программ.
Задание
Р а з р а б о т а й т е программу, вызываемую из DOS, которая выполняет:
1) ввод с клавиатуры двух 4-х значных шестнадцатеричных чисел,
которые записываются в качестве содержимого регистров BP и DI;
2) вывод на экран содержимого регистров, заполненных на шаге 1, в виде двоичных чисел;
3) вывод на экран содержимого регистров, заполненных на шаге 1, в виде шестнадцатеричных чисел.
Пример информации на экране:
ВВЕДИТЕ СОДЕРЖИМОЕ РЕГИСТРА BP F46B<Enter>
ВВЕДИТЕ СОДЕРЖИМОЕ РЕГИСТРА DI 5A0C<Enter>
(BP) = 1111010001101011 (DI) = 0101101000001100
(BP) = F46B (DI) = 5A0C
Примечание 1. В отличие от приводимых в описании работы программ, некоторые 8-битные регистры следует заменить на 16-битные.
Примечание 2. Рекомендуется дополнительно разработать процедуру, выполняющую ввод шестнадцатеричного числа в 16-битный регистр, процедуру вывода содержимого такого регистра в двоичном виде, а также процедуру вывода содержимого 16-битного регистра в шестнадцатеричном виде.
Примечание 3. При реализации вывода второй и третьей шестнадцатеричных цифр числа, сдвигу числа вправо должен предшествовать его сдвиг влево. Для выполнения сдвига влево используйте инструкцию SHL ("Shift Left" - логический сдвиг влево). Использование этой инструкции аналогично SHR. Выполнение SHL имеет такой же эффект, как и умножение на два, четыре, восемь и так далее, в зависимости от числа (соответственно единицы, двойки или тройки), хранящегося в СL.
Примечание 4. Для получения на экране достаточно хорошей формы представления информации выполняйте вывод промежуточных пробелов. Число пробелов определяйте опытным путем.
Отлаженную .com-программу занесите для пересылки на дискету в каталог LAB2.
Лабораторная работа N 3
ВВЕДЕНИЕ В ПРОГРАММИРОВАНИЕ НА АССЕМБЛЕРЕ
Цель работы
До сих пор нашим единственным помощником при написании и отладке машинных программ была системная программа Debug. Мы и далее будем широко использовать Debug при отладке своих программ. Что касается написания программы, то тут помощь Debug явно недостаточна, и процесс написания сколько-нибудь сложной программы скорее всего продлится очень долго. По этой причине мы переходим к написанию программ на языке ассемблера.
Целью выполнения данной работы является получение начальных навыков по разработке программ на языке ассемблера. А именно - рассматриваются псевдооператоры, позволяющие разрабатывать простые ассемблерные программы, а также производится первоначальное знакомство с системными программами (EDIT, TASM и TLINK), обеспечивающими преобразование программы на языке ассемблера в машинную программу.
Задание
Требуется написать на ассемблере и отладить программу, выполняющую те же функции, что и программа в задании к работе 2, с тем лишь отличием, что на экран выводятся содержимые регистров BP и DI не только в двоичной и шестнадцатеричной, но и в десятичной системе счисления.
Примечание 1. Файловая структура программы должна включать два файла типа .asm. В одном из них содержатся главная подпрограмма и тексты выводимых сообщений. Все остальные процедуры содержатся во втором файле.
Примечание 2. Все процедуры должны иметь вводные и текущие комментарии.
Запишите полученные .asm- и .com-файлы в каталог LAB3 на дискету для пересылки.
Лабораторная работа N 4
ДАМПИРОВАНИЕ ПАМЯТИ
Цель работы
В процессе выполнения работы решается задача разработки программы на ассемблере, выполняющей дампирование (вывод на экран) содержимого памяти подобно тому, как это делает Debug при выполнении команды D. Целью выполнения работы является изучение новых приемов программирования на ассемблере, в том числе, изучение новых исполнительных операторов и псевдооператоров. Кроме того, преследуется цель развития навыков проектирования программ. При этом рассматривается универсальный подход к разработке интерактивных программ, управляемых с помощью управляющих клавиш.
В отличие от предыдущих лабораторных работ, данная работа не является обязательной и результаты ее выполнения не пересылаются в ТМЦДО.
КОНТРОЛЬНАЯ РАБОТА N 1
ПРЕДСТАВЛЕНИЕ ИНФОРМАЦИИ В ЭВМ И ЭЛЕМЕНТЫ ЯЗЫКА АССЕМБЛЕРА
Контрольная работа №1 компьютерная и выполняется в диалоге с контролирующей программой. Она включает 10 заданий. Ниже приводятся примеры решений заданий и методические рекомендации по их выполнению.
Задание 1. Получить двоичное представление заданного целого десятичного числа.
Указания. Для преобразования десятичного числа в двоичное можно использовать метод вычитаний [1, п.2.1].
Пример. Получить двоичное представление десятичного числа 5000.
Решение. Выполним вычитания:
_ 5000
4096 (бит 12)
_904
512 (бит 9)
_ 392
256 (бит 8)
_ 136
128 (бит 7)
_ 8
8 (бит 3)
0
Заполним биты двоичного числа, начиная с младшего:
1001110001000 (ответ).
Задание 2. Найти разность двух заданных положительных двоичных чисел.
Указания. Вычитание двух положительных чисел следует выполнить сложением первого из них с дополнением второго (отрицательного) числа [1, п.2.1]. Прежде, чем получать дополнение отрицательного числа, необходимо исходное положительное число дополнить слева незначащими нулями до байта или слова (в зависимости от величины числа). Иначе - знаковый бит числа (бит 7 для байта, бит 15 для слова) будет отсутствовать.
Пример. Найти разность двоичных чисел 1010100100111 и 110010010011001.
Решение. Расширим второе число до 16 бит: 0110010010011001 . Найдем дополнительный код этого же числа, но взятого со знаком "-" :
1) инвертируем все биты: 1001101101100110
2) прибавляем 1: + 1
1001101101100111
Суммируем первое число с полученным дополнением:
1010100100111
+ 1001101101100111
1011000010001110 (ответ)
Задание 3. Найти разность двух заданных положительных шестнадцатеричных чисел. (Из большего числа вычесть меньшее.)
Указания. Вычитание шестнадцатеричных чисел выполняется аналогично вычитанию десятичных чисел с той лишь разницей, что занимаемая из старшего разряда единица, в текущем разряде составляет не 10, а 16 единиц [1, п. 2.2].
Пример. Найти разность шестнадцатеричных чисел A74F и 8E5C.
Решение: _A74F
8E5C
18F3 (ответ).
Задание 4. Пусть в данный момент времени некоторые регистры содержат:
(регистр 1) =XXXXh, . . . , (регистр n) = XXXXh
Каков (в шестнадцатеричной системе) физический адрес ячейки ОП, содержащей:
1) младший байт следующей исполняемой на ЦП инструкции;
2) младший байт вершины стека;
3) байт данных, обрабатываемый текущей инструкцией [инструкция].
Указания. Для получения физического адреса искомой ячейки необходимо просуммировать содержимое соответствующего регистра сегмента, умноженное на 16 (10h), с содержимым регистра, в котором находится внутрисегментное смещение [1, п. 3.3, 5.1].
Пример. Пусть в данный момент времени некоторые регистры содержат:
. . . . (DS) = 3FA5h . . . (BX) = 4A84h
Найти физический адрес ячейки ОП, содержащей байт данных, обрабатываемый текущей инструкцией: MOV [BX], AL
Решение.
R = (DS) x 16 + (BX) = 3FA5 x 10h + 4A84 = 3FA50 + 4A84 =
= 444D4 (ответ).
Задание 5. Пусть в данный момент времени некоторые регистры содержат:
(регистр 1) =XXXXh, . . . , (регистр n) = XXXXh
Каково будет содержимое указателя команды (или указателя стека) в результате выполнения следующих машинных инструкций: [инструкции с указанием их длины].
Указания. Каждая выполняемая инструкция обработки данных влияет на содержимое указателя команды IP в соответствии со своей длиной, а инструкция передачи управления - в соответствии со своим адресом перехода [1, п. 3.2].
На указатель стека SP влияют только некоторые инструкции, а именно: PUSH, POP, CALL, RET, INT, IRET, PUSHF, POPF. При этом следует учесть, что стек "растет" в сторону меньших адресов [1, п. 5.1].
Пример. Пусть в данный момент времени некоторые регистры содержат: . . . (SP) = FE4A .
Каково будет содержимое указателя стека после выполнения следующих инструкций:
PUSH AX (длина 1 байт)
PUSH BX (длина 1 байт)
RET (длина 1 байт)
CALL 200h (длина 3 байта)
Решение. Инструкции PUSH и CALL добавляют в стек по одному слову (2 байта), а инструкция RET берет слово из стека. Следовательно, длина стека увеличится на 4 байта. Новое содержимое регистра SP:
(SP) = FE4A - 4 = FE46 (ответ).
Задание 6. Записать содержимое (в шестнадцатеричной системе) заданного регистра, полученное в результате выполнения следующих операторов ассемблера [операторы].
Указания. Для подготовки к выполнению задания рекомендуется использовать информацию о логических операторах [1, п. 6.2.2].
Пример. Записать содержимое регистра BX, полученное в результате выполнения операторов:
MOV BX, 0ABCDh
MOV CX, 0707h
AND BX, CX
Решение. Сначало запишем двоичное содержимое регистров BX и CX до выполнения операции AND:
(BX) = 1010101111001101
(CX) = 0000011100000111
Выполним операцию AND и переведем результат в шестнадцатеричную систему:
1010101111001101
AND 0000011100000111
0000001100000101
[ 0 ][ 3 ] [ 0 ] [ 5 ] Ответ: 305 .
Задание 7. Указать номер неправильного оператора передачи данных в следующем списке операторов [операторы MOV].
Указание. Для подготовки к выполнению задания рекомендуется использовать информацию о операторах передачи данных [1, п. 6.2.3] и о вспомогательных псевдооператорах [1, п. 6.6].
Пример. Указать номер неправильного оператора в списке:
1) MOV AX, 0FFFFh
2) MOV AL, DL
3) MOV BH, OFFSET Table
4) MOV Arg, AX
5) MOV DL, BYTE PTR Table
Решение. Неправильным является оператор 3, так как для размещения смещения адреса (оно задается псевдооператором OFFSET) всегда требуются 16 бит памяти, то есть слово. А длина регистра BH - 8 битов.
Ответ: 3 .
Задание 8. Записать содержимое (в шестнадцатеричной системе) заданного регистра, полученное в результате выполнения следующих операторов ассемблера [операторы].
Указания. Для подготовки к выполнению задания рекомендуется использовать информацию о операторах сдвига [1, п. 6.2.5].
Пример. Записать содержимое регистра AL, полученное в результате выполнения операторов:
MOV AL, 7Ah
STC
RCR AL, 1
Решение. Определим содержимое регистра AL до выполнения оператора RCR:
(AL) = 7Ah = 01111010
Оператор RCR (циклический сдвиг вправо через перенос) выталкивает содержимое младшего бита первого операнда и помещает его в флаг CF, а прежнее содержимое CF заносит в старший бит операнда. Так как оператор STC поместил в CF 1, то в результате выполнения RCR:
(AL) = 10111101 = BDh , ответ: BD .
Задание 9. Записать содержимое (в десятичной системе) заданного регистра, полученное в результате выполнения следующих операторов ассемблера [операторы].
Указания. Для подготовки к выполнению задания рекомендуется использовать информацию о операторах условных переходов [1, п. 6.5.1] и о операторах цикла [1, п.6.5.3].
Пример. Записать содержимое регистра AX, полученное в результате выполнения операторов:
XOR AX, AX
MOV BX, 20
A1: CMP BX, 10h
JBE Next
INC AX
DEC BX
JMP A1
Next: . . . . . . . .
Решение. В записанном фрагменте программы первые два оператора выполняют инициализацию цикла ПОКА, а последующие операторы кодируют сам этот цикл. Условием повторения цикла является условие (BX)>10h. Оператор условного перехода JBE (перейти, если меньше или равно) реализует выход из цикла. Этот оператор используется для переходов после сравнения беззнаковых чисел, каковыми являются операнды оператора CMP - (BX) и 10h.
При первом выполнении оператора CMP значение (BX)=20, что явно больше, чем 16 (10h). В результате первого выполнения цикла (AX)=1, а (BX)=19. В результате четвертого выполнения - (AX)=4, (BX)=16. Это выполнение цикла является последним, так как следующее выполнение оператора JBE реализует выход из цикла на оператор с меткой Next.
Ответ: 4.
Задание 10. Предлагается определить длину зарезервированного участка памяти или длину выводимого на экран сообщения.
Указания. Для подготовки к выполнению задания рекомендуется использовать информацию о псевдооператорах определения данных [1, п. 6.4].
Пример. Указать длину (в байтах) участка памяти, резервируемого следующими операторами:
Mas1 DB 10 DUP (?)
Pere DW 10, 20h, 'Ab'
Text 'Hello'
Решение. ОП резервируется тремя псевдооператорами. Первый оператор резервирует 10 байтов, второй - 6 байтов (3 слова), третий - 5 байтов. Общее число резервируемых байтов памяти - 21 (ответ).
6. КОНТРОЛЬНАЯ РАБОТА N 2
РАЗРАБОТКА ПРОГРАММЫ НА АССЕМБЛЕРЕ
Введение
Целью выполнения данной работы является комплексная проверка навыков программирования на языке ассемблера.
Результаты работы представляются в виде совокупности следующих документов:
1) дерево подпрограмм;
2) файловая структура программы;
3) блок-схемы алгоритмов процедур;
4) исходный файл (файлы) программы;
5) загрузочный модуль программы.
Примеры деревьев подпрограмм приведены на рис. 10, 14, 15.
Примеры файловой структуры программы приведены на рис. 13 и 14.
Основным требованием к блок-схемам алгоритмов процедур является выполнение требований структурного программирования [1, п.7.3]. Примеры алгоритмов процедур приведены на рис. 5, 11, 19.
Основным требованием к исходным модулям (файлам) программы является наличие комментариев [1, п. 8.6]. Примеры исходных модулей приведены в описаниях лабораторных работ 3 и 4.
Дерево подпрограмм, файловая структура программы и блок-схемы процедур представляются на листах писчей бумаги, выполняются аккуратно хорошо понятным почерком. Допускается представление этих документов в виде файлов на дискете, полученных с помощью текстового редактора Word. Остальные документы представляются в виде файлов с расширениями .asm и .com на дискете.
Варианты контрольной работы №2
Вариант 1. По запросу программы пользователь вводит с клавиатуры последовательность целых трехзначных положительных десятичных чисел, разделенных пробелами. Ввод последовательности заканчивается нажатием <Enter>.
Программа выводит на экран сумму этих чисел, представленную в десятичной и шестнадцатеричной системах счисления.
Вариант 2. По запросу программы пользователь вводит с клавиатуры целое положительное десятичное число N. По следующему запросу он вводит с клавиатуры N целых трехзначных положительных десятичных чисел, разделенных пробелами.
Программа выводит на экран сумму этих чисел, представленную в десятичной и двоичной системах счисления.
Вариант 3. По запросу программы пользователь вводит с клавиатуры последовательность целых трехзначных положительных десятичных чисел, разделенных пробелами. Ввод последовательности заканчивается нажатием <Enter>.
Программа выводит наибольшее число из введенных, представленное в десятичной и двоичной системах счисления.
Вариант 4. По запросу программы пользователь вводит с клавиатуры целое положительное десятичное число N. По следующему запросу он вводит с клавиатуры N целых трехзначных положительных десятичных чисел, разделенных пробелами.
Программа выводит наибольшее число из введенных, представленное в десятичной и шестнадцатеричной системах счисления.
Вариант 5. По запросу программы пользователь вводит с клавиатуры последовательность целых трехзначных положительных десятичных чисел, разделенных пробелами. Ввод последовательности заканчивается нажатием <Enter>.
Программа выводит наименьшее число из введенных, представленное в десятичной и шестнадцатеричной системах счисления.
Вариант 6. По запросу программы пользователь вводит с клавиатуры целое положительное десятичное число N. По следующему запросу он вводит с клавиатуры N целых трехзначных положительных десятичных чисел, разделенных пробелами.
Программа выводит наименьшее число из введенных, представленное в десятичной и двоичной системах счисления.
Вариант 7. По запросу программы пользователь вводит с клавиатуры последовательность целых трехзначных положительных десятичных чисел, разделенных пробелами. Ввод последовательности заканчивается нажатием <Enter>.
Программа выводит последовательность этих же чисел, но записанных в обратном порядке и в шестнадцатеричной системе счисления.
Вариант 8. По запросу программы пользователь вводит с клавиатуры целое положительное десятичное число N. По следующему запросу он вводит с клавиатуры N целых трехзначных положительных десятичных чисел, разделенных пробелами.
Программа выводит последовательность этих же чисел, но записанных в обратном порядке и в двоичной системе счисления.
Вариант 9. По запросу программы пользователь вводит с клавиатуры последовательность целых трехзначных положительных десятичных чисел, разделенных пробелами. Ввод последовательности заканчивается нажатием <Enter>.
Программа выводит эти же числа на экран в порядке возрастания величины числа, причем в шестнадцатеричной системе счисления.
Вариант 10. По запросу программы пользователь вводит с клавиатуры целое положительное десятичное число N. По следующему запросу он вводит с клавиатуры N целых трехзначных положительных десятичных чисел, разделенных пробелами.
Программа выводит эти же числа на экран в порядке возрастания величины числа, причем в двоичной системе счисления.
Вариант 11. По запросу программы пользователь вводит с клавиатуры последовательность целых трехзначных положительных десятичных чисел, разделенных пробелами. Ввод последовательности заканчивается нажатием <Enter>.
Программа выводит эти же числа на экран в порядке убывания величины числа, причем в двоичной системе счисления.
Вариант 12. По запросу программы пользователь вводит с клавиатуры целое положительное десятичное число N. По следующему запросу он вводит с клавиатуры N целых трехзначных положительных десятичных чисел, разделенных пробелами.
Программа выводит эти же числа на экран в порядке убывания величины числа, причем в шестнадцатеричной системе счисления.
Вариант 13. По запросу программы пользователь вводит с клавиатуры сообщение на русском языке, заканчивающееся символом "." или "!" .
Программа выводит на экран это же сообщение, записанное только заглавными буквами.
Вариант 14. По запросу программы пользователь вводит с клавиатуры сообщение на русском языке, заканчивающееся символом "." или "?" .
Программа выводит на экран это же сообщение, записанное только строчными (малыми) буквами.
Вариант 15. По запросу программы пользователь вводит с клавиатуры сообщение на английском языке, заканчивающееся символом "." или "?" .
Программа выводит на экран это же сообщение, записанное только заглавными буквами.
Вариант 16. По запросу программы пользователь вводит с клавиатуры сообщение на английском языке, заканчивающееся символом "." или "!" .
Программа выводит на экран это же сообщение, записанное только строчными (малыми) буквами.
Вариант 17. По запросу программы пользователь вводит с клавиатуры два целых четырехзначных положительных десятичных числа, разделенных знаком операции "+" или "-" .
Программа выводит на экран результат операции в двух системах счисления - в десятичной и в двоичной (в дополнительном коде).
Вариант 18. По запросу программы пользователь вводит с клавиатуры два целых четырехзначных положительных десятичных числа, разделенных знаком операции " * " .
Программа выводит на экран результат операции умножения .
Вариант 19. По запросу программы пользователь вводит с клавиатуры два целых четырехзначных положительных десятичных числа, разделенных знаком операции " / " .
Программа выводит на экран результат операции деления (частное и остаток).
Вариант 20. По запросу программы пользователь вводит с клавиатуры два целых трехзначных положительных десятичных числа.
Программа выводит на экран сообщение о том, делится ли первое число на второе без остатка, а затем сообщение - делится ли без остатка второе число на первое.
Примечание
При вводе с клавиатуры десятичного числа следует учесть, что получение двоичного представления такого числа выполняется иначе по сравнению с шестнадцатеричным числом. При этом каждую очередную десятичную цифру следует умножить на вес позиции числа, а затем просуммировать результаты умножения. Например, при вводе 3-х значного числа первая цифра умножается на сто, вторая - на десять, а третья цифра берется без изменения.
Для удобства наших клиентов, проходящих обучение на ФДО ТУСУРа, была создана данная форма заказа, с помощью которой Вы можете БЕСПЛАТНО УЗНАТЬ СТОИМОСТЬ оказания помощи в выполнении работ по тем дисциплинам, которые Вам необходимы. Если Вы хотите заказать ОПТОМ выполнение одного и более семестров, то мы предложим Вам выполнение работ под ключ по самым выгодным ценам. Пожалуйста свяжитесь с нами по следующим контактам