Консультация № 180731
14.11.2010, 05:31
0.00 руб.
0 11 1
Добрый день уважаемые эксперты!
написал программу на Ассемблере, но что то не то выдает))
прошу помощи у вас!
код программы в приложении!
нужно выполнить вот такие действия:
Ввода пароля ( с помощью ф.0 int 16h, ф.3Fh,7,8 int 21h) и проверки его;
Организацовать управление программой с помошью управляющей клавиши, например F1.
Заранее огромное спасибо!


Приложение:
КОД:

Stacksg segment
dw 32 dup(?)
Stacksg ends

Datasg segment
password db 'dima'
string db 10 dup (?)
stra db 'vvedite parol: ', '$'

datasg ends

codesg segment
assume cs:codesg, ds:datasg, ss:stacksg
start:
mov ax, datasg
mov ds, ax
mov dx, offset stra
mov ah,9h
int 21h
mov bx, 0

pass:
mov ah, 08h
int 21h

cmp al, 13
je cmpa

mov string[bx], al
inc bx
jmp pass

cmpa: mov si,offset string
mov di,offset password
cld
mov cx, bx
repe cmpsb
jne error

good:
mov ah,2h
mov dl, 'P'
int 21h
jmp exit

error:
mov ah,2h
mov dl, 'N'
int 21h
exit:

codesg ends
end start

Обсуждение

Неизвестный
15.11.2010, 11:45
общий
это ответ
Здравствуйте, Андреев Дмитрий Фёдорович!

Ошибок несколько.
1. Нет выхода из программы, в связи с чем ваш вариант приводит к аварийному завершению при работе в Windows (и к непредсказуемым последствием в чистом DOS'е).
Для завершения программы нужно выполнить вызов функции 4ch прерывания 21h.

2. Команда cmps сравнивает 2 строки, расположенные по адресам: 1-я - DS:SI; 2-я - ES:DI.
Перед началом выполнения программы сегментные регистры DS и ES установлены на сегмент PSP. Регистр DS вы переустанавливаете, а вот ES - нет. Поэтому сравнение строк производится неправильно.

3. Ну и логическая ошибка, связанная с неучетом длины правильного пароля. В результате правильными в вашем варианте признавались любые пароли, которые содержали в начале сочетание символов 'dima' и пароли 'd', 'di' и 'dim'. Исправлено добавлением проверки на длину правильного пароля.

В Приложении - исправленный вариант.

Приложение:
Stacksg segment
dw 32 dup(?)
Stacksg ends

Datasg segment
password db 'dima'
password_len EQU $-password
string db 10 dup (?)
stra db 'vvedite parol: ', '$'

datasg ends

codesg segment
assume cs:codesg, ds:datasg, ss:stacksg
start:
mov ax, datasg
mov ds, ax
mov es, ax
mov dx, offset stra
mov ah, 9h
int 21h
mov bx, 0

pass:
mov ah, 08h
int 21h

cmp al, 13
je cmpa

mov string[bx], al
inc bx
jmp pass

cmpa: cmp bx, password_len
jne error
mov si,offset string
mov di,offset password
cld
mov cx, bx
repe cmpsb
jne error

good:
mov ah,2h
mov dl, 'P'
int 21h
jmp exit

error:
mov ah,2h
mov dl, 'N'
int 21h
exit:
mov ax, 4c00h
int 21h

codesg ends
end start
Неизвестный
15.11.2010, 12:07
общий
я пока что не на рабочей машине, просмотреть удастся тока вечером, можно поинтересоваться, а с помощью управляющей клавишей F1 программой можно управлять?
давно
Старший Модератор
31795
6196
15.11.2010, 14:45
общий
Цитата: 235545
а с помощью управляющей клавишей F1 программой можно управлять?

Нет нельзя.
Под словом управлять нужно определить конкретное действие.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
15.11.2010, 14:47
общий
действие - проверка пароля.
давно
Старший Модератор
31795
6196
15.11.2010, 15:05
общий
В ответе Юрия Леонидовича пароль проверяется сразу, как только Вы нажмете клавишу ENTER
Код:

;проверяем длину введенной строки
cmpa: cmp bx, password_len
jne error
;настраиваем регистры для сранения строковыми командами
mov si,offset string
mov di,offset password
cld
mov cx, bx
;само сравнение строк, т.е. проверка пароля
repe cmpsb
jne error
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
15.11.2010, 15:08
общий
а если без ввода пароля нажму Интер, не покажет что пароль верен?)
давно
Старший Модератор
31795
6196
15.11.2010, 15:20
общий
Цитата: 235545
а если без ввода пароля нажму Интер, не покажет что пароль верен?)

А Вы пробывали без ввода пароля нажать ENTER?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
15.11.2010, 15:41
общий
Цитата: Зенченко Константин Николаевич
А Вы пробывали без ввода пароля нажать ENTER?

да вроде все работает как надо)

тока тогда не пойму зачем в задании указано "Организацовать управление программой с помошью управляющей клавиши, например F1"
Неизвестный
16.11.2010, 13:55
общий
Цитата: 235545
тока тогда не пойму зачем в задании указано "Организацовать управление программой с помошью управляющей клавиши, например F1"


Ну это уж вам должно быть лучше известно, что под этим подразумевалось.
Я лично не могу ничего предположить по этому поводу - вот просто никак не получается никуда F1 засунуть...
Если только данный код не надо в виде резидента представить
давно
Старший Модератор
31795
6196
17.11.2010, 11:15
общий
Цитата: 235545
Организацовать управление программой с помошью управляющей клавиши, например F1

Вам нужно этот момент уточнить у преподавателя.
Понятие "управлять" может включать в себя: от завершения работы программы без проверки пароля, до форматирования диска и т.д.
Уточните тему, которую Вы проходите сейчас.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
17.11.2010, 15:35
общий
а можно сделать так что бы три раза можно было набирать пароль?
т.е. если три раза не на брал правильный пароль (после нажатия Интер) то после каждого ввода неправильного пароля выдовал ошибку? и тока после истечения определенного времени можно повторить попытку?
Форма ответа