Методические указания к лабораторным работам (Основы языка ассемблера) 2005г
[Скачать с сервера (33.3 Kb) - бесплатно] | 13.04.2009, 00:57 |
Методичка содержит материал для выполнения первых лабораторных работ по работе с языком ассемблера Далее представлены фрагменты из методчики. 1. Ассемблер микропроцессора Intel 8086/80881.1. Формат операторов ассемблераОператоры языка ассемблера ПЭВМ имеют следующий формат: [<метка> :]<префикс> <код операции > [<спиcок операндов >1 [<комментарии>]. Запись программы выполняется по свободному формату, т. е. специально не оговариваются правила заполнения позиций строки. Точка с запятой в начале строки означает, что данная строка является строкой комментария. Программа может записываться как заглавными, так и строчными буквами. Метку произвольной длины следует записывать с начала строки и отдалять от кода операции двоеточием, за которым может следовать произвольное количество пробелов (вплоть до конца строки). Код операции должен отделяться от списка операндов хотя бы одним пробелом. Операнды отделяются один от другого запятой. 1.2. Определение полей памяти для размещения данныхДля определения данных в основной памяти и резервирования полей памяти под данные, размещаемые в основной памяти в процессе выполнения программы, используются следующие операторы: DB - определить однобайтовое поле, DW - определить слово (двухбайтовое поле), DD - определить двойное слово (четырехбайтовое поле). Формат команды: где <количество >- количество полей памяти указанной длины, которое определяется данной командой (указывается, если определяется не одно поле памяти); ? - используется при резервировании памяти. Приведем примеры
Примечание. При записи слов в память младший байт записывается в поле с младшим адресом. Например, в примере 3, если запись выполнялась по адресу 100, то по адресу 100 будет записано 34H, а по адресу 101 - 12H. 1.3. Операнды команд ассемблераОперанды команд ассемблера могут определяться непосредственно в команде, находиться в регистрах или в основной памяти, Данные, непосредственно записанные в команде, называются литералами. Так, в команде Если операнды команд ассемблера находятся в регистрах, то в соответствующих командах указываются имена регистров (если используемые регистры особо не оговариваются для данной команды. Например, в приведенном выше примере аh - имя регистра аккумулятора. Адресация операндов, расположенных в основной памяти, может быть прямой и косвенной.При использовании прямой адресации в команде указывается символическое имя поля памяти, содержащего необходимые данные, например: inc OPND Здесь OPND - символическое имя поля памяти, определенного оператором ассемблера OPND dw ? При трансляции программы ассемблер заменит символическое имя на исполнительный адрес указанного поля памяти (смещение относительно начала сегмента) и занесет этот адрес на место индексного смещения. Адресация а этом случае выполняется по схеме: BР + <индексное смещение>, но содержимое регистра ВР при вычислении исполнительного адреса не используется (частный случай). В отличие от прямого косвенный адрес определяет не местоположение данных в основной памяти, а местоположение компонентов адреса этих данных. В этом случае в команде указываются один или два регистра в соответствии с допустимыми схемами адресации и индексное смещение, которое может задаваться числом или символическим именем. Косвенный адрес заключается в квадратные скобки весь или частично, например: [OPND +SI] Приведенные выше формы записи косвенного адреса интерпретируются одинаково. При трансляции программы ассемблер определяет используемую схему адресации и соответствующим образом формирует машинную команду, при этом символическое имя заменяется смещением относительно начала сегмента так же, как в случае прямой адресации. Примечание. При использовании косвенной адресации по схеме ВР + <индексное смещение> индексное смещение не может быть опущено, так как частный случай адресации по данной схеме с нулевой длиной индексного смещения используется для организации прямой адресации. Следовательно, при отсутствии индексного смещения в команде следует указывать нулевое индексное смещение, т.е. [ВР + 0] . Приведем два примера: [a + bx] и [bр]+[si] +6. В первом случае исполнительный адрес операнда определяется суммой содержимого регистра bх и индексного смещения, заданного символическим именем "а", а во втором - суммой содержимого регистров bp, si и индексного смещения, равного 6. Длина операнда может определяться:
1.4. Команды пересылки / преобразования данных1. Команда пересылки данныхMOV <адрес приемника> ,< адрес источника> используется для пересылки данных длиной I или 2 байта из регистра в регистр, из регистра в основную память, из основной памяти в регистр, а также для записи в регистр или основную память данных, непосредственно записанных в команде. Все возможные пересылки представлены на рис. 6. Приведем примеры
Для загрузки "прямого" адреса в сегментный регистр используются две команды пересылки: mov ax, code 2. Команда обмена данныхХCHG <операнд 1> , <операнд 2> организует обмен содержимого двух регистров (кроме сегментных) или регистра и поля основной памяти. Например: xchg bx, cx - обмен содержимого регистров bx и сх. 3. Команда загрузки исполнительного адресаLEA < операнд l > , < операнд 2 > вычисляет исполнительный адрес второго операнда и помещает его в поле, на которое указывает первый операнд. Приведем примеры:
4. Команды загрузки указателяLDS < регистр > ,<операнд 2> Команда LDS загружает в регистры DS :< регистр> указатель ( < адрес сегмента > : < исполнительный адрес > ), расположенный по адресу, указанному во втором операнде. Команда LЕS загружает указатель по адресу, расположенному во втором операнде, в регистры ЕS:< регистр> . Например: lds si, exword т.e. слово (2 байта) по адресу exword загружается в si, а по адресу exword+ 2 - в ds. 5. Команда записи в стекPUSH < операнд> организует запись в стек слова, адрес которого указан в операнде. Например; 6. Команда восстановления из стекаPOP < операнд> организует чтение из стека последнего слова и помещает его по адресу, указанному во втором операнде. Например: 7. Команды сложенияADD <операнд 1> , <операнд 2> устанавливают флаги четности, знака результата, наличия переноса, наличия переполнения. Ilo команде ADD выполняется сложение двух операндов. Результат записывается по адресу первого операнда. По команде АDC также выполнятся сложение двух операндов, но к ним добавляется еще значение, записанное в бите переноса, установленном предыдущей командой сложения. На рис. 7 показаны возможные способы размещения слагаемых, где а -операнды - слова, б - операнды - байты. mov ax, value1 Исходные числа находится в основной памяти по адресам value1 и value2, а результат записывается по адресу value1. 8. Команды вычитанияSUB <уменьшаемое-результат> , <вычитаемое> устанавливают флаги четности, знака результата, наличия заема, наличия переполнения. При выполнении операции по команде SUB заем не учитывается, а по команде SBB - учитывается. Ограничения на местоположение операндов такие же, как и у команды сложения. 9. Команда изменения знакаNEG <операнд> 10. Команда добавления единицыINC <операнд> 11. Команда вычитания единицыDEC <операнд> 12. Команда сравненияСМP <операнд 1> , < операнд 2> 13. Команды умноженияMUL <операнд> устанавливают флаги наличия переноса или переполнения. По команде MUL числа перемножаются без учета, и по команде - IМUL с учетом знака (в дополнительном коде). На рис. 8 (где а - операнды - слова, б - операнды - байты) приведены возможные способы размещения сомножителей и результата (один из сомножителей всегда расположен в регистре-аккумуляторе. Здесь содержимое основной памяти по адресу "с" длиной слово умножается на содержимое регистра ax. Младшая часть результата операции записывается в регистр aх, а старшая часть - и регистр dx. 14. Команда деленияDIV <операнд-делитель> По команде DIV операция деления выполняется без учета, а по команде IDIV - с учетом знака (в дополнительном коде). На рис. 9 приведены возможные способы размещения делимого, делителя и результата (а - операнды - слова, б - операнды - байты). 15. Команда преобразования байта в слово, а слова - в двойное словоCBW По команде CBW число из al переписывается в ax (дополнение выполняется знаковыми разрядами). Аналогично по команде CWD число из ax переписывается в два регистра dx и ax (dx:ax). 1.5. Команды передачи управления1. Команда безусловного переходаJMP <адрес перехода> имеет три модификации в зависимости от длины ее адресной части:
При указании перехода к командам, предшествующим команде перехода, ассемблер сам определяет расстояние до метки перехода и строит адрес нужной длины. При указании перехода к последующим частям программы необходимо ставить указатели short, near ptr и far ptr. В качестве адреса команды перехода используются метки трех видов:
Примеры:
2. Команды условного перехода<мнемоническая команда> <адрес перехода>
Все команды имеют однобайтовое поле адреса, следовательно, смешение не должно превышать -128...127 байт. Если смещение выходит за указанные пределы, то используется специальный прием: (читайте в методичке) 3. Команды организации циклической обработкиВ качестве счетчика цикла во всех командах циклической обработки используется содержимое регистра cx. 1) Команда организации циклаLOOP < адрес перехода > Примечание. Если перед началом цикла в регистр cx загружен 0, то цикл выполняется 35536 раз. 2) Команда перехода по обнуленному счетчикуJCXZ <адрес перехода> передает управление по указанному адресу, если содержимое регистра cx равно 0. Например: 3) Команды организации цикла с условиемLООРE <адрес перехода> уменьшают содержимое на единицу и передают управление по указанному адресу при условии, что содержимое cx отлично от нуля, но LООРE дополнительно требует наличия признака "равно", а LOOPNE - ''не равно", формируемых командами сравнения. Например: mov cx, loop_count ; загрузка счетчика 4. Команды вызова подпрограмм1) Команда вызова процедурыCALL <адрес процедуры> осуществляет передачу управления по указанному адресу, предварительно записав в стек адрес возврата.
Например: call near ptr p - вызов подпрограммы "р". Здесь указатель удаленности также служит дли определения длины адресов, используемых при обращении к процедуре: near - при использовании двухбайтовых адресов, far - при использовании четырехбайтовых адресов. 2) Команда возврата управленияRET [<число>] извлекает из стека адрес возврата и передает управление по указанному адресу. Если в команде указано значение счетчика, то после восстановления адреса возврата указанное число добавляется к содержимому регистра-указателя стека. Последний вариант команды позволяет удалить из стека параметры, передаваемые в процедуру через стек. 1.6. Команды обработки строкКоманды обработки строк используются для организации циклической обработки последовательностей элементов длиной I или 2 байта. Адресация операндов при этом выполняется с помощью пар регистров: DS:SI - источник, ES:DI - приемник. Команды имеют встроенную корректировку адреса операндов согласно флагу направления D: 1 - уменьшение адреса на длину элемента, 0 - увеличение адреса на длину элемента. Корректировка выполняется после выполнения операции. Установка требуемого значения флага направления выполняется специальными командами: STD - установка флага направления в единицу, 1) Команда загрузки строки LODSLODSB (загрузка байта) LODSW ( загрузка слова). Команда загружает байт в АL или слово в AX. Для адресации операнда используются регистры DS:SI 2) Команда записи строки STOSSTOSB ( запись байта), записывает в основную память содержимое AL или АX соответственно. Для адресации операнда используются регистры ES:DI. 3) Команда пересылки MOVSMOVSB (пересылка байта), 4) Команда сканирования строки SCASSCASB (поиск байта), По команде содержимое регистра AL или АХ сравниваются с элементом строки, адресуемым регистрами DS:SI и устанавливается значение флажков в соответствии с результатом [DI] - AL или [DI]-AX. 5) Команда сравнения строк CMPSСMPSB (сравнение байт), элементы строк, адресуемых парами регистров DS:SI и ES:DI, сравниваются и устанавливаются значения флажков в соответствии с результатом [DI]-[SI]. 6) Префиксная команда повторенияREP <команда> позволяет организовать повторение указанной команды CX раз. Например: rep stosb Здесь поле, адресуемое парой регистров ES:DI длиной CX заполняется содержимым AL . 7) Префиксные команды "повторять, пока равно" и "повторять, пока не равно"REPE < команда > Префиксные команды используются совместно с командами СMPS и SCAS. Префикс REPE означает повторять, пока содержимое регистра СХ не равно нулю и значение флажка нуля равно единице, a REPNE - повторять, пока содержимое регистра CX не равно нулю и значение флажка нуля равно нулю. 1.7. Команды манипулирования битами1. Логические команды
Операнды байты или слова. Пример. Выделить из числа в AL первый бит: 2. Команды сдвига<код операции> <операнд>, <счетчик> Коды команд сдвига
Пример. Умножить число в AX на 10: mov bx, ax 1.8. Команды ввода - выводаОбмен данными с внешней средой осуществляемся с помощью следующих команд:
В качестве регистра можно указать AL или AX (соответственно будет обрабатываться байт или два байта). Порт отождествляется с некоторым внешним устройством (0...255). Однако при организации ввода - вывода помимо самой операции необходимо осуществить ряд дополнительных действий, например, проверить готовность устройства. В связи с этим для типовых устройств разработаны стандартные программы организации ввода - вывода, которые вызываются по команде прерывания int 21h. В таблице 1 приведен перечень основные функции, реализуемые подпрограммами ввода - вывода, и их коды. Код функции должен передаваться в подпрограмму в регистре AH.
Задание к лабораторной работе №3Ниже приведен пример текста программы, которая на языке ассемблер в заданном массиве определяет элемент с максимальной величиной. Порядок выполнения работДля выполнения лабораторной работы необходимо:
Добавил: COBA (13.04.2009) | Категория: Ассемблер Просмотров: 11639 | Загрузок: 1721 | Рейтинг: 4.5/4 | |
Комментарии (0) | |