Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2012, 09:48   #21
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

А Вы не учитываете тот факт, что сканировать с конца будет ОБЕ строки, что Вам не нужно по условию задачи?
Здесь либо самому организовывать цикл проверки, либо инвертировать исходное слово заранее. В первом случае может возникнуть вариант с ложным срабатыванием, если при нахождении первого символа в первом цикле проверенная часть будет меньше искомой. например:
исходное слово: "Привет, как дела?"
искомое слово: "Почему"
т.е. будет найден первый символ "П" и потом начнётся поиск по исходному слову в обратном направлении. так что либо проверку делать, либо надеяться, что при таком раскладе программа не уложит ось системной ошибкой...
я бы воспользовался вторым вариантом: искать "умечоП" намного проще
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 09.06.2012, 10:12   #22
.:DEZ:.
Пользователь
 
Регистрация: 03.06.2012
Сообщений: 28
По умолчанию

Хм) второй вариант действительно проще, но тогда как искомую строку перевернуть?)

дописал прогу, но она не правильно выдаёт результат
Например первая строка "123", а вторая вообще "jе" и выдаёт результат "Found"(найдено). где ошибка?

Код:
.model small
.stack 100h
.486
.data

s1 db 10,13,'Enter first string: ', '$'
s2 db 10,13,'Enter second string: ', '$'
s3 db 10,13,'found: $'
s4 db 10,13,'not found: $'

str1 db 100 dup (?)
len1 dw 100
str2 db 20  dup (?)
len2 dw 20

.code
start:
mov ax, @data
mov ds,ax

;вывод первой строки
mov dx,offset s1
mov ah,09h
int 21h
;ввод первой
mov ah, 3fh
mov bx, 0
mov cx, 128
mov dx, offset str1
int 21h

;вывод второй строки
mov dx,offset s2
mov ah,09h
int 21h

;ввод второй
mov ah, 3fh
mov bx, 0
mov cx, 128
mov dx, offset str2
int 21h
        

Push ds
pop es
; длина исходной строки

mov si, offset str1
mov cx,100
mov al, '$'
repne scasb
sub len1, cx
; длина строки для поиска

mov si, offset str2
mov cx,20
mov al, '$'
repne scasb
sub len2, cx
; поиск вхождения
mov si, offset str1
mov al, byte ptr [str2]
mov cx, len1
lp:
repne scasb
jz exit_no

push cx
push si
mov cx, len2
mov di, offset str2
repne cmpsb
jz exit_yes

pop si
pop cx
jmp lp
exit_no:
;.... ' выводим "нет"
    mov ah,09h
    lea dx,s4
    int 21h 
    jmp exit 

exit_yes:
pop ax
pop ax
;.... 'выводим "да"
mov ah,09h
    lea dx,s3
    int 21h 
    jmp exit 
exit:
Mov ah,0
int 16h
mov  ax, 4ch
 int  21h
end start
DiemonStar, на тебя вся надежда((

Мне кажется что то не так с поиском вхождения( как исправить?


Последний раз редактировалось Stilet; 10.06.2012 в 10:11.
.:DEZ:. вне форума Ответить с цитированием
Старый 10.06.2012, 11:41   #23
.:DEZ:.
Пользователь
 
Регистрация: 03.06.2012
Сообщений: 28
Вопрос

ПОМОГИТЕ
.:DEZ:. вне форума Ответить с цитированием
Старый 11.06.2012, 12:55   #24
.:DEZ:.
Пользователь
 
Регистрация: 03.06.2012
Сообщений: 28
Лампочка

переделал, всё правильно работает, помогите прокомментировать пожалуйста


Код:
.model small
.stack 100h
.data
msg1    db 'Enter first string:$'
msg2    db 'Enter second string:$'
msg_y db 'Found$'
msg_n db 'Not found$'
string1 db 80 dup(?)
string2 db 80 dup(?)
.code
msg macro m
    mov ah,9
    lea dx,m
    int 21h
    endm
inpt macro ofst
    push bx
    mov ah,3fh
    xor bx,bx
    mov cx,80
    lea dx,ofst
    int 21h
    pop bx
    endm
start:
    mov ax,@data
    mov ds,ax
    mov es,ax
 
    msg msg1
    inpt string1
    mov bx,ax   
    lea di,string1-3
    add di,ax       
    msg msg2
    inpt string2
    lea si,string2
    mov cx,ax   
    sub cx,2
@loop:
    push cx
    mov cx,bx
    cld
    lodsb
    std
    repne scasb
    jnz @no_found
    pop cx
    loop @loop
    msg msg_y
    jmp @exit
@no_found:
    msg msg_n
@exit:
    mov ax,4c00h
    int 21h
end start
.:DEZ:. вне форума Ответить с цитированием
Старый 11.06.2012, 18:57   #25
.:DEZ:.
Пользователь
 
Регистрация: 03.06.2012
Сообщений: 28
По умолчанию

.:DEZ:. вне форума Ответить с цитированием
Старый 11.06.2012, 22:49   #26
Ant1971on
Пользователь
 
Регистрация: 20.07.2010
Сообщений: 52
По умолчанию

Знакомая програмка
Пока писал комменты, обнаружил некоторые недочеты. Подправил.
Код:
.model small
.stack 100h
.data
msg1    db 'Enter first string:$'
msg2    db 'Enter second string:$'
msg_y db 'Found$'
msg_n db 'Not found$'
string1 db 80 dup(?)
string2 db 80 dup(?)
.code
msg macro m		;Макрос вывода строки на экран.
    mov ah,9
    lea dx,m
    int 21h
    endm
inpt macro ofst	;Макрос ввода строки.
    push bx
    mov ah,3fh		;Обращаемся к клавиатуре, как к файлу
    xor bx,bx		;с дескриптором 0.
    mov cx,80		;Размер буфера для ввода строки
    lea dx,ofst		;и его адрес.
    int 21h
    pop bx
    endm
start:
    mov ax,@data	;Настройка сегментных регистров
    mov ds,ax		;на данные прогрммы.
    mov es,ax		;es тоже нужно настроить для scasb
 
    msg msg1
    inpt string1
    mov bx,ax  		 
    sub bx,2		;В bx число символов в string1 без двух(0dh и 0ah не нужны).
    lea di,string1	
    add di,bx       	
    dec di		;di -> на последний символ.	
    msg msg2
    inpt string2
    lea si,string2
    mov cx,ax   		
    sub cx,2		;В cx число символов string2.	
@loop:
    push cx		;Запомним его.
    mov cx,bx		;В cx число непроверенных символов string1.
    or cx,cx		;string1 проверена, но в string2 остались символы?
    jz @no_found	;Да, вывод "No found".		
    cld			;Прямая обработка строки(для lodsb).
    lodsb		;Берем символ из string2(символ -> в al).
    std			;Обратная обработка строки(для scasb).
    repne scasb	;Ищем символ из string2 (лежит в al) в string1.
    jnz @no_found	;Символ не найден -> на вывод сообщения "No found".
    mov bx,cx		;Нашли, число непроверенных символов в string1 сохраним в bx.
     pop cx		;В cx число оставшихся символов string2.
    loop @loop		;cx = cx - 1, прыжок на @loop, если cx != 0.
    msg msg_y		
    jmp @exit
@no_found:
    msg msg_n
@exit:
    mov ax,4c00h
    int 21h
end start
Ant1971on вне форума Ответить с цитированием
Старый 12.06.2012, 15:56   #27
.:DEZ:.
Пользователь
 
Регистрация: 03.06.2012
Сообщений: 28
Подмигивание

Точно знакомая Благодарю очень выручили
.:DEZ:. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод из паскаля на СИ Кот Шрёдингера Помощь студентам 0 02.11.2011 20:07
Перевод с Паскаля на С++.... Solnze2 Помощь студентам 0 20.05.2011 23:13
перевод из паскаля в с++ dANIL282 Помощь студентам 2 21.01.2011 00:05
Перевод с Паскаля на С RamilFaz Общие вопросы C/C++ 3 08.04.2010 14:40
Из паскаля в ассемблер Archiserafim Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 16 03.09.2009 22:02