IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

> Обработка символьной информации, с помощью функций DOS
Rocket
сообщение 5.10.2008 0:11
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Вот задание: Ввести с клавиатуры две строки. Сравнить их. Вывести на экран какая из строк больше и насколько. Какие мысли есть по реализации данной программы? Как осуществить сравнение строк?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Rocket
сообщение 10.12.2008 23:20
Сообщение #2


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Вот последняя вариация программы:

data segment
entrStr db 13, 10, 'string:$'
entrSStr db 13, 10, 'substring:$'
sNotFound db 13, 10, 'substring was not found$'
sResult db 13, 10, 'pos = $'

inpStr db 100
inpStrLen db ?
inpStrDat db 100 dup(?)

inpSStr db 100
inpSStrLen db ?
inpSStrDat db 100 dup(?)

count_of_digits dw 2
data ends


code segment
assume cs:code, ds:data

writeDEC proc

push ax
push bx
push cx
push dx

xor cx, cx
mov bx, 10

next_digit:
xor dx, dx
div bx
push dx
inc cx
or ax, ax
jnz next_digit

next_char:
pop ax
add al, '0'
int 29h
loop next_char

pop dx
pop cx
pop bx
pop ax
ret

writeDEC endp


findSStr proc

; Ищем первый символ подстроки
FindFirstCh:
mov al, [di] ;
inc di
cmp al, [si]
jz beginCompare ; Нашли

nextCompare:
loop FindFirstCh
xor ax, ax ; не найдено, вернем 0

; Если цикл FindFirstCh закончился - значит подстроки нет
jmp exit_proc

beginCompare:
; Проверяем следующие за первым в подстроке символы
push cx
push si
push di
dec di
mov cl, inpSStrLen

; Проверка
yesCompare:
mov al, [di]
inc di
cmp al, [si]
;не совпало переход
jnz noCompare ; Очередной символ не совпал
inc si
loop yesCompare

; Если здесь - значит все совпало
jmp found

; Не совпало - восстанавливаем данные и ищем дальше
; первый символ подстроки в строке
noCompare:
pop di
pop si
pop cx
jmp short nextCompare

found:
; вытягиваем из стека адрес первого символа
pop di

; и вычисляем его позицию
mov dx, offset inpStrDat
mov ax, di
sub ax, dx

pop si
pop cx

exit_proc:
ret

findSStr endp


start:
mov ax,data
mov ds, ax


; вводим строку
mov ah, 09h
lea dx, entrStr
int 21h
mov ah, 0ah
lea dx, inpStr
int 21h

; записываем '$' в конец строки
lea di, inpStrDat
xor ch, ch
mov cl, inpStrLen
add di, cx
mov byte ptr[di], '$'

; вводим подстроку
mov ah, 09h
lea dx, entrSStr
int 21h
mov ah, 0ah
lea dx, inpSStr
int 21h

; Подготовка
xor cx, cx
mov di, offset inpStrDat
mov si, offset inpSStrDat
mov cl, inpStrLen

call findSStr

test ax, 0
jnz not_found

; Есть совпадение, выводим сообщение
push ax
mov ah, 09h
mov dx, offset sResult
int 21h
pop ax
call writeDEC
jmp exit_prog

not_found:
mov ah, 09h
mov dx, offset sNotFound
int 21h

exit_prog:
mov ax, 4c00h
int 21h
code ends
end start


и в ней присутствует косяк... Вобщем, когда подстроки нет в строке, то программа всё равно выводит сообщение с номером позиции...выводит 0. Мне кажется, что не происходит вот это:

xor ax, ax; не найдено, вернем 0
; Если цикл FindFirstCh закончился - значит подстроки нет
jmp exit_proc




 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Rocket   Обработка символьной информации   5.10.2008 0:11
мисс_граффити   Что значит "строка больше"? По длине?   6.10.2008 19:22
Rocket   Что значит "строка больше"? По длине? ...   6.10.2008 20:28
Lapp   Та по длине походу... сравнивать количество символ...   6.10.2008 23:02
Rocket   При чем тут загадка? Не понимаю. Если по длине,...   6.10.2008 23:23
Lapp   В ассемблере есть функция length(s)?...в мои позн...   6.10.2008 23:29
мисс_граффити   Ввод строк сделал? Проблемы только с определением ...   7.10.2008 14:37
Rocket   Ввод строк сделал? Проблемы только с определением...   7.10.2008 17:09
мисс_граффити   Ну например... .model small .stack 512 .data buf1 ...   7.10.2008 20:26
Rocket   Ну например... всё отлично, большое спасибо) вот т...   8.10.2008 23:38
мисс_граффити   У меня работает все. Да ты по сути ничего в этой с...   8.10.2008 23:54
Rocket   У меня работает все. Да ты по сути ничего в этой ...   9.10.2008 23:21
volvo   Rocket, Чем компилируешь, если не секрет? Приведе...   9.10.2008 23:43
Rocket   Rocket, Чем компилируешь, если не секрет? Привед...   10.10.2008 21:31
volvo   А может, ты его просто не видишь? :wink: Alt+F5 н...   10.10.2008 21:51
Rocket   А может, ты его просто не видишь? :wink: Alt+F5 ...   10.10.2008 22:01
Rocket   Всё-таки как организовать вывод сообщеия о том нас...   13.11.2008 1:20
volvo   Ну, и кто тебе сказал, что lea dx, X преобразует т...   13.11.2008 2:18
Rocket   А если у нас не 10 символом максимальный размер, а...   27.11.2008 22:31
volvo   Значит, придется написать процедуру вывода десятич...   27.11.2008 23:12
Rocket   Значит, придется написать процедуру вывода десятич...   28.11.2008 0:02
volvo   Комментарии добавлены в предыдущее сообщение...   28.11.2008 1:10
Rocket   Комментарии добавлены в предыдущее сообщение... ...   4.12.2008 23:25
volvo   Вот тебе программа, которая это делает... В виде п...   7.12.2008 12:24
Rocket   Вот тебе программа, которая это делает... У меня ...   9.12.2008 0:36
volvo   1) Использование "offset". Я так полага...   9.12.2008 1:08
Rocket   Всё стало на свои места! Спасибо:) Так, вот ещ...   10.12.2008 0:24
volvo   1) процедура show_ax для чего предназначена? мы в...   10.12.2008 0:46
Rocket   Да, скорее всего надо в процедуре получать через ...   10.12.2008 12:42
volvo   А я переделал вот так: findSStr proc ; Ищем первы...   10.12.2008 13:09
Rocket   Вот последняя вариация программы: data segment en...   10.12.2008 23:20
volvo   Нет... Проблема не тут. Замени вот эти 2 строки: ...   10.12.2008 23:56
Rocket   Нет... Проблема не тут. Замени вот эти 2 строки: ...   11.12.2008 0:42
volvo   Ты просто забыл кое что (например, очистить AX пер...   11.12.2008 1:39
Rocket   Ты просто забыл кое что (например, очистить AX пер...   11.12.2008 22:40


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 3.07.2025 15:14
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"