Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 13.04.2010
Сообщений: 32
TASM

Резидент, который устанавливает пароль на каталог, указанный в командной строке

16.11.2010, 21:25. Показов 1935. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Плиз, помогите разобраться с прогой: нужно составить резидентную прогу, которая устанавливает на каталог, указанный в командной строке, пароль, вводимый пользователем при запуске проги. После этого программа запрашивает пароль при любой попытке пользователя попасть в этот каталог. Написал вот такой кусок, но прога вылетает сразу после установки пароля:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
.286
cseg segment
assume cs:cseg, ds:cseg, ss:cseg, es:cseg
 
org 100h
 
Begin:
 
        jmp Init        ;На метку инициализации
    
; === Процедура обработки 21h прерывания ===
Int_21h_proc proc
....................................................
...................................................ЗДЕСЬ идет проверка нужного прерывания и пароля, но до сюда выполнение не доходит:(
 
 
dir db 64 dup(0)
curdir db 64 dup(0)
pas db 5 dup(' ')
entpas db 5 dup(' ')
paswin db 'Enter password (5 symbols)$' 
Int_21h_vect dd ?   ;Переменная для хранения адреса 21h 
 
Int_21h_proc endp
 
 
; ===============================================================
; Инициализация (подготовка и настройка резидента)
Init:
       mov ax,9889h ;Проверим, в памяти ли мы уже или еще нет
       int 21h      ;9889h - наш позывной
       cmp ax,8998h ;Отозвался обработчик (AH/AL должны поменяться местами)?
       jne Set_resident
 
       mov ah,9     ;Если в памяти, то выведем соответствующее сообщение
       mov dx,offset In_memory
       int 21h
 
       ret      ;...И вернемся в DOS
 
Set_resident: ;Если нас в памяти нет, то установим резидент
    
    push  cs
    pop   ds 
    push cs
    pop es
    ;записываем путь к защищенному каталогу в переменную
    mov di,81h
    mov al," "
    mov cx,64
    repe scasb
    dec di
    push di
    pop si
    mov cl,ds:[80h]
    dec cl
    lea di,dir
    rep movsb 
 
 
    ;сохраняем пароль для входа в каталог
    ;mov dx,offset paswin       ;Выводим сообщение для ввода пароля
    ;mov ah,09h
    ;int 21h
    mov     di,offset pas       ;Устанавливаем указатель на строку         
    xor cx,cx
Ent_pas:
 
    mov     ah,08h              ;Ждем нажатия клавиши
    int 21h
    cmp     al,13           ;Если нажата Enter, то выйти из цикла
    jz Next
    cmp cx,5              
    jge ent_pas
    mov     [di],al         ;Помещаем нажатую клавишу в буфер
    inc     di          ;Увеличиваем адрес
    inc  cx                      ;Увеличиваем счетчик
    mov     ah,02h
    mov dl,"*"
    int 21h             ;Выводим звездочку              
       jmp  Ent_pas         ;На начало цикла
Next:
 
 
       mov ax,3521h
       int 21h      ;Получим и сохраним адрес (вектор) 21h прерывания
       mov word ptr Int_21h_vect,bx ;Вначале младшее слово (смещение)...
       mov word ptr Int_21h_vect+2,es   ;Затем старшее (сегмент)
 
       mov ax,2521h
       mov dx,offset Int_21h_proc
       int 21h      ;"Повесим" нашу процедуру на 21h прерывание
 
 
       mov dx,offset Init
       int 27h      ;Оставим программу резидентной в памяти.
In_memory db 'Программа уже загружена в память!!!!',0Ah,0Dh,0Ah
 
cseg ends
end Begin
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.11.2010, 21:25
Ответы с готовыми решениями:

Разработать командный файл, создающий, копирующий или удаляющий каталог, указанный в командной строке
Доброго времени суток! Подскажите пожалуйста, есть задание: Разработать командный файл, создающий, копирующий или удаляющий каталог,...

Скрипт, который записывает в указанный файл все параметры командной строки
Может кто помочь с задачей, заранее спасибо! Скрипт, который записывает в указанный файл все параметры командной строки.

Скрипт, который записывает в указанный файл все параметры командной строки
Помогите с задачей Скрипт, который записывает в указанный файл все параметры командной строки.

7
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
16.11.2010, 21:47
Можно поинтересоваться, как вы определили, что выполнение не доходит до нового обработчика ?
0
1 / 1 / 0
Регистрация: 13.04.2010
Сообщений: 32
17.11.2010, 19:38  [ТС]
Цитата Сообщение от Goodwin98 Посмотреть сообщение
Можно поинтересоваться, как вы определили, что выполнение не доходит до нового обработчика ?
Запустил прогу через td.exe и пошагово выполнил...
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
17.11.2010, 19:51
Цитата Сообщение от l123 Посмотреть сообщение
Запустил прогу через td.exe и пошагово выполнил...
А при пошаговом выполнении вы туда никак не попадете. Лучше выложите полный код, ибо в этом куске все в порядке... Ну если, конечно не считать полное отсутствие проверок на неправильный ввод.
0
1 / 1 / 0
Регистрация: 13.04.2010
Сообщений: 32
19.11.2010, 20:18  [ТС]
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
.286
cseg segment
assume cs:cseg, ds:cseg, ss:cseg, es:cseg
 
org 100h
 
Begin:
 
        jmp Init        ;На метку инициализации
    
; === Процедура обработки 21h прерывания ===
Int_21h_proc proc
       ;cmp ax,9889h    ;Проверка на повторную загрузку в память 
       ;jne Check_funcs
 
       ;xchg ah,al  ;Если это наш "позывной", то даем ответ, меняя местами
       ;iret        ;AH/AL и немедленно выходим из 21h...
 
Check_funcs:
 
       cmp ah,3Bh   ;Это функция 3Bh  (перехода в определенный каталог)?
       jne Go_21h   ;Если нет, то передаем управление ориг.обработчику 21h
       pusha
       push ds
       push es  
    
    push dx
    dec dx
Findz:
 
    inc dx
    mov di,dx 
    mov al,byte ptr ds:[di]
    cmp al,0
    jne Findz
    mov cx,dx
    pop dx
    sub cx,dx
    push cs
    pop es
    lea di,curdir
    mov si,dx
    rep movsb
 
    lea di,dir
    lea si,curdir           ; Получаем текущий каталог
 
    mov cx, 64
    cld 
    repe cmpsb                    ;Сравниваем две строки-пути к текущему и запрещенному каталогу
    jne  Go_21h                  
 
    mov dx,offset paswin    ;Если текущий каталог-нужный, то выводим приглашение на ввод пароля 
    mov ah,09h
    int 21h
    mov di,offset entpas         
    xor cx,cx
ent:
 
    mov ah,08h              ;Ждем нажатия клавиши
    int 21h
    cmp al,13           ;Если нажата Enter, то проверить введенный пароль
    jz prov
    cmp cx,5              
    jge ent
    mov [di],al         ;Помещаем нажатую клавишу в буфер
    inc di          ;Увеличиваем адрес
    inc  cx                      ;Увеличиваем счетчик
    mov ah,02h
    mov dl,"*"
    int 21h             ;Выводим звездочку              
    jmp ent         ;На начало цикла
prov:
 
    push ds
    pop es
    lea di,entpas
    lea si,pas
    mov cx,5
    cld 
    repe cmpsb                    ;Сравниваем две строки
    je  Do_not                  
              
 
Go_21h:
       jmp dword ptr cs:[Int_21h_vect]  ;Иначе - передаем управление
                    ;оригинальному обработчику 21h
                    ;Больше в нашу процедуру мы не вернемся
                    ;(в отличие от CALL'а )!
 
 
;Обрабатываем функции 3Bh
Do_not:
            ;Теперь флагов в стеке нет!!!
       pop es
       pop ds
       popa
 
       pushf        ;Сохраним флаги в стеке (так надо!)
       call dword ptr cs:[Int_21h_vect] ;Вызовем оригинальный обработчик 21h
            ;21h отработало. Вернулись сюда (в отличие от JMP'а ).
       iret ;Выйдем из прерывания, не вытаскивая из стека флаги (так надо!)
dir db 64 dup(0)
curdir db 64 dup(0)
pas db 5 dup(' ')
entpas db 5 dup(' ')
paswin db 'Enter password (5 symbols)$' 
Int_21h_vect dd ?   ;Переменная для хранения адреса 21h 
 
Int_21h_proc endp
 
 
; ===============================================================
; Инициализация (подготовка и настройка резидента)
Init:
       mov ax,9889h ;Проверим, в памяти ли мы уже или еще нет
       int 21h      ;9889h - наш позывной
       cmp ax,8998h ;Отозвался обработчик (AH/AL должны поменяться местами)?
       jne Set_resident
 
       mov ah,09h       ;Если в памяти, то выведем соответствующее сообщение
       mov dx,offset In_memory
       int 21h
 
       ret      ;...И вернемся в DOS
 
Set_resident: ;Если нас в памяти нет, то установим резидент
    
    push  cs
    pop   ds 
    push cs
    pop es
    ;записываем путь к защищенному каталогу в переменную
    mov di,81h
    mov al," "
    mov cx,64
    repe scasb
    dec di
    push di
    pop si
    mov cl,ds:[80h]
    dec cl
    lea di,dir
    rep movsb 
 
 
    ;сохраняем пароль для входа в каталог
    mov dx,offset paswin        ;Выводим сообщение для ввода пароля
    mov ah,09h
    int 21h
    mov     di,offset pas       ;Устанавливаем указатель на строку         
    xor cx,cx
Ent_pas:
 
    mov     ah,08h              ;Ждем нажатия клавиши
    int 21h
    cmp     al,13           ;Если нажата Enter, то выйти из цикла
    jz Next
    cmp cx,5              
    jge ent_pas
    mov     [di],al         ;Помещаем нажатую клавишу в буфер
    inc     di          ;Увеличиваем адрес
    inc  cx                      ;Увеличиваем счетчик
    mov     ah,02h
    mov dl,"*"
    int 21h             ;Выводим звездочку              
       jmp  Ent_pas         ;На начало цикла
Next:
 
 
       mov ax,3521h
       int 21h      ;Получим и сохраним адрес (вектор) 21h прерывания
       mov word ptr Int_21h_vect,bx ;Вначале младшее слово (смещение)...
       mov word ptr Int_21h_vect+2,es   ;Затем старшее (сегмент)
 
       mov ax,2521h
       mov dx,offset Int_21h_proc
       int 21h      ;"Повесим" нашу процедуру на 21h прерывание
 
 
       mov dx,offset Init
       int 27h      ;Оставим программу резидентной в памяти.
In_memory db 'Программа уже загружена в память!!!!',0Ah,0Dh,0Ah
 
cseg ends
end Begin
Добавлено через 6 часов 45 минут
Народ, помогите плиз!
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
19.11.2010, 20:44
Поменяйте лучше
Assembler
1
2
3
4
       pushf            ;Сохраним флаги в стеке (так надо!)
       call dword ptr cs:[Int_21h_vect] ;Вызовем оригинальный обработчик 21h
                        ;21h отработало. Вернулись сюда (в отличие от JMP'а ).
       iret     ;Выйдем из прерывания, не вытаскивая из стека флаги (так надо!)
на
Assembler
1
2
3
4
       jmp dword ptr cs:[Int_21h_vect]  ;Иначе - передаем управление
                                        ;оригинальному обработчику 21h
                                        ;Больше в нашу процедуру мы не вернемся
                                        ;(в отличие от CALL'а )
1
1 / 1 / 0
Регистрация: 13.04.2010
Сообщений: 32
19.11.2010, 21:04  [ТС]
Изменил...но все равно вылетает. Может я неправильно преобразую путь к каталогу, который возвращает 3BH? Или неправильно сравниваю строки?
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
19.11.2010, 21:20
Цитата Сообщение от l123 Посмотреть сообщение
Изменил...но все равно вылетает.
Странно. У меня больше нет.

Цитата Сообщение от l123 Посмотреть сообщение
Может я неправильно преобразую путь к каталогу, который возвращает 3BH? Или неправильно сравниваю строки?
ну это да. Просто я не думал, что раз вы знаете что принимает программа, то будете запускать ее без параметров или вводить слишком длинный пароль....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.11.2010, 21:20
Помогаю со студенческими работами здесь

Скрипт, который записывает в указанный файл все параметры командной строки
Может кто помочь с задачей, заранее спасибо! Скрипт, который записывает в указанный файл все параметры командной строки.

Разработать программу создающую, копирующую или удаляющую файл, указанный в командной строке
Разработать программу создающую, копирующую или удаляющую файл, указанный в командной строке, в зависимости от выбранного ключа...

Резидент, который по нажатию комбинации клавиш создает файл, в который записывается изображение на экране
Создать резидентный обработчик прерывания, который по нажатию комбинации клавиш (любой) создает файл, в который записывается изображение на...

Чтение данных из файла, который указан в командной строке
Здравствуйте. В учебнике Саммерфильда "Программирование на Python. Подробное руководство" встретил такую ситуацию: Программа...

"Из заданного в командной строке каталога распаковать все файлы с расширением .7z в каталог..."
я не знаю куда обратиться. вот задание с bat файлом: из заданного в командной строке каталога распаковать все файлы с расширением 7z в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru