Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаба или что-то в этом духе

.txt
Скачиваний:
4
Добавлен:
20.05.2014
Размер:
4.89 Кб
Скачать
.386
.MODEL flat,C
EXTRN user_errno: SDWORD
PUBLIC ParseString
.CODE

;-----------------------------------------------------------;
; Процедура обработки строки ;
; ВХОД ;
; old_str - указатель на исходную строку ;
; new_str - указатель на место под новую строку ;
; first_br_pos - указатели на переменные в которые ;
; last_br_pos будут записаны позиции скобок ;
; ВЫХОД: ;
; EAX( возвращаемое значение ) - длина строки между ;
; внешними скобками ;
; Рабочие( используемые ) регистры: ;
; ECX - счётчик ;
; EDX - длина строки ;
; EDI - адрес исходной строки ;
; ESI - адрес новой (под)строки ; ;
; BL - позиция первой/последней скобки ( ( временно ) ;
; BH - позиция первой/последней скобки ) ( временно ) ;
;-----------------------------------------------------------;
ParseString PROC C old_str:DWORD, new_str:DWORD, \
first_br_pos:DWORD, last_br_pos:DWORD
LOCAL str_len ; Длина строки
LOCAL first_br ; Позиция первой скобки
LOCAL last_br ; Позиция последней скобки
cld ; Поиск в направлении возрастания адресов
; Определение длины строки
mov ecx, -1 ; В ECX - максимальное беззнаковое целое
mov edi, old_str ; В EDI - адрес строки
mov al, 0 ; В AL - терминатор строки
repne scasb ; Поиск конца строки
not ecx ; В ECX -
dec ecx ; длина строки
test ecx, ecx ; Если ECX = 0
jz err1 ; - на err1
mov str_len, ecx ; Сохраняем длину строки
; Поиск первых скобок
; Поиск первой скобки (
mov edi, old_str ; В EDI - адрес строки
mov al, '(' ; Символ для поиска
mov ecx, str_len ; Длина строки
repne scasb ; Ищем
jne err2 ; Если ZF=0, то символ ( не найден
mov bl, cl ; Сохраняем позицию найденного символа
; Поиск первой скобки )
mov edi, old_str ; Берём адрес строки
mov al, ')' ; Символ для поиска
mov ecx, str_len ; Длина строки
repne scasb ; Ищем
jne err3 ; Если ZF=0, т осимвол ) не найден
mov bh, cl ; Сохраняем позицию найденного символа
cmp bh, bl ; Сравниваем позиции первых скобок
jg err4 ; Если первая скобка ) то порядок скобок перепутан
mov ah, bl ; Сохраняем в AH позицию первой скобки
; Поиск последних скобок
std ; Теперь ищем с конца
; Поиск последней скобки (
mov edi, old_str ; Вычисляем
add edi, str_len ; указатель
dec edi ; на конец строки
mov al, '(' ; Символ для поиска
mov ecx, str_len ; Длина строки
repne scasb ; Ищем
jne err2 ; Если ZF=0, то символ ( не найден
mov bl, cl ; Сохраняем позицию найденного символа
; Поиск последней скобки )
mov edi, old_str ; Вычисляем
add edi, str_len ; указатель
dec edi ; на конец строки
mov al, ')' ; Символ для поиска
mov ecx, str_len ; Длина строки
repne scasb ; Ищем
jne err3 ; Если ZF=0, т осимвол ) не найден
mov bh, cl ; Сохраняем позицию найденного символа
cmp bh, bl ; Сравниваем позиции последних скобок
jl err4 ; Если последняя скобка ( то порядок скобок перепутан
; Подготовка к копированию
movzx eax, ah ; Расширяем до 32 бит
mov edx, str_len ; Вычисляем и сохраняем
sub edx, eax ; позицию
mov first_br, edx ; первой скобки
movzx eax, bh ; Расширяем до 32 бит
inc eax ; Вычисляем и сохраняем позицию
mov last_br, eax ; последней скобки
cld ; Копируем строку слева направо
; Копируем начало строки
mov ecx, first_br ; Берём длину первого куска
mov esi, old_str ; Откуда копировать
mov edi, new_str ; Куда копировать
rep movsb ; Копируем
; Копируем подстроку между скобками в обратном порядке
mov ecx, last_br ; Вычисляем
sub ecx, first_br ; длину подстроки
dec ecx ; между скобками
add edi, ecx ; Устанавливаем указатель
dec edi ; на конец подстроки
r_cpy:
lodsb ; Загружаем символ в AL
std ; Сохранять будем в обратном порядке
stosb ; Сохраняем
cld ; Меняем направление
loop r_cpy ; Повторяем для всей подстроки
; Копируем конец строки
mov ecx, str_len ; Вычисляем длину куска
sub ecx, last_br ; начиная с последней
inc ecx ; скобки
mov edi, new_str ; Вычисляем
add edi, last_br ; куда
dec edi ; копировать
rep movsb ; Копируем
; Закончили копировать
mov esi, first_br_pos ; Берём адрес переменной
mov eax, first_br ; Берём позицию первой скобки
mov [esi], eax ; Сохраняем
mov esi, last_br_pos ; Берём адрес переменной
mov eax, last_br ; Берём позицию последней скобки
mov [esi], eax ; Сохраняем в неё позицию последней скобки
mov eax, last_br ; Оставляем в EAX
sub eax, first_br ; размер
dec eax ; подстроки
ret

IRPC I,1234
err&I: mov user_errno, I
ret
ENDM

ParseString ENDP
END
Соседние файлы в предмете Статистика