Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Использование ассемблера для оптимизации программ на С++ - Магда Ю.С.

Магда Ю.С. Использование ассемблера для оптимизации программ на С++ — БХВ-Петербург , 2004. — 496 c.
ISBN 5-94157-414-2
Скачать (прямая ссылка): ispolzovaniyaassemblera2004.djvu
Предыдущая << 1 .. 20 21 22 23 24 25 < 26 > 27 28 29 30 31 32 .. 127 >> Следующая

В операции всегда участвует вершина стека, поэтому в команде надо указать только один регистр или ячейку памяти. После выполнения сравнения в слове состояния процессора содержится результат этой операции. При загрузке флагов состояния сопроцессора в регистр флагов процессора бит со помещается на место флага переноса cf, С2 — на место бита четности pf, а сз — на место zf.
Для отражения результата сравнения необходимы только два бита состояния: сз и со. В табл. 2.1 приводится соотношение сравниваемых операндов и битов состояния.
Таблица 2.1. Соотношение сравниваемых операндов и битов состояния
СЗ со Результат
0 0 ST > источник
0 1 ST < источник
1 0 ST = источник
1 1 ST и источник несравнимы
Следующая программа (листинг 2.5) сравнивает два вещественных числа и выводит результат сравнения на экран.
Гпава 2. Оптимизация вычислительных алгоритмов с помощью ассемблера
73
ПпС ГШ(Г 2.5. Орлове ни:: f-.ic Li,-if i -;.rn н ¦ >; x чн-'г?1 ь ; iJOf
// COMPARE_REAL.cpp : Defines the entry point for the console // application.
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[]) {
float X, Y; int Flag = 0;
X = 0;
Y = 0;
while (true)
{
printf("\nEnter X: "); scanf("%fn, &X); printf("Enter Y: "); scanf("%f", &Y);
_asm {
finit
fldz
fid DWORD PTR X
fcomp DWORD PTR Y
fstsw AX
fwait
sahf
jb xly
j e xeqy
mov Flag, 2
jmp ex
xly:
mov Flag, 0
jmp ex
xeqy:
mov Flag, 1
74
Часть I. Основы эффективного программирования на ассемблере
ех:
};
switch (Flag)
{
case 0:
printf("X < Y\n"); break;
case 1:
printf("X * Y\n"); break;
case 2:
printf("X > Y\nM); break; default:
break;
}
}
return 0;
} .
После инициализации сопроцессора командой finit в вершину стека помещается переменная х. Команда fcomp сравнивает число в вершине стека с переменной в памяти и, в зависимости от результата, устанавливает биты в слове состояния процессора. Биты состояния записываются затем в регистр состояния центрального процессора, где и анализируются. В зависимости от установленных битов выполняется переход на соответствующую ветвь программы. Фрагмент кода, выполняющий эти действия, выглядит так:
finit
fid DWORD PTR X
fcomp DWORD PTR Y
fstsw AX sahf
Окно работающего приложения показано на рис. 2.4.
Кроме команды fcomp, существуют и другие варианты команды сравнения fcom, в частности — версия ficomp для сравнения целых чисел. Далее представлен исходный текст программы, сравнивающей два целых числа (листинг 2.6).
Гпава 2. Оптимизация вычислительных алгоритмов с помощью ассемблера 75
; й : у
Рис. 2.4. Окно приложения, реализующего алгоритм сравнения вещественных чисел
j, Листинг 2.6. Сравнений двух ((клык -исеп
// COMPARE_INTS.срр : Defines the entry point for the console // application.
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int X, Y; int Flag = 0;
X = 0;
Y = 0; while (true)
{
printf("\nEnter X: "); scanf("%d", &X); printf("Enter Y: "); scanf("%d", &Y);
_asm {
finit
fild DWORD PTR X
ficomp DWORD PTR Y
fstsw AX
fwait
sahf
jb xly
76
Часть I. Основы эффективного программирования на ассемблере
De xeqy
mov Flag, 2
jmp ex
xly:
mov Flag, 0
jmp ex
xeqy:
mov Flag, 1
ex:
};
switch (Flag) i
\ case 0:
printf("X < Y\n"); break; case 1:
printf("X = Y\n"); break; case 2:
printf("X > Y\n"); break; default:
break;
}
}
return 0;
}
В целом исходный текст программы сравнения целых чисел почти не отличается от текста программы для сравнения вещественных чисел. Единственное отличие — вместо команд арифметики вещественных чисел (fid, fcomp) используются команды целочисленной арифметики (fild, ficomp).
Приведем еще один пример, показывающий технику использования команд сопроцессора в ассемблерном коде. Необходимо подсчитать, сколько раз встречается в массиве целых чисел определенное число. Исходный текст консольного приложения C++ .NET представлен в листинге 2.7.
Гпава 2. Оптимизация вычислительных алгоритмов с помощью ассемблера
77
¦ Листинг >.7. Программа подсчета кол ичес<тк; вхождений цело: о чи::::;';
11 COUNT_NUMBER.срр : Defines the entry point // for the console application.
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int iarraytlO] = {-13, -7, .10, -5, 3, -7, -5, 4, -7, -3}; int *piarray = iarray; int num;
printf("Array: ") ;
for (int cnt = 0;cnt < sizeof (iarray)/4;cnt+-i-)
{
printf("%d ", *piarray++);
}
while (true)
{
printf("\nEnter number to found: "); scanf("%d", &num); cnt = 0;
int sf = sizeof(iarray)/4;
_asm {
mov ESI, DWORD PTR piarray
mov ECX, DWORD PTR sf
finit
fild DWORD PTR num
next_cmp:
ficom DWORD PTR ['ESI]
fstsw AX
sahf
jne skip
inc cnt
skip:
sub ESI, 4
78
Часть I. Основы эффективного программирования на ассемблере
loop next_cmp fwait
}
printf("\nThe number %d occures = %d times\n", num, cnt);
}
return 0;
}
Первые команды ассемблерного блока инициализируют регистры процессора esi и есх адресом последнего массива и его размером соответственно. После этого искомое значение загружается из переменной num в вершину математического сопроцессора командой
Предыдущая << 1 .. 20 21 22 23 24 25 < 26 > 27 28 29 30 31 32 .. 127 >> Следующая