|
Инструкции пересылки данных и двоичной арифметикиКоманды данной группы приведены в таблице 2.1. Код определяет выполняемое командой действие, операнды показывают адреса ячеек, хранящих исходные данные, необходимые для выполнения команды и адрес ячейки результата. Процессор i8086 и более поздние версии относятся к двухадресным машинам. Это значит, что его команда может содержать не более двух операндов. Если для выполнения команды необходимо иметь два источника данных, например, сложение, то сохранение результата выполнения команды производиться по адресу одного из источников данных. Чтобы показать, какой из операндов будет хранить результат, его обозначают при описании команды как dst(destination - назначение), операнд, который используется только как адрес исходных данных, обозначается как src(source – источник). В двухоперандных командах операнд dst указывает, перед выполнением команды, адрес исходного данного, а после выполнения - адрес результата.
Запись программ на языке ассемблера Ниже приведена типичная структура простой программы на ассемблере. data segment;директива начала сегмента данных d1 dw 34h d2 db 10100110b d3 dd 3 dup (?) data ends; директива конца сегмента данных code segment; директива начала сегмента кодов assume cs: code, ds: data start: mov ax,data; Загрузить адрес mov ds,ax; сегмента данных . .; текст программы quit: mov ax,4c00h; Код завершения 0 int 21h; Выход в DOS code ends end start Загрузка адреса сегмента данных состоит из двух команд, так как непосредственные данные нельзя заносить прямо в сегментный регистр. Для завершения программы и выхода в DOS имеется несколько возможностей, рекомендуется использовать две команды, начинающиеся с метки quit. Обработка программ в MS-DOS Обработка программ на языке ассемблера в MS-DOS состоит из следующих этапов: § Создать с помощью текстового редактора файл с текстом программы на языке ассемблера. § Транслировать программу с помощью ассемблера TASM (или MASM); § Скомпоновать программу с помощью компоновщика (редактора связей) TLINK(или LINK). § Запустить программу на выполнение. Файл исходного текста программы должен иметь расширение asm. Запуск транслятора осуществляется командой tasm <исходный файл >[,[< объектный файл >][,[< файл листинга >][,[< файл перекрестных ссылок >]]]][;] Все создаваемые транслятором файлы будут иметь разные расширения имени, поэтому им можно оставить имя исходного файла: tasm <исходный файл >,,,,; Точка с запятой показывает, какие файлы должен создать транслятор, например, конструкция tasm <исходный файл >; создаст только объектный файл. Расширение объектного файла по умолчанию obj; расширение файла листинга по умолчанию lst; расширение файла перекрестных ссылок по умолчанию crf. Компоновщик использует, как исходный, объектный файл и создаёт исполняемый файл с расширением по умолчанию exe. Запуск компоновщика осуществляется командой: tlink < объектный файл >[,< исполняемый файл >] В случае сохранения имени исходного файла команда имеет вид: tlink < объектный файл> Для запуска под отладчиком необходимо запустить отладчик и загрузить исполняемый файл. Пример выполнения работы Вычислить Х = 3А + (В + 5) / 2 - С - 1, где А, В, С, Х- целые знаковые числа занимающие слово, написать программу реализующую данную формулу. Распишем формулу по отдельным операциям: АХ ← А; значение А в регистре АХ АХ ← 2 *(АХ); 2А в АХ АХ ← (АХ) + А; 3А в АХ ВХ ← В; В в ВХ ВХ ← 5 + (ВХ); В+5 в ВХ ВХ ← (ВХ) / 2; (В+5) / 2 в ВХ АХ ← (BX) + (AX); 3А+(В+5) / 2 в АХ АХ ← (АХ) - С; 3А+(В+5) / 2 - С в АХ АХ ← (АХ) -1; 3А+(В+5)/2 - С - 1 в АХ Х ← (АХ); 3А+(В+5)/2 - С - 1 в Х Ниже приведена типичная структура простой программы на ассемблере. 2.6.1.1 Текст программы: data segment a dw 10 b dw 20 c dw 5 x dw? data ends code segment assume cs: code, ds: data start: mov ax, data mov dx, ax; загрузить адрес mov ax, a; сегмента данных sal ax, 1 add ax, a mov bx, b add bx, 5 sar bx, 1 add ax, bx sub ax, c dec ax mov x, ax; запись результата в память quit: mov ax, 4c00h; код завершения 0 int 21; выход в dos code ends end start Варианты заданий Разработать программу реализующую указанную формулу, исполнить программу с несколькими (три - четыре) наборами исходных данных, проверить правильность результатов. 1. Х= А - 5 (В - 2С) + 2 2. Х= - 4А + (В + С) / 4 + 2 3. Х= 7А - 2В - 100 + С 4. Х= - А / 2 + 4 (В + 1) + 3С 5. Х= 5 (А - В) - 2С + 5 6. Х= (А/ 2 + В) / 4 + С - 1 7. Х= - (С + 2А + 4В + В) 8. Х= 6С + (В - С + 1) / 2 9. Х= 2 - В (А + В) + С / 4 10. Х= 2В - 1 + 4 (А - 3С) 11. Х= (2А + В) / 4 - С / 2 + 168 12. Х= 6 (А - 2В + С / 4) + 10 13. Х= 5 (А - В) + С mod 4 14. Х= - (- (С + 2А) * 4В + 38) 15. Х= А - 3 (А + В) + С mod 4 16. Х= 3(А - 2В) +50 – С / 2 17. Х= (3А + 2В) - С / 4 + 217 18. Х= 3(С - 2A) + (В - С + 1) / 2 19. Х= (2А + В) / 4 - С / 2 + 168 20. Х= 6 (А - 2В + С / 4) + 10 21. Х= 3 (А - 4В) + С / 4 22. Х= - (- (С + 2А) * 5В - 27) 23. Х= А / 2 - 3 (А + В) + С * 4 24. Х= 3(А - 2В) +50 – С / 2 25. Х= 5А + 2В - B / 4 + 131
Вопросы по теме 1. назначение директив Segment и Ends 2. Назначение дирeктивы assume 3. Назначение директив DB и DW 4. Назначение оператора DUP в директивах DB и DW 5. Назначение директивы END 6. Из каких полей состоит строка программы на Ассемблера? 7. Какие обязательные поля, какие необязательные. 8. В чем различие между командами mov ax, bx,move ax,[bx], move [ax],bx. 9. В чем разница между командой mov a1 и директивой adw1.
Циклические и разветвляющиеся программы Команда передачи, управления служит для передачи управления инструкции, не следующей непосредственно за данной. Управление может передаваться как внутри текущего сегмента кода (внутрисегментная передача управления), так и за его пределы (межсегментная передача управления). Тип передачи управления может быть задан ассемблеру предшествующим адресу перехода ключевым словом NEAR (внутрисегментная) или FAR (межсегментная). Безусловные переходы Инструкция безусловного перехода передаёт управление команде, адрес которой указан в инструкции. Команда безусловного перехода имеет вид jmp [< тип > ptr ] операнд. <тип> - тип перехода short (короткий) – смещение 127 байтов вперёд или 128 байтов назад, near (близкий) – смещение в пределах сегмента (64 Кбайта), far (дальний) – в любой сегмент с любым смещением. ptr – приставка, которую можно перевести как указанный в. Если тип не задан, по умолчанию принимается near. Всего можно выделить пять типов безусловных переходов (таблица 3.1).
Условный переход Команда условного перехода организует передачу управления при выполнении определённого в команде условия, в противном случае переход осуществляется на команду, следующую за инструкцией условного перехода. Условия определяются текущим состоянием флагов процессора. Каждая из 30 команд условных переходов проверяет определенную комбинацию флагов. Все условные переходы являются короткими, т.е. адрес перехода должен отстоять не далее, чем на - 128 или +127 байтов от первого байта следующей команды. Команды условной передачи управления и проверяемые при их выполнении условия приведены в таблице 3.2.
Циклы Инструкция, организующая программный цикл имеет вид: loop [<условие повторения цикла>] <метка короткого перехода> Инструкция loop использует содержимое регистра СХ как счетчик повторений цикла. Команда loop уменьшает содержимое регистра СХ на 1 и передает управление по адресу, определяемому меткой перехода, если содержимое СХ ≠ 0, в противном случае выполняется следующая за LOOP инструкция. Подобно условным переходам инструкции этой группы могут осуществлять только короткие передачи управления, т.е. в пределах от -128 до +127. Добавление к инструкции loop <условие повторения цикла> позволяет ввести дополнительные логические условия на повторение цикла: loope / loopz – повторять, пока ноль; loopne / loopnz – повторять, пока не ноль. Проверка флага ZF осуществляется командой loop. Цикл повторяется, если содержимое СХ ≠ 0 и выполняется соответствующее условие, в противном случае выполняется следующая за loop инструкция. Пример выполнения работы Дан масив из десяти слов, содержащих целые числа. Требуется найти максимальное значение в массиве. Текст программы: data segment max dw? mass dw 10,24,76,479,-347,281,-24,70,124,97 data ends code segment assume cs: code, ds: data start: mov ax, data mov ds, ax; Загрузить сегментный адрес данных lea bx, mass; Загрузить адрес смещения массива mov cx, 10; Установить счетчик повторений цикла mov ax, [bx]; Первый элемент массива в Аккумулятор beg: cmp [bx], ax; Сравнить текущий элемент ; массива с максимальным jl no; он меньше mov ax, [bx]; он больше или равен no: inc bx; Следующий элемент inc bx; массива loop beg mov max, ax quit: mov ax,4C00h; Код завершения 0 int 21h; Выход в DOS 1. code ends 2. end start Варианты заданий Дан массив из десяти знаковых чисел (слов или байт). Требуется: 1. Найти количество отрицательных чисел. Массив байт. 2. Найти сумму всех положительных и отрицательных чисел. Массив слов. 3. Найти сумму абсолютных величин. массив байт. 4. Найти количество положительных чисел. Массив байт. 5. Поменять местами пары соседних чисел. Массив слов. 6. Переставить числа в обратном порядке. Массив байт. 7. Заменить все отрицательные числа нулями. Массив байт. 8. Найти среднее арифметическое чисел. Массив слов. 9. Найти количество чисел больших 10h. Массив слов. 10. Найти наименьшее по абсолютной величине числа. Массив байт. 11. Найти наибольшее отрицательное число. Массив байт. 12. Найти произведение положительных элементов последовательности. Массив слов. 13. Найти среднее арифметическое квадратов ненулевых элементов последовательности. Массив слов. 14. Найти полусумму наибольшего и наименьшего чисел. Массив байт. 15. Найти среднее арифметическое отрицательных элементов последовательности. Массив слов. 16. Найти сколько в массиве чисел больше 12h и меньше 0Afh. Массив байт. 17. Найти есть ли в массиве два нуля, идущих подряд. Массив слов. 18. Найти сумму абсолютных величин, меньших 6. Массив байт. 19. Найти среднее арифметическое чисел больших 10. Массив слов. 20. Найти сколько чисел равно 12h. Массив байт. 21. Заменить все отрицательные числа их модулями. Массив байт. 22. Найти среднее арифметическое положительных чисел. Массив слов. 23. Найти количество чисел меньших 10h. Массив байт. 24. Найти наименьшее среди положительных чисел. Массив слов. 25. Найти наибольшее отрицательное число. Массив байт. Вопросы по теме 1. Для чего нужен префикс ptr? 2. В чем отличие команд mov ax, offset mass и lea ax, mass? 3. В чем отличие команд mov ax, bx и mov ax, [bx]? 4. В чем отличие команд mov ax, [bp] и mov ax, [bx]? 5. В чем отличие команд mov ax, [bx+2] и mov ax [bx] + 2? 6. В чем отличие команд mov ax, [bx][si] и mov ax, [si][bx]? 7. Какие существуют разновидности инструкции jmp? 8. Как организовать межсегментную передачу управления? 9. Напишите фрагмент программы условного перехода к метке, лежащей от самого перехода на расстоянии 257 байт. 10. Для организации каких вычислений служат каманды loop, loope, loopne? 11. Модифицирует ли какие-нибудь регистры команда loop? 12. Можно ли организовать цикл по счетчику, не используя команды loop? 13. Можно ли организовать цикл while с помощью одной из команд loop? ЧТО ПРОИСХОДИТ, КОГДА МЫ ССОРИМСЯ Не понимая различий, существующих между мужчинами и женщинами, очень легко довести дело до ссоры... Живите по правилу: МАЛО ЛИ ЧТО НА СВЕТЕ СУЩЕСТВУЕТ? Я неслучайно подчеркиваю, что место в голове ограничено, а информации вокруг много, и что ваше право... Что вызывает тренды на фондовых и товарных рынках Объяснение теории грузового поезда Первые 17 лет моих рыночных исследований сводились к попыткам вычислить, когда этот... Система охраняемых территорий в США Изучение особо охраняемых природных территорий(ООПТ) США представляет особый интерес по многим причинам... Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:
|