Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хранитель экрана, вводится строка,затем экран очищается.. 
V
    Опции темы
bip
Дата 24.11.2008, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 15.3.2007

Репутация: нет
Всего: нет



Здравствуйте!
Прошу помочь с реализацией следующей задачки:
Хранитель экрана:
 с клавиатуры вводится строка,затем
 экран очищается,
 запрашивается пароль до тех пор,
 пока он не совпадет с строкой,
 которую ввели в начале.
 smile 
PM MAIL ICQ   Вверх
Diabolus
Дата 25.11.2008, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 12.6.2007

Репутация: нет
Всего: нет



А в чём проблема? Отслеживаешь нажатия клавиш, очищаешь экран (просто создаёшь чёрное окно без бордера и делаешь фулл скрин), опять отслеживаешь нажатия клавиш. Если нужно чтоб вводили пароль в окошко - создаёшь его и получаешь оттуда. С чем из этого проблемы?
PM MAIL   Вверх
ksili
Дата 25.11.2008, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Только это не хранитель экрана... а хранитель учётной записи  smile 


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
bip
Дата 25.11.2008, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 15.3.2007

Репутация: нет
Всего: нет



проблема в графическом режиме smile + не знаю как сравнивать введённое слово в начале с тем, что вводится после... 
Вот, кое что написал.. наброски. Прошу ваших комментарий и советов, по поводу данного кода.
Код

model small
.stack 80h
.data
STR1 db "Please input your password:",13,10,"$"
STR2 db "Please input password:",13,10,"$"
STR3 db "Succefull password:",13,10,"$"
BUFFER Dw 40,?, 40 dup(?);
BUFFER2 Dw 40,?, 40 dup(?);
.code
myprgm: mov ax,@data
    mov ds,ax
;-------------------------------
    MOV AH,9                      
    mov DX,offset STR1
    INT 21h
    MOV AH,0ah
    mov DX,offset BUFFER
    INT 21h
;------------------------------
xor ax,ax    
;Обнуляем регистр ax
int 10h       
;Вызов функции видеосервиса BIOS      
;------------------------------

not_equal:
    MOV AH,9                      
    mov DX,offset STR2
    INT 21h
    MOV AH,0ah
    mov DX,offset BUFFER2
    INT 21h    
;-----------------------------
    mov si,BUFFER        ; помещаем адрес строки str1 в esi
    mov di,BUFFER2        ; помещаем адрес строки str2 в edi
;------------------------------
compare:
   mov ah,byte [si]    ; берем символ из строки str1
    mov al,byte [di]    ; берем символ из строки str2
    cmp ah,al            ; сравниваем их
    jne not_equal        ; если не равны, прыгаем на метку not_equal
    test ah,al            ; мы дошли до конца строки (символ равен нулю)?
    jz equal            ; если дошли, значит строки одинаковы, прыгаем на метку equal
    inc si                ; увеличиваем si
    inc di                ; увеличиваем di
    jmp compare 
;------------------------------   
equal:   
MOV AH,9                      
    mov DX,offset STR3
    INT 21h
;------------------------------

    mov ax,4c00h
    int 21h
    end myprgm 


 smile 

Это сообщение отредактировал(а) bip - 26.11.2008, 00:42
PM MAIL ICQ   Вверх
Mikl_
Дата 26.11.2008, 07:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 6
Всего: 14



bip, специально для похожих функций (сравнение строк) в ассемблере существует команда CMPS
Код
mov si,offset BUFFER; строка с паролем
mov di,offset BUFFER1; здесь введенные символы
mov cx,10; длина пароля
repe cmpsb; сравниваем символы пока не конец строки или несовпадение
jnz a1
. . . ; здесь действия если пароль верный
a1:  . . . ; здесь действия если пароль неверный

PM MAIL   Вверх
bip
Дата 26.11.2008, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 15.3.2007

Репутация: нет
Всего: нет



Mikl, что-то не проходит такое сравнение. Я ведь задаю и "символы" и пароль с консоли. 
и у меня постоянно выводится, что пароль не верен :(
Код

;-------------------------------
    MOV AH,9                      
    mov DX,offset STR1
    INT 21h
    MOV AH,0ah
    mov DX,offset BUFFER
    INT 21h
 
    MOV AH,9                      
    mov DX,offset STR2
    INT 21h
    MOV AH,0ah
    mov DX,offset BUFFER2
    INT 21h    
;-----------------------------
    mov si,offset BUFFER        ; помещаем адрес строки str1 в esi
    mov di,offset BUFFER2   

Такое сравнение проходит только, когда строки заранее заданы в сегменте данных...
Как поправить, чтобы заработало?

Это сообщение отредактировал(а) bip - 26.11.2008, 18:14
PM MAIL ICQ   Вверх
bip
Дата 27.11.2008, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 15.3.2007

Репутация: нет
Всего: нет



код из учебника: 
Код

Пример 2:

;В полях данных основного сегмента данных, 
;адресуемого через DS:
str1  db  11 dup (?)    ;1-я строка
str2  db  11 dup (?)    ;2-я строка

;В программном сегменте:
    cld        ;Сравнение вперед
    push DS        ;Передача содержимого DS
    pop  ES        ;в ES
    lea  SI, str1    ;DS:SI -> str1
    lea  DI, str2   ;ES:DI -> str2
    mov  CX, 11    ;Длина сравниваемых строк
    repne cmpsb    ;Поиск первой пары одинаковых элементов
    jne  notequ    ;Переход, если таковой нет

тоже не пашет: 
Код

model small
.stack 80h
.data
STR1 db "Please",13,10,"$",0
STR2 db "Please",13,10,"$",0
STR3 db "Wrong!",13,10,"$",0
STR4 db "Good!",13,10,"$",0


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

cld
mov si,offset str1; строка с паролем
mov di,offset str2; здесь введенные символы
mov cx,6; длина пароля
repne cmpsb; сравниваем символы пока не конец строки или несовпадение
jne a1
; здесь действия если пароль верный
; здесь действия если пароль неверный         ;Переход, если строки
xor ax,ax    
;Обнуляем регистр ax
int 10h      
INT 21h
MOV AH,9                      
LEA DX,STR4
mov ax,10h
int 16h
;Вызов функции видеосервиса BIOS       
    
a1:            ;Продолжение, если строки            ;не совпадают
MOV AH,9                      
LEA DX,STR3
INT 21h 
mov ax,10h
int 16h
    mov ax,4c00h
    int 21h

    end myprgm 

Почему, кто-нибудь объяснить может?  
PM MAIL ICQ   Вверх
Mikl_
Дата 27.11.2008, 05:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 6
Всего: 14



bip, префикс перед cmps в твоем случае должен быть repe а не repne как ты написал -- это две диаметрально пртивоположные вещи. Во вторых, к сравнению пароля приступай тогда, когда пользователь нажмет клавишу Enter
PM MAIL   Вверх
bip
Дата 27.11.2008, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 15.3.2007

Репутация: нет
Всего: нет



Mikl,ты прав. но суть особо не меняется. Просто в одном случае мы ищем одинаковую пару и переходим на метку, если такой нет. В другом случае ищем первую пару различных символов и переходим на метку если строки совпали.Ведь так?
Код

repne cmpsb    ;Поиск первой пары одинаковых элементов
jne  notequ
repe cmps ES:str1, ES:str2    ;Поиск различия в строках.
je  equal

Кстати уже работает с заранее заданными строками, осталось разобраться с проверкой строк которые вводятся с консоли...  smile 
PM MAIL ICQ   Вверх
bip
Дата 27.11.2008, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 15.3.2007

Репутация: нет
Всего: нет



Заработало! Всем спасибо! smile 
Код

model small
.stack 80h
.data
STR1 db "Please input your password:",13,10,"$"
STR2 db "Please Reinput password:",13,10,"$"
STR3 db "Wrong!",13,10,"$",0
STR4 db "Good!",13,10,"$",0
BUFFER1 db 10 dup(?);
BUFFER2 db 10 dup(?);
.code
    myprgm: 
    mov ax,@data
    mov ds,ax
;-------------------------------
    MOV AH,9                      
    mov DX,offset STR1
    INT 21h
    MOV AH,0ah
    mov DX,offset BUFFER1
    INT 21h
    xor ax,ax    
    ;Обнуляем регистр ax
    int 10h       
    ;Вызов функции видеосервиса BIOS 
    reinput:     
    xor ax,ax    
    ;Обнуляем регистр ax
    int 10h       
    ;Вызов функции видеосервиса BIOS 
    MOV AH,9                      
    mov DX,offset STR2
    INT 21h
    MOV AH,0ah
    mov DX,offset BUFFER2
    INT 21h    
;----------------------------------
    cld
    push DS        ;Передача содержимого DS
    pop  ES        ;в ES
    lea si,BUFFER1; строка с паролем
    lea di,BUFFER2; здесь введенные символы
    mov cx,10; длина пароля
    repne cmpsw; сравниваем символы пока не конец строки или несовпадение
    jne reinput
;---------------------------------        
    MOV AH,9                      
    LEA DX,STR4
    INT 21h 
    mov ax,10h
    int 16h
    mov ax,4c00h
    int 21h    
    end myprgm

PM MAIL ICQ   Вверх
dumb
Дата 28.11.2008, 05:27 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 4
Всего: 158



Цитата(bip @  27.11.2008,  22:39 Найти цитируемый пост)
BUFFER1 db 10 dup(?);
...
    MOV AH,0ah
    mov DX,offset BUFFER1
    INT 21h
...
    mov cx,10; длина пароля
    repne cmpsw; сравниваем символы пока не конец строки или несовпадение

это нерабочий код.

bip, может таки воспользуешься отладчиком? или ты хочешь асм изучать "методом тыка"?
PM MAIL   Вверх
Mikl_
Дата 28.11.2008, 06:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 6
Всего: 14



Цитата(bip)
Просто в одном случае мы ищем одинаковую пару и переходим на метку, если такой нет. В другом случае ищем первую пару различных символов и переходим на метку если строки совпали
C точки зрения безопасности проверка пары символов и извещение злоумышленника, что пароль не верен -- позволяет ему подобрать сперва первый символ, затем второй и т.д. пока не получишь сообщение "Good!". Если у вас стандартная 102 клавишная клавиатура (для простоты не будем учитывать большие и малые буквы и смену раскладки клавиатуры) -- то пароль из 3-ех символов вы подберете за 3*102=306 попыток  smile , если вы будете сравнивать пароль только, когда он введен полностью и пользователь нажал Enter, тогда поиск 3-ех символьного пароля займет у него 102³=1061208 попыток, а на это уйдет в 3468 больше времени! smile Кроме того, начало сравнения пароля только после нажатия на Enter дает дополнительные удобства для пользователя -- вставка, удаление, изменение символов в строке пароля (Backspase, delete, ←, →, Esc) до нажатия на Enter

Это сообщение отредактировал(а) Mikl_ - 28.11.2008, 10:39
PM MAIL   Вверх
bip
Дата 28.11.2008, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 15.3.2007

Репутация: нет
Всего: нет



Цитата(dumb @ 28.11.2008,  05:27)
Цитата(bip @  27.11.2008,  22:39 Найти цитируемый пост)
BUFFER1 db 10 dup(?);
...
    MOV AH,0ah
    mov DX,offset BUFFER1
    INT 21h
...
    mov cx,10; длина пароля
    repne cmpsw; сравниваем символы пока не конец строки или несовпадение

это нерабочий код.

bip, может таки воспользуешься отладчиком? или ты хочешь асм изучать "методом тыка"?

Да? Вы уверены?
У меня работает, пробовал и на чужом компьютере компилировать-тоже всё работает, следствие
 под дебагом я не смотрел.smile

Добавлено через 7 минут и 37 секунд
Цитата(Mikl_ @ 28.11.2008,  06:09)
Цитата(bip)
Просто в одном случае мы ищем одинаковую пару и переходим на метку, если такой нет. В другом случае ищем первую пару различных символов и переходим на метку если строки совпали
C точки зрения безопасности проверка пары символов и извещение злоумышленника, что пароль не верен -- позволяет ему подобрать сперва первый символ, затем второй и т.д. пока не получишь сообщение "Good!". Если у вас стандартная 102 клавишная клавиатура (для простоты не будем учитывать большие и малые буквы и смену раскладки клавиатуры) -- то пароль из 3-ех символов вы подберете за 3*102=306 попыток  smile , если вы будете сравнивать пароль только, когда он введен полностью и пользователь нажал Enter, тогда поиск 3-ех символьного пароля займет у него 102³=1061208 попыток, а на это уйдет в 3468 больше времени! smile Кроме того, начало сравнения пароля только после нажатия на Enter дает дополнительные удобства для пользователя -- вставка, удаление, изменение символов в строке пароля (Backspase, delete, ←, →, Esc) до нажатия на Enter

Ух ты! интересно!
Но ведь строка будет занесена в заранее определённую область сегмента данных(Buffer2)только по нажатию клавиши Enter т.е. покак её не нажали ничего не произойдёт соответственно... не с чем сравнивать.
PM MAIL ICQ   Вверх
bip
Дата 28.11.2008, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 15.3.2007

Репутация: нет
Всего: нет



dumb, вот конечный результат, под дебагом тоже всё как надо:
Код

model small
.stack 80h
.data
STR1 db "Please input your password:",13,10,"$"
STR2 db "Please Reinput password:",13,10,"$"
BUFFER1 db 10 dup(?);
BUFFER2 db 10 dup(?);
.code
    myprgm: 
    mov ax,@data
    mov ds,ax
;-------------------------------
    MOV AH,9                      
    mov DX,offset STR1
    INT 21h
    MOV AH,0ah
    mov DX,offset BUFFER1
    INT 21h
    reinput:     ; метка для повторного ввода
    xor ax,ax    
    int 10h       
    MOV AH,9                      
    mov DX,offset STR2
    INT 21h
    MOV AH,0ah
    mov DX,offset BUFFER2
    INT 21h    
;----------------------------------
    cld
    push DS        ;Передача содержимого DS
    pop  ES        ;в ES
    lea si,BUFFER1; строка с паролем
    lea di,BUFFER2; здесь введенные символы
    mov cx,10; длина пароля
    repne cmpsw; сравниваем по словам
    jne reinput
;---------------------------------        
    mov ax,4c00h
    int 21h    
    end myprgm

PM MAIL ICQ   Вверх
dumb
Дата 29.11.2008, 07:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 4
Всего: 158



bip, излишняя самоуверенность - плохой помощник в деле изучения чего-либо.

и тем не менее:
неправильное формирование буфера для функции ввода строки 0a/21 - результат: ограничитель длины инициализирован мусором, что ведет в частных случаях к пропуску ввода вообще(0), либо к переполнению буфера при вводе.
сравнение строк по словам, причем счетчик(cx) установлен на размер буфера в байтах(не говоря уже о том, что первые два байта надо пропускать) - результат: выход за границы буферов.
и о самом сравнении:
Цитата(bip @  27.11.2008,  21:13 Найти цитируемый пост)
но суть особо не меняется. Просто в одном случае мы ищем одинаковую пару и переходим на метку, если такой нет. В другом случае ищем первую пару различных символов и переходим на метку если строки совпали.
суть меняется, и тебе об этом уже сказали. с каких пор пароли считаются одинаковыми, если в них совпали пару символов в одинаковых позициях?!

"всё как надо"...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1252 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.