Иванова Г.С., Ничушкина Т.Н. - Основы программирования на ассемблере IA-32 (1075571), страница 6
Текст из файла (страница 6)
Написать фрагмент вычисления X=max(A,B):LESS:movax,Acmpax,BjlLESSmovX,axjmpCONTINUE ; переход на конец ветвленияmovax, BmovX,ax; сравнение A и B; переход по меньшеCONTINUE: ...Оглавление423.2.2 Программирование итерационных циклов (цикл-пока)Программирование циклических процессов осуществляется с использованием либокоманд переходов, либо – в случае счетных циклов – с использованием команд организации циклов.Так, чтобы реализовать цикл-пока необходим один условный и один безусловныйпереходы:СYCL:cmp... ; проверка условия выходаjneCOM ; выход из циклаОперации ; тело циклаjmpCOM:CYCL ; возврат в цикл...Пример.
Написать фрагмент суммирования чисел от 1 до 10, используя итерационный цикл.CYCL:; обнуление суммыmovax,0movbx,1cmpbx, 10jgCONTINUE ; выход из циклаaddax, bxincbx; следующее числоjmpCYCL; возврат в циклCONTINUE:...; первое слагаемое; слагаемое больше 10; суммирование; выход, сумма - в axОглавление433.3Команды организации циклической обработки. Организация счетных цик-ловВ качестве счетчика цикла во всех командах циклической обработки используетсярегистр ECX.1. Команда организации счетного цикла:LOOPАдрес переходаПри каждом выполнении команда уменьшает содержимое регистра ECX на единицу и передает управление по указанному адресу, если ECX не равно 0.Организация счетного цикла.
Для организации счетного цикла с использованиемкоманды LOOP необходимо записать количество повторений в регистр счетчика ECX.Тогда команда LOOP будет отсчитывать повторения, вычитая 1 из счетчика.Примечание. Если перед началом цикла в регистр ECX загружен 0, то цикл выполняется 232 раз. Такая ситуация называется «зацикливанием», поскольку программа надолго «зависает».movECX,nbegin_loop: Операцииloop; загрузка счетчика; тело циклаbegin_loopПример. Написать фрагмент суммирования чисел от 1 до 10, используя счетныйцикл.CYCL:movAX,0; обнуление суммыmovBX,1; первое слагаемоеmovECX,10addAX,BX; суммированиеincBX; следующее числоloopCYCL;continue: ...; загрузка счетчикавозврат в цикл; выход, сумма – в axОглавление442.
Команда перехода по обнуленному счетчику.JCXZАдрес переходаКоманда передает управление по указанному адресу, если содержимое регистраECX равно 0.Организация счетного цикла с проверкой счетчика.movECX,loop_count ; загрузка счетчикаjcxzend_of_loopbegin_loop: Операцииloop; проверка счетчика; тело циклаbegin_loopend_of_loop:...3. Команды организации цикла с условием.LООРEАдрес переходаLOOPNE Адрес переходаПри выполнении обеих команд содержимое регистра ECX уменьшается на единицу,после чего они передают управление по указанному адресу при условии, что содержимоеECX отлично от нуля, причем LООРE дополнительно требует наличия флага «равно»(ZF=1), а LOOPNE – «не равно» (ZF=0).Организация цикла со сложным условием. Конструкция Цикл со сложным условием позволяет эффективно реализовать поиск данных:movECX,loop_count ; загрузка счетчикаjcxzend_of_loopbegin_loop: Операцииcmploopneal,100end_of_loop:; проверка счетчика; тело цикла; проверка содержимого albegin_loop...Оглавление453.4Команда загрузки исполнительного адресаКоманда загрузки исполнительного адреса имеет следующий формат:LEAreg, memВ результате выполнения команды в регистр reg заносится исполнительный адресоперанда mem, размещенного в оперативной памяти.Операнд mem обычно задается следующим образом:Непосредственное смещение [База, Индекс*Масштаб] ,причем любая часть описания может быть опущена, а непосредственное смещение можетбыть записано в скобках или в виде символического имени.Возможны следующие варианты:|||||||||БазаEAXEBXECXEDXEBPESPESIEDIИндекс+EAXEBXECXEDXEBPESIEDI*МасштабСмещение1248отсутств.,8,16 или32 бита+|||||||||Исполнительный адрес рассчитывается по формуле:EA = (База) + (Индекс)*Масштаб + Непосредственное смещениегде (…) - содержимое указанного регистра.Примеры:leaEAX,[500] или leaEAX,500 ; в EAX загружается число 500leaEDX,[ECX]leaEBX,TABLE[ESI*4] ; в EBX загружается число из ESI, умноженное на 4leaEBX,Exword; в EDI загружается число из ECX; в EBX загружается смещение символического имени; Exword относительно начала сегментаleaEBX,[EDI+10]; в EBX загружается адрес l0-го байта относительно; точки, на которую указывает адрес в регистре EDI.Команда lea обычно используется определении адресов массивов, матриц и строк.Оглавление463.4.1 Обработка одномерных массивовМассив во внутреннем представлении – это последовательность элементов в памяти.
В ассемблере такую последовательность можно определить, например, так:SWORDA10,13,28,67,0,-1; массив из 6 чисел длиной слово.Программирование обработки выполняется с использованием адресного регистра, вкотором хранится либо смещение текущего элемента относительно начала сегмента данных, либо его смещение относительно начала массива. При переходе к следующему элементу и то и то смещение увеличиваются на длину элемента. Если длина элемента отлична от единицы, то можно использовать масштаб.Пример. Написать процедуру, выполняющую суммирование массива из 10 чиселразмером слово.Вариант 1 (используется адрес):Вариант 2 (используется смещение):movAX,0movAX,0leaEBX,MASmovEBX,0movECX,10movECX,10CYCL: addAX,[EBX]CYCL: addAX,MAS[EBX*2]addEBX,1addEBX,2loop CYCLloop CYCLВторой вариант позволяет получать более наглядный код и потому является предпочтительным.В том случае, если элементы просматриваются не подряд, адрес элемента можетрассчитываться по его номеру (числа нумерованы с единицы):Aисп = Aначала+(<Номер> - 1)*<длина элемента>.Полученный по формуле адрес записывается в 32-х разрядный регистр и используется для доступа к элементу.Пример.
Написать фрагмент, который извлекает из массива, включающего 10 чисел размером слово, число с номером n (n≤10).movEBX,N; номер числаdecEBX; вычитаем 1movAX,MAS[EBX*2] ; результат в AXОглавление473.4.2 Обработка матрицЗначения матрицы могут располагаться в памяти по строкам и по столбцам. Дляопределенности будем считать, что матрица расположена в памяти построчно, как в Паскале и С++.При обработке элементов матрицы следует различать просмотр по строкам, просмотр по столбцам, просмотр по диагоналям и произвольный доступ.Если матрица расположена в памяти по строкам и просмотр выполняется по строкам, то обработка может выполняться так, как в одномерном массиве, без учета переходаот одной строки к другой.Пример. Написать фрагмент определения максимального элемента матрицы A(3,5).CYCL:NEXT:movEBX,0; номер элемента 0movECX,14; счетчик циклаmovAX,A; заносим первое числоcmpAX,A[EBX*2+2] ; сравниваем числаjgeNEXTmovAX,A[EBX*2+2] ; если меньше, то запомнитьaddEBX,1loopCYCL; если больше, то перейти к следующему; переходим к следующему числуПросмотр по строкам при необходимости фиксировать завершение строки и просмотр по столбцам при построчном расположении в памяти выполняются в двойном цикле.Пример.
Определить сумму максимальных элементов столбцов матрицы A(3,5).movAX,0; обнуляем суммуmovEBX,0; смещение элемента столбца в строкеmovECX,5; количество столбцовCYCL1: push ECX; сохраняем счетчикmovECX,2; счетчик элементов в столбцеmovDX,A[EBX]; заносим первый элемент столбцаОглавление48movCYCL2: cmpESI,10; смещение второго элемента столбцаDX,A[EBX]+[ESI] ; сравниваем; если больше или равно - к следующемуjgeNEXTmovDX,A[EBX]+[ESI] ; если меньше, то сохранилиESI,10; переходим к следующему элементуloopCYCL2; цикл по элементам столбцаaddAX,DX; просуммировали максимальный элементpopECX; восстановили счетчикaddEBX,2; перешли к следующему столбцуloopCYCL1; цикл по столбцамNEXT: addПри просмотре по диагонали обычно используют один цикл, через переменную которого рассчитываются смещения элементов массива.
Однако проще использовать специальный регистр смещения, который должен соответствующим образом переадресовываться.Оглавление493.5Команды обработки строкКоманды обработки строк используются для организации циклической обработкипоследовательностей элементов длиной 1, 2 или 4 байта. Адресация операндов при этомвыполняется с помощью пар регистров: DS:ESI – источник, ES:EDI – приемник.
Команды имеют встроенную корректировку адреса операндов согласно флагу направленияDF: DF=1 – автоматическое уменьшение адреса на длину элемента, DF=0 – автоматическое увеличение адреса на длину элемента. Автоматическая корректировка осуществляется после выполнения операции.Установка требуемого значения флага направления производится специальными командами: STD – установка флага направления в единицу,CLD – сброс флага направления в ноль.1. Команда загрузки строки LODS.LODSB(загрузка байта),LODSW(загрузка слова),LODSD(загрузка двойного слова),Команда использует адрес операнда по умолчанию в DS:ESI. Она загружает байт вАL, слово в AX или двойное слово в EAX.2.