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

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


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





Очень часто на практике возникает необходимость в поиске какого-либо элемента строки. Приведенный далее пример демонстрирует, как это можно реализовать.
Пусть имеется строка символов, в которой ищется какой-либо символ. Необходимо в вызывающую программу вернуть порядковый номер первого встретившегося элемента строки, если таковой найден, или 0 в случае неудачи. В ассемблерную процедуру в качестве параметров передаются адрес строки и символ, который необходимо найти.

Исходный текст процедуры (назовем ее charpos) на ассемблере для вызова из Delphi-приложения представлен в листинге 3.54.
Листинг 3.54. Ассемблерная процедура, выполняющая поиск символа ; в строке, находящейся в программе на Delphi
.386
.model flat
public charpos
.data
.code
charpos proc
push EBX
push ЕВР
mov ЕВР, ESP
mov ЕВХ, DWORD PTR [EBP+12]
xor EAX, EAX
mov AL, BYTE PTR [EBP+16]
mov ECX, 1
next_check:
cmp AL, [EBX]
je quit
cmp BYTE PTR [EBX], 0
jne inc_cnt
jmp not_found
quit:
mov EAX,
pop EBP
pop EBX
ret 8
inc cnt:
inc ECX
inc EBX
jmp next
not found:
xor ECX,
jmp quit
charpos endp
end

Наша процедура в качестве параметров принимает адрес строки p s i и символ c i , который мы ищем. Процедура возвращает номер позиции в строке, где впервые встречается этот элемент. Первый элемент строки имеет номер позиции 1, поэтому счетчику позиции мы присваиваем начальное значение с помощью команды:
mov ЕСХ, 1

Адрес строки мы помещаем в регистр ЕВХ, а символ, который ищем — в регистр AL. Сравнение символа по адресу в регистре ЕВХ С искомым симво- лом в AL и возможные варианты продолжения выполняются следующими командами:
cmp AL, [ЕВХ]
je quit
cmp BYTE PTR [EBX], 0
jne inc_cnt
jmp not_found


 
 
 

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