Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование на языке Ассемблер. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
11.08.2026
Размер:
603 Кб
Скачать

Укажем некоторые важные замечания о макросах

и процедурах.

Если вы хотите использовать процедуру, вы должны применить команду CALL, например:

CALL MyProc

Если вы хотите использовать макрос, вы можете просто напечатать его имя. Пример:

MyMacro

Процедура располагается по определенному адресу в памяти. Если воспользоваться процедурой 100 раз, процессор будет передавать управление в эту часть памяти. Возвращение из процедуры выполняется командой RET. Для хранения адреса возврата используется стек. Команда CALL занимает 3 байта, так что размер исполняемого файла увеличивается очень незначительно, независимо от того, сколько раз вызывается процедура.

Макрос выполняется непосредственно в коде программы. Поэтому если использовать один и тот же макрос 100 раз, то компилятор будет распаковывать этот макрос также 100 раз, делая исполняемый файл все больше и больше, каждый раз вставляя в программу команды макроса.

Для передачи параметров процедуре необходимо использовать стек или регистры общего назначения.

Для передачи параметров макросу достаточно просто напечатать их после имени макроса. Например:

MyMacro 1, 2, 3

Чтобы обозначить конец макроса, достаточно директивы

ENDM.

Чтобы обозначить конец процедуры, необходимо напечатать имя процедуры перед директивой ENDP.

Макрос распаковывается непосредственно в коде, поэтому, если имеются метки внутри макроопределения, то

51

можно получить ошибку «Duplicate declaration» (Двойное объявление), если макрос используется два или более раз. Чтобы избежать такой проблемы, необходимо использовать директиву LOCAL, сопровождающую имена переменных, меток или имен процедур. Например:

MyMacro2 MACRO

LOCAL label1, label2 CMP AX, 2

JE label1 CMP AX, 3 JE label2 label1:

INC AX label2:

ADD AX, 2

ENDM ORG 100h MyMacro2 MyMacro2 RET

Если планируется использовать макросы в нескольких программах, то лучше разместить все макросы в отдельном файле. Поместите файл в каталог Inc и примените директиву INCLUDE имя файла для использования макросов.

52

12. ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ

Задание 1. Команда MOV и арифметические команды

1.Вычислить значениевыражения (53 + 8) 2 + (150 – 60) / 3. Полученный результат записать в регистр DX. Ответ: 152.

2.Вычислить значение выражения (1260 – 450) / 2 + 310 3. Полученный результат записать в регистр SI. Ответ: 1335.

3.Вычислить значение выражения (176/2+233)–(125–50)/3. Полученный результат записать в регистр BX. Ответ: 132.

4.Вычислить значение выражения (786 + 35)3 + (125 – 50) / 5. Полученный результат записать в регистр DI. Ответ: 2478.

5.Вычислить значение выражения (5684/4+357/3+245/5)3. Полученный результат записать в регистрCX. Ответ:4767.

6.Вычислить значение выражения (25 7 – 31 2 + 11 3) / 2. Полученный результат записать в регистр BL. В регистр BH записать 0. Ответ: 73.

7.Вычислить значение выражения 150/3+78/2+365/5. Полученный результат записать в регистр CL. В регистр CH записать 0. Ответ: 162.

8.Вычислить значение выражения (35 / 7) (78 / 2) – 190. Полученный результат записать в регистр BH. В регистр BL записать 0. Ответ: 5.

9.Вычислить значение выражения (81 / 9) (65 / 5) – 110. Полученный результат записать в регистр CH. В регистр CL

записать 0. Ответ: 7.

10. Вычислить значение выражения 150/5–35/7+210/3. Полученный результат записать в регистр DL. В регистр DH записать 0. Ответ: 95.

53

Задание2.Командылогическихопераций,сдвигов, выделение битовых полей

В представленных задачах в качестве исходного значения предполагается байт, условно названный DataByte, который должен быть записан в один из регистров. Необходимо написать программу, которая выделяет данные из указанных битовых полей (каждое такое поле рассматривается как целое без знака), выполнить над ними указанные действия и вывести результат.

1. В исходном байте DataByte биты 0…3 содержат двоичный код, который обозначим как А, биты 4…5 – код, который обозначим как В, биты 6…7 – код, который обозначим как С. Вычислить А +2 В +2 С. Тест: ввод 51h, вывод 5d.

2. В исходном байте DataByte биты 0…2 содержат двоичный код, который обозначим как А, биты 3…5 – код, который обозначим как В, биты 6…7 – код, который обозначим как С. Вычислить А В +2 С. Тест: ввод 8Fh, вывод 10d.

3. В исходном байте DataByte биты 0…1 содержат двоичный код, который обозначим как А, биты 2…5 – код, который обозначим как В, биты 6…7 – код, который обозначим как С. Вычислить В А С. Тест: ввод BEh, вывод 11d.

4.В исходном байте DataByte биты 0…4 содержат двоичный код, который обозначим как А, биты 5…6 – код, который обозначим как В, бит 7 – код, который обозначим как С. Вычислить А + В + С. Тест: ввод C7h, вывод 10d.

5.В исходном байте DataByte биты 0…2 содержат двоичный код, который обозначим как А, биты 3…6 – код, который обозначим как В, бит 7 – код, который обозначим как С. Вычислить В А + С. Тест: ввод D6h, вывод 5d.

6.В исходном байте DataByte биты 0…3 содержат дво-

ичный код, который обозначим как А, биты 4…5 – код, кото-

54

рый обозначим как В, биты 6…7 – код, который обозначим как С. Вычислить А + В С. Тест: ввод 15h, вывод 6d.

7. В исходном байте DataByte биты 0…2 содержат двоичный код, который обозначим как А, биты 3…5 – код, который обозначим как В, биты 6…7 – код, который обозначим как С. Вычислить 2 А В С. Тест: ввод 1Ch, вывод 1d.

8. В исходном байте DataByte биты 0…1 содержат двоичный код, который обозначим как А, биты 2…5 – код, который обозначим как В, биты 6…7 – код, который обозначим как С. Вычислить В А + 2 С. Тест: ввод CFh, вывод 6d.

9. В исходном байте DataByte биты 0…4 содержат двоичный код, который обозначим как А, биты 5…6 – код, который обозначим как В, бит 7 – код, который обозначим как С. Вычислить А 2 В 2 С. Тест: ввод FFh, вывод 3d.

10. В исходном байте DataByte биты 0…2 содержат двоичный код, который обозначим как А, биты 3…6 – код, который обозначим как В, бит 7 – код, который обозначим как С. Вычислить A В – 2 А C + С. Тест: ввод 9Bh, вывод 11d.

Задание 3. Ветвления. Команды передачи управления

В задачах этого раздела предполагается разработка программ с использованием команд JZ, JA, JB и т. п., анализирующих исходные данные и направляющих вычислительный процесс по одному из двух (или более) путей, а также коман-

ды JMP.

1.

Дано целое число. Если оно чётное, то записать в ре-

гистр DI значение FFFFh, если нечётное – FF00h.

 

2.

Даны два числа. Записать

в

регистр

SI

меньшее,

а в регистр DI – большее из них.

 

 

DI

 

3.

Даны два числа. Записать

в

регистр

меньшее,

а в регистр SI – большее из них.

 

 

 

 

55

4. Дан четырёхзначный номер года. Определить номер столетия, например, при 1492 ответом должно быть «15»,

апри 1812 – «19». Учесть, что началом века считается первый,

ане нулевой год: так, при вводе 2000 ответом будет «20».

5.Супермаркет доставляет продукты питания на дом. Эта услуга оплачивается следующим образом: если сумма покупки не превышает 600 рублей, то доставка обойдётся покупателю в 250 рублей; если сумма покупки лежит в пределах 600…990 рублей, то доставка стоит 150 рублей; если сумма покупки – более 990 рублей, то доставка бесплатная. Написать программу, определяющую по сумме покупки стоимость доставки.

6.Супермаркет доставляет продукты питания на дом. Эта услуга оплачивается следующим образом: если сумма покупки не превышает 500 рублей, то доставка обойдётся покупателю в 200 рублей; если сумма покупки лежит в пределах 600…990 рублей, то доставка стоит 100 рублей; если сумма покупки – более 990 рублей, то доставка бесплатная. Написать программу, определяющую по сумме покупки стоимость покупки вместе с доставкой.

7.Дано текущее время (M S), где M – это минуты, а S – секунды. Написать программу, определяющую время спустя одну секунду.

8.Дано текущее время (H M S), где H – это часы, M – это минуты, а S – секунды. Написать программу, определяющую время спустя одну секунду.

9.Дано целое число в пределах 0…23, представляющее собой московское время с точностью до часа. Написать программу, вычисляющую томское время и выводящую его на экран. Решить эту задачу: с применением ветвления.

10.Дано целое число в пределах 0…23, представляющее собой московское время с точностью до часа. Написать программу, вычисляющую томское время и выводящую его на экран. Решить эту задачу: без ветвления, но с использованием команды MOD.

56

Задание 4. Обработка данных в цикле (без использования ветвлений)

1. Дана последовательность символов (строка), размещённая по адресу DS:0000h. Переписать эту строку (сделать копию) в другое место оперативной памяти, по адресу, указанному преподавателем. Использовать LOOP.

2.Дана последовательность из 10 чисел (байтов), размещённых в сегменте данных, начиная с адреса DS:0010h. Вычислить их сумму и записать результат по адресу DS:0020h.

3.Дана последовательность из 5 чисел (байтов), размещённых в сегменте данных, начиная с адреса DS:0000h. Вычислить сумму квадратов этих чисел и записать результат по адресу DS:0010h.

4.Дана последовательность заглавных и строчных латинских букв (строка текста), размещённая по адресу DS:0020h. Преобразовать текст, превратив строчные буквы

взаглавные. Пример входных данных: «High school». Резуль-

тат: «HIGH SCHOOL». Примечание: необходимо сбросить

вноль 5-й бит в ASCII-коде каждой буквы (команда AND). Исходная строка должна остаться в памяти без изменения.

5.Дано натуральное число N. Вычислить: 1+3+5+7+…+(2N+1).

6.Дано натуральное число N. Вычислить: 2+4+6+8+…+2N.

7.Дано натуральное число N. Вычислить: (2N)!

8.Дано натуральное число N. Вычислить: N!

9.Даны натуральные числа N и a. Не используя умножение, вычислить aN.

10.Даны натуральные числа N и a. Вычислить: a(a+1)…(a+N–1).

57

Задание 5. Обработка данных в цикле (с использованием ветвлений)

В задачах этого раздела под термином «массив» понимается последовательность данных, размещённая каким-либо способом в сегменте DS. Результаты подсчётов элементов следует получить в одном из регистров процессора. Второй массив (в заданиях 3,6,7) можно разместить как в сегменте DS, так

ив сегменте ES.

1.Дан массив байтов. Подсчитать количество элементов, равных трем.

2.Дан массив байтов. Подсчитать количество элементов, кратных трем (команда DIV).

3.Даны два массива байтов, один заполнен числами по указанию преподавателя. Заполнить второй массив следующим образом: все элементы первого массива, стоящие на нечетных местах, возвести в квадрат, стоящие на четныхместах– в куб.

4.Дан массив: а) байтов, б) слов. Подсчитать количество четных элементов.

5.Дан массив: а) байтов, б) слов. Подсчитать количество элементов, делящихся на 10 и не делящихся на 3.

6. Дан массив байтов. Сформировать другой массив, в который нечетные элементы из первого массива переписать без изменений, а четные – увеличить на 1.

7.Дан массив, заполненный двузначными числами. Сформировать другой массив, в котором каждый элемент представляет собой сумму цифр соответствующего числа первого массива.

8.Дан массив: а) байтов, б) слов. Подсчитать количество нечетных элементов.

9.Дан массив: а) байтов, б) слов. Подсчитать количество элементов, равных одиннадцати.

58

10. Дан массив: а) байтов, б) слов. Подсчитать количество элементов, делящихся на 7 и не делящихся на 4.

Задание 6. Стек

1.Создать стек для целых чисел. Добавить 6 элементов. Удалить и вывести на экран 2 элемента.

2.Создать стек для целых (положительных и отрицательных) чисел. Ввести 6 элементов. При вводе чисел в стек попадают только отрицательные элементы. Вывести все элементы стека.

3.Создать стек для целых чисел. Ввести с экрана 6 элементов. Удалить 2 элемента. Вывести размер стека.

4.Создать стек для целых (положительных и отрицательных) чисел. Вводить с числа, причем в стек должны добавляться поочередно положительные и отрицательные числа.

5.Создать стек для символов. Ввести эталонный символ. Вводить символы в стек до встречи эталонного. Вывести все элементы стека.

6.Создать стек для символов. Добавить символы в стек. После добавления 5-го символа перед добавлением удалять элемент из стека.

7.Создать стек для символов. Ввести эталонный символ. Вводить символы с экрана в стек до встречи эталонного. Вывести размер стека.

8.Создать стек для символов. Добавлять символы в стек.

Вслучае совпадения вводимого символа с вершиной стека вытолкнуть его и распечатать ее.

9.Создать стек для символов. Вводить символы в стек.

Вслучае совпадения вводимого символа с вершиной стека вывести размер стека.

10.Создать два стека для символов. Вводить символы

в первый стек. В случае совпадения вводимого символа с вершиной стека вводить во второй стек.

59

Вопросы для самостоятельной работы и самоконтроля

1.Место языка Ассемблер среди языков программиро-

вания.

2.Структура микропроцессора Intel 8086: используемые регистры.

3.Структура микропроцессора Intel 8086: операционное устройство и шинный интерфейс.

4.Размещение данных в памяти. Сегментация памяти.

5.Структура регистра флагов. Команды установки флагов.

6. Структура и форматы команд микропроцессора Intel 8086. Команды пересылки данных.

7.Способы адресации в командах микропроцессора

Intel 8086.

8.Представление данных в IBM PC: целые числа.

9.Представление данных в IBM PC: двоичнодесятичные числа.

10.Представление данных в IBM PC: алфавитноцифровые данные.

11.Представление данных в IBM PC: вещественные

данные.

12.Система команд микропроцессора: команды сложения и вычитания.

13.Команды умножения и деления чисел.

14.Структура команд микропроцессора: базовая, индексная и косвенная адресации.

15.Логические команды обработки битов.

16.Команды сдвигов и их использование.

17.Команды передачи управления: безусловные переходы. Адресация в переходах.

18.Команды передачи управления: условные переходы.

19.Команды передачи управления: организация циклов.

20.Стек. Команды работы со стеком.

60

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]