
- •6. Лекция. Язык программирования ассемблер ia-32 (Intel Architecture -32bit)
- •6. Язык программирования ассемблер ia-32
- •6.1. Структура программы на языке ассемблер
- •6.2. Директивы языка ассемблера ia-32
- •6.2.1. Псевдокоманды определения переменных
- •6.2.2. Организация программы
- •6.3. Управление потоком выполнения программы
- •6.3.1. Условные переходы и флаги кодов условий
- •6.3.2. Команды сравнения
- •6.3.3. Безусловный переход
- •6.4. Логические команды, команды сдвига и циклического сдвига
- •6.4.1. Логические операции
- •6.4.2. Операции сдвига и циклического сдвига
- •6.4.3. Программа упаковки цифр
- •6.5. Другие команды
- •6.5.1. Вычитание
- •6.5.2. Команды умножения и деления
- •Imul reg,src(исходный)
- •Imul src и mul src
- •Idiv src и div src
- •6.5.3. Команды мультимедийного расширения
- •6.5.4. Векторные команды
- •6.6. Подпрограммы
- •6.6.1. Вложенность подпрограмм и стек процессора
- •6.6.2. Организация стека
- •6.6.3. Передача параметров
- •6.7. Примеры программ
- •6.7.1. Программа для вычисления скалярного произведения двух векторов
- •6.7.2. Программа сортировки байтов
- •6.7.3. Подпрограммы для вставки и удаления элементов связного списка
- •6.8. Различия между программами в ехе - и сом - файлах
- •6.8.1. Пример программы типа сом
- •6.8.2. Пример программы типа ехе
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 удаляющая элемент из связного списка