Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архитектура компьютеров / 6_Ассемблер-IA-32.doc
Скачиваний:
62
Добавлен:
20.03.2015
Размер:
593.92 Кб
Скачать

6.7. Примеры программ

6.7.1. Программа для вычисления скалярного произведения двух векторов

На рис. 6.11 приведена программа вычисления скалярного произведения двух векторов для процессоров архитектуры IA-32. Начальные адреса этих векторов равны AVEC и BVEC. В программе для доступа к последовательным элементам векторов используется базовая индексная адресация. В качестве индексного ре­гистра применяется регистр EDI. Коэффициент масштабирования равен 4, по­скольку элементы векторов являются двойными словами (4 байта). В качестве счетчика цикла используется регистр ЕСХ, инициализированный значением n. Это позволяет задействовать команду LOOP (см. раздел 5.2), кото­рая сначала уменьшает значение регистра ЕСХ, а затем выполняет условный пе­реход по адресу LOOPSTART, если содержимое регистра ЕСХ не равно нулю. Предполагается, что произведение двух элементов векторов поместится в двой­ное слово, поэтому в команде умножения IMUL явно задан регистр назначения EDX (см. раздел 5.14).

Рис. 6.11. Программа для процессоров IA-32, вычисляющая скалярное произведение двух векторов

6.7.2. Программа сортировки байтов

int main (int argc, char*, argv[])

{

for (j=n-1; j>0; j=j-1)

{for(k=j-1; k >= 0; k = k - 1)

{if (LIST[k] > LIST[j])

{TEMP = LIST[k];

LIST[k] = LIST[j];

LIST[j] = TEMP;

}

}

}

}

Рис 6.12. Программа сортировки байтов для процессоров IA-32 на языке С

На рис. 6.13, вы видите программу для процессора IA-32, выполняющую сорти­ровку байтов. Регистр ЕАХ инициализируется значением LIST и используется в качестве базо­вого регистра для доступа к элементам списка при базовой индексной адресации. Регистр EDI служит индексным регистром для внешнего цикла (индекс j), а ре­гистр ЕСХ — индексным регистром для внутреннего цикла (индекс k). В регистре DL содержится текущий наибольший байт сортируемого подсписка. Для замены элементов LIST(k) и LIST(j) программе требуются три команды, а также регистр для временного хранения данных.

В программе введена еще одна неизвестная команда

XCNG operand1,operand2,

которая меняет значения операндов.

Рис. 6.13. Программа сортировки байтов для процессоров IA-32 на языке ассемблера

6.7.3. Подпрограммы для вставки и удаления элементов связного списка

Программы на рис. 6.14 и 6.15, выполняют вставку и удаление элементов связ­ного списка. Па­раметры им передаются через регистры. Причем регистры с именами RHEAD, RNEWREC, RIDNUM, RCURRENT и RNEXT используются так же, как в уни­версальных подпрограммах. Указанные имена применяются вместо имен регист­ров IA-32 ЕАХ, ЕВХ и т. д. Для хранения кода новой вставляемой записи задейст­вован шестой регистр, RNEWID, в который первая команда подпрограммы с рис. 6.14 загружает код новой записи.

В программе вставки в связный список нового элемента для процессоров IA-32 предполагается, что код новой записи не совпадает ни с одним из кодов, имеющихся с списке записей, а в программе уда­ления предполагается, что в списке имеется запись с кодом, заданным в регистре RIDNUM.

Рис. 6.14. Подпрограмма для процессоров IA-32, вставляющая в связный список новый элемент

Рис. 6.15. Подпрограмма для процессоров ia-32 удаляющая элемент из связного списка

Соседние файлы в папке Архитектура компьютеров