Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Здесь переменная SubRes связана с полем редактирования Edit, в котором отображается результат вычитания, а и и 12 связаны с полями редактирования для ввода целых чисел.
Поскольку наша процедура принимает в качестве параметров указатели и возвращает указатель, то объявление внешней процедуры subtwop в классе диалогового окна несколько изменится:
extern "С" int* _stdcall subtwop(int *pil, int *pi2);
В основной программе наибольший интерес вызывает строчка:
SubRes = *subtwop(&I1, &I2);

Здесь, так же как и в Delphi, мы имеем дело с операциями взятия адреса и разыменованием указателей. В С + + выражения типа &и и &I2 возвращают адреса переменных и и 12. Напомню, что эти переменные связаны с соответствующими элементами управления. Символ " * " перед именем процедуры subtwop является оператором разыменования. Переменной SubRes присваивается значение переменной по адресу, который возвращает процедура subtwop. Читатель может самостоятельно проверить результат, скомпилировав приложение.

Использование указателей очень эффективно при обработке строк и массивов данных. Обычно ассемблерные процедуры для доступа к элементам таких массивов используют регистры E S I и EDI, ХОТЯ МОЖНО применять для индексации и другие регистры. Следующие несколько примеров демонстрируют работу с массивами данных с использованием указателей.

В следующем примере необходимо найти максимальное значение в массиве целых чисел. Вычисление максимального элемента массива будет выполнять ассемблерная процедура.
Исходный текст процедуры на ассемблере (назовем ее maxint) приведен в листинге 3.29.
Листинг 3.29. Ассемблерная процедура maxint
.386
.model flat
public maxint
.data
. code
maxint proc
push E S I
push EBP
mov EBP, ESP
mov EDX, DWORD PTR [EBP+16
mov E S I , DWORD PTR [EBP+12
next cmp:
mov EAX, DWORD PTR [ E S I ]
cmp EAX, DWORD PTR [ E S I + 4 ]
jle dec cnt
xchg EAX, DWORD PTR [ E S I + 4 ]
dec cnt:
dec EDX
cmp EDX, 0
Интерфейс с языками высокого уровня
jz fin
add ESI, 4
jmp next_cmp
fin:
mov EAX, ESI
pop EBP
pop ESI
ret 8
maxint endp
end

Процедура maxint принимает два параметра: адрес массива (ЕВР + 12) и размер массива ( Е В Р + 1 6 ) . В начале цикла в регистр ЕАХ помещается первый элемент массива и сравнивается с последующим элементом. Если содержимое регистра ЕАХ больше содержимого ячейки памяти, то происходит обмен между регистром и памятью.
В следующей итерации в регистр ЕАХ загружается большее из двух чисел предыдущей итерации и снова происходит сравнение. К концу цикла процедура определит адрес, по которому находится максимальный элемент массива. Этот адрес будет возвращен в основную программу в регистре ЕАХ.
Счетчиком итераций является регистр EDX, принимающий в качестве параметра размер массива. В каждой итерации адрес элемента массива, содержащийся в регистре E S I , увеличивается на 4, т. к. целое число занимает 4 байта.


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru