Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
jen941
1 / 1 / 0
Регистрация: 19.12.2012
Сообщений: 69
1

Работа с прерываниями

25.04.2013, 22:38. Просмотров 729. Ответов 1
Метки нет (Все метки)

Здравствуйте.
Нужно реализовать шифрование AES, используя новые команды aesenc и aesdec, причем работа с файлами осуществляется через прерывания.

Для работы AESENC и AESDEC требуются регистры xmm0-7 и xmm8-14. Последние доступны только в режиме х86-х64.
А вот прерывание 21h наоборот, работает только под х16 (MS-DOS).

Можно ли совместить? Сделать вставку 16-кода в 32-битный или наоборот?

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
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
use16         ;Генерировать 16-битный код
org 100h
jmp start
; Данные
endline   db 13,10,'$'
decrypted rd 2000
 
resultat db 'Result: ',13,10,'$'
text_to_crypt db 'Text to crypt: ',13,10,'$'
key db 'Key: ',13,10,'$'
file_name_w db 'hello.txt', 0
buffer_w db 'Secret',13,10,'Inform'
 
nachalo db 'Start-crypting...',13,10,'$'
finish db 'Crypt-successful!',13,10,'$'
size_w db 200
s_error_w db 'Error!',13,10,'$'
s_pak_w     db 'Press any key...$'
handle_w    rw 1          ;Дескриптор файла
 
file_name_k db 'key.txt', 0
s_pak_k     db 'Press any key...$'
buffer_k db  200
handle_k    rw 1          ;Дескриптор файла
 
file_name_r db 'hello.txt',0
s_error_r   db 'Error!',13,10,'$'
s_file_r    db '----[ file "Hello.txt" ]$'
endline_r   db 13,10,'$'
s_pak_r     db 'Press any key...$'
buffer_r    rb 200         ;80 + 1 байт для символа конца строки '$'
handle_r    rw 1          ;Дескриптор файла
 
file_name_c db 'hello-crypted.txt', 0
buffer_c rd 200
size_c      db 200
s_error_c db 'Error!',13,10,'$'
s_pak_c    db 'Press any key...$'
handle_c    rw 1          ;Дескриптор файла
 
file_name_cr db 'hello-crypted.txt', 0
buffer_cr rd 200
size_cr      db 200
s_error_cr db 'Error!',13,10,'$'
s_pak_cr    db 'Press any key...$'
handle_cr    rw 1          ;Дескриптор файла
 
 
file_name_d db 'hello-decrypted.txt', 0
buffer_d rd 200
size_d     db 200
s_error_d db 'Error!',13,10,'$'
s_pak_d    db 'Press any key...$'
handle_d   rw 1          ;Дескриптор файла
 
result rd 200
 
start:
 
    mov ah,3Ch      ;Функция DOS 3Ch (создание файла)
    mov dx,file_name_w        ;Имя файла
    xor cx,cx           ;Нет атрибутов - обычный файл
    int 21h         ;Обращение к функции DOS
    jnc @F          ;Если нет ошибки, то продолжаем
    call error_msg_w          ;Иначе вывод сообщения об ошибке
    jmp exit_w            ;Выход из программы
@@: mov [handle_w],ax         ;Сохранение дескриптора файла
 
    mov bx,ax           ;Дескриптор файла
    mov ah,40h          ;Функция DOS 40h (запись в файл)
    mov dx,buffer_w       ;Адрес буфера с данными
    movzx cx,[size_w]         ;Размер данных
    int 21h         ;Обращение к функции DOS
    jnc close_file_w          ;Если нет ошибки, то закрыть файл
    call error_msg_w          ;Вывод сообщения об ошибке
 
close_file_w:
    mov ah,3Eh          ;Функция DOS 3Eh (закрытие файла)
    mov bx,[handle_w]         ;Дескриптор
    int 21h         ;Обращение к функции DOS
    jnc exit_w            ;Если нет ошибки, то выход из программы
    call error_msg_w          ;Вывод сообщения об ошибке
 
exit_w:
    mov ah, 9
    mov dx,endline
    int 21h         ;Вывод перехода на новую строку
    
    mov ah,9
    mov dx,s_pak_w
    int 21h         ;Вывод строки 'Press any key...'
    mov ah,8            ;\
    int 21h         ;/ Ввод символа без эха
    jmp read
 
;-------------------------------------------------------------------------------
; Процедура вывода сообщения об ошибке
error_msg_w:
    mov ah,9
    mov dx,s_error_w
    int 21h         ;Вывод сообщения об ошибке
    ret
 
 
 
read:
    mov ah, 9
    mov dx,endline
    int 21h         ;Вывод перехода на новую строку
    
    mov ah, 9
    mov dx,endline
    int 21h         ;Вывод перехода на новую строку
 
; Код
    mov ah,3Dh          ;Функция DOS 3Dh (открытие файла)
    xor al,al           ;Режим открытия - только чтение
    mov dx,file_name_r        ;Имя файла
    xor cx,cx           ;Нет атрибутов - обычный файл
    int 21h         ;Обращение к функции DOS
    jnc @F          ;Если нет ошибки, то продолжаем
    call error_msg_r          ;Иначе вывод сообщения об ошибке
    jmp exit_r            ;Выход из программы
@@: mov [handle_r],ax         ;Сохранение дескриптора файла
 
    mov bx,ax           ;Дескриптор файла
    mov ah,3Fh          ;Функция DOS 3Fh (чтение из файла)
    mov dx,buffer_r       ;Адрес буфера для данных
    mov cx,200           ;Максимальное кол-во читаемых байтов
    int 21h         ;Обращение к функции DOS
    jnc @F          ;Если нет ошибки, то продолжаем
    call error_msg_r          ;Вывод сообщения об ошибке
    jmp close_file_r          ;Закрыть файл и выйти из программы
 
@@: mov bx,buffer_r
    add bx,ax           ;В AX количество прочитанных байтов
;    mov byte[bx],'$'        ;Добавление символа '$
    
    mov ah, 9
    mov dx, text_to_crypt
    int 21h
    
    mov ah, 9
    mov dx, buffer_r
    int 21h;
    
    close_file_r:
    mov ah,3Eh          ;Функция DOS 3Eh (закрытие файла)
    mov bx,[handle_r]         ;Дескриптор
    int 21h         ;Обращение к функции DOS
    jnc exit_r            ;Если нет ошибки, то выход из программы
    call error_msg_r          ;Вывод сообщения об ошибке
 
exit_r:
    mov ah, 9
    mov dx,endline
    int 21h         ;Вывод перехода на новую строку
    
    mov ah,9
    mov dx,s_pak_r
    int 21h         ;Вывод строки 'Press any key...'
    mov ah,8            ;\
    int 21h         ;/ Ввод символа без эха
    jmp dalshe;
 
;-------------------------------------------------------------------------------
; Процедура вывода сообщения об ошибке
error_msg_r:
    mov ah,9
    mov dx,s_error_r
    int 21h         ;Вывод сообщения об ошибке
 
 dalshe:
    mov ah, 9
    mov dx,endline
    int 21h         ;Вывод перехода на новую строку
    
    mov ah, 9
    mov dx,endline
    int 21h         ;Вывод перехода на новую строку
; Код
    mov ah,3Dh          ;Функция DOS 3Dh (открытие файла)
    xor al,al           ;Режим открытия - только чтение
    mov dx,file_name_k        ;Имя файла
    xor cx,cx           ;Нет атрибутов - обычный файл
    int 21h         ;Обращение к функции DOS
    jnc @F          ;Если нет ошибки, то продолжаем
    call error_msg_r          ;Иначе вывод сообщения об ошибке
    jmp exit_k            ;Выход из программы
@@: mov [handle_k],ax         ;Сохранение дескриптора файла
 
    mov bx,ax           ;Дескриптор файла
    mov ah,3Fh          ;Функция DOS 3Fh (чтение из файла)
    mov dx,buffer_k       ;Адрес буфера для данных
    mov cx,200          ;Максимальное кол-во читаемых байтов
    int 21h         ;Обращение к функции DOS
    jnc @F          ;Если нет ошибки, то продолжаем
    call error_msg_k         ;Вывод сообщения об ошибке
    jmp close_file_k          ;Закрыть файл и выйти из программы
 
@@: mov bx,buffer_k
    add bx,ax           ;В AX количество прочитанных байтов
;    mov byte[bx],'$'        ;Добавление символа '$
    
    mov ah, 9
    mov dx, key
    int 21h
    
    mov ah, 9
    mov dx, buffer_k
    int 21h;    
          
    close_file_k:
    mov ah,3Eh          ;Функция DOS 3Eh (закрытие файла)
    mov bx,[handle_k]         ;Дескриптор
    int 21h         ;Обращение к функции DOS
    jnc exit_k            ;Если нет ошибки, то выход из программы
 ;   call error_msg_k          ;Вывод сообщения об ошибке
 
exit_k:
    mov ah, 9
    mov dx,endline
    int 21h         ;Вывод перехода на новую строку
    
    mov ah,9
    mov dx,s_pak_k
    int 21h         ;Вывод строки 'Press any key...'
    mov ah,8            ;\
    int 21h         ;/ Ввод символа без эха
    jmp dalshe1;
 
;-------------------------------------------------------------------------------
; Процедура вывода сообщения об ошибке
error_msg_k:
    mov ah,9
    mov dx,s_error_r
    int 21h         ;Вывод сообщения об ошибке
    
    
    dalshe1:
    mov ah, 9
    mov dx,endline
    int 21h         ;Вывод перехода на новую строку
    mov ah, 9
    mov dx,endline
    int 21h         ;Вывод перехода на новую строку
    
  mov ah,9
  mov dx,nachalo
  int 21h    
      mov ah, 9
    mov dx,endline
    int 21h         ;Вывод перехода на новую строку
  
     mov eax, buffer_k
       mov ecx, buffer_r
       
       movdqu xmm1, [ecx]
       movdqu xmm0, [eax]
 
 ; Registers xmm2–xmm12 hold the round keys(from 0 to 10).
; In the end, xmm1 holds the encryption result.
pxor xmm1, xmm2 ; Whitening step (Round 0)
aesenc xmm1, xmm3 ; Round 1
aesenc xmm1, xmm4 ; Round 2
aesenc xmm1, xmm5 ; Round 3
aesenc xmm1, xmm6 ; Round 4
aesenc xmm1, xmm7 ; Round 5
aesenc xmm1, xmm8 ; Round 6
aesenc xmm1, xmm9 ; Round 7
aesenc xmm1, xmm10 ; Round 8
aesenc xmm1, xmm11 ; Round 9
aesenclast xmm1, xmm12 ; Round 10
 
  movd [result], xmm1
  
    mov ah,9
  mov dx,finish
  int 21h
  
      mov ah, 9
    mov dx,endline
    int 21h         ;Вывод перехода на новую строку
    
    
      mov ah, 9
    mov dx,endline
    int 21h         ;Вывод перехода на новую строку
  
  mov ah,9
  mov dx,resultat
  int 21h
  
  
    mov ah,9
    mov dx,result
    int 21h  
 
    
    mov ah, 9
    mov dx,endline
    int 21h         ;Вывод перехода на новую строку
    
    
      mov ah,9
    mov dx,s_pak_k
    int 21h         ;Вывод строки 'Press any key...'
    mov ah,8            ;\
    int 21h         ;/ Ввод символа без эха
    
      
    
    mov ah,3Ch          ;Функция DOS 3Ch (создание файла)
    mov dx,file_name_c        ;Имя файла
    xor cx,cx           ;Нет атрибутов - обычный файл
    int 21h         ;Обращение к функции DOS
    jnc @F          ;Если нет ошибки, то продолжаем
    call error_msg_c          ;Иначе вывод сообщения об ошибке
    jmp exit_c            ;Выход из программы
@@: mov [handle_c],ax         ;Сохранение дескриптора файла
 
    mov bx,ax           ;Дескриптор файла
    mov ah,40h          ;Функция DOS 40h (запись в файл)
    mov dx,result       ;Адрес буфера с данными
    movzx cx,[size_c]         ;Размер данных
    int 21h         ;Обращение к функции DOS
    jnc close_file_c          ;Если нет ошибки, то закрыть файл
    call error_msg_c          ;Вывод сообщения об ошибке
 
close_file_c:
    mov ah,3Eh          ;Функция DOS 3Eh (закрытие файла)
    mov bx,[handle_c]         ;Дескриптор
    int 21h         ;Обращение к функции DOS
    jnc exit_c            ;Если нет ошибки, то выход из программы
    call error_msg_c          ;Вывод сообщения об ошибке
 
exit_c:
    mov ah, 9
    mov dx,endline
    int 21h         ;Вывод перехода на новую строку
    
    mov ah,9
    mov dx,s_pak_c
    int 21h         ;Вывод строки 'Press any key...'
    mov ah,8            ;\
    int 21h         ;/ Ввод символа без эха
    jmp zashifrovali
 
;-------------------------------------------------------------------------------
; Процедура вывода сообщения об ошибке
error_msg_c:
    mov ah,9
    mov dx,s_error_c
    int 21h         ;Вывод сообщения об ошибке
    ret
    
    zashifrovali:
    
       mov ah, 9
    mov dx,endline
    int 21h         ;Вывод перехода на новую строку
    
    mov ah, 9
    mov dx,endline
    int 21h         ;Вывод перехода на новую строку
 
 
    
  mov ah,9
  mov dx,nachalo
  int 21h    
      mov ah, 9
    mov dx,endline
    int 21h         ;Вывод перехода на новую строку
 
    
     mov eax, buffer_k
       mov ecx, result
 
      movdqu xmm7,  [ecx]
    movdqu xmm0 , [eax]
    movdqu xmm1 , [eax +   16]
    movdqu xmm2 , [eax + 2*16]
    movdqu xmm3 , [eax + 3*16]
    movdqu xmm4 , [eax + 4*16]
    movdqu xmm5 , [eax + 5*16]
    movdqu xmm6 , [eax + 6*16]
 
    pxor   xmm7, xmm0
 
    aesdec xmm7, xmm1
      aesdec xmm7, xmm2
       aesdec xmm7, xmm3
    aesdec xmm7, xmm4
    aesdec xmm7, xmm5
    aesdec xmm7, xmm6
 
    movdqu xmm0, [eax + 7*16]
    movdqu xmm1, [eax + 8*16]
    movdqu xmm2, [eax + 9*16]
    movdqu xmm3, [eax +10*16]
 
    aesdec xmm7, xmm0
    aesdec xmm7, xmm1
    aesdec xmm7, xmm2
 
    aesdeclast xmm7, xmm3
 
    mov ecx, buffer_r
    movdqu [ecx], xmm7
    
  movd [decrypted], xmm7
  
    mov ah,9
  mov dx,finish
  int 21h
  
      mov ah, 9
    mov dx,endline
    int 21h         ;Вывод перехода на новую строку
    
    
      mov ah, 9
    mov dx,endline
    int 21h         ;Вывод перехода на новую строку
  
  mov ah,9
  mov dx,resultat
  int 21h
  
  
    mov ah,9
    mov dx,decrypted
    int 21h  
                   
    
    mov ah, 9
    mov dx,endline
    int 21h         ;Вывод перехода на новую строку
    
    
      mov ah,9
    mov dx,s_pak_k
    int 21h         ;Вывод строки 'Press any key...'
    mov ah,8            ;\
    int 21h         ;/ Ввод символа без эха
    
      mov ah,3Ch          ;Функция DOS 3Ch (создание файла)
    mov dx,file_name_d        ;Имя файла
    xor cx,cx           ;Нет атрибутов - обычный файл
    int 21h         ;Обращение к функции DOS
    jnc @F          ;Если нет ошибки, то продолжаем
    call error_msg_d          ;Иначе вывод сообщения об ошибке
    jmp exit_d            ;Выход из программы
@@: mov [handle_d],ax         ;Сохранение дескриптора файла
 
    mov bx,ax           ;Дескриптор файла
    mov ah,40h          ;Функция DOS 40h (запись в файл)
    mov dx,decrypted           ;Адрес буфера с данными
    movzx cx,[size_d]         ;Размер данных
    int 21h         ;Обращение к функции DOS
    jnc close_file_d          ;Если нет ошибки, то закрыть файл
    call error_msg_d          ;Вывод сообщения об ошибке
 
close_file_d:
    mov ah,3Eh          ;Функция DOS 3Eh (закрытие файла)
    mov bx,[handle_d]         ;Дескриптор
    int 21h         ;Обращение к функции DOS
    jnc exit_d            ;Если нет ошибки, то выход из программы
    call error_msg_d          ;Вывод сообщения об ошибке
 
exit_d:
    mov ah, 9
    mov dx,endline
    int 21h         ;Вывод перехода на новую строку
    
    mov ah,9
    mov dx,s_pak_d
    int 21h         ;Вывод строки 'Press any key...'
    mov ah,8            ;\
    int 21h         ;/ Ввод символа без эха
    jmp konec
 
;-------------------------------------------------------------------------------
; Процедура вывода сообщения об ошибке
error_msg_d:
    mov ah,9
    mov dx,s_error_d
    int 21h         ;Вывод сообщения об ошибке
    ret
 
    konec:
    
      mov ah,9
    mov dx,s_pak_k
    int 21h         ;Вывод строки 'Press any key...'
    mov ah,8            ;\
    int 21h   
          ;/ Ввод символа без эха
Так не компилируется из-за отсутствия поддержки xmm8-14.
Если заменить use16 на format PE64, то компилируется, но не запускается, т.к. не поддерживается работа с прерываниями.

Добавлено через 5 минут
Если поставить use64, то компилируется, запускается, и сразу вылетает. Без ошибок и уведомлений.

Добавлено через 4 минуты
Как можно решить эту проблему?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2013, 22:38
Ответы с готовыми решениями:

Работа с прерываниями клавиатуры
Нужно очистить буфер клавиатуры и ввести 12 символов с фильтрацией всех...

Отладка приложения с прерываниями
Здравствуйте уважаемые! Ув-е потому, что я действительно уважаю тех, кто...

Работа с прерываниями
Есть программа для работы с прерыванием по таймеру. Не могу до конца...

Нужна книга, где рассматриваются работа с прерываниями, указатели, работа с памятью, ассемблерные вставки
Привет всем! Подскажите, пожалуйста, хорошую книгу по C (именно C, не C++)....

Работа с прерываниями
Привет всем :D Недавно начал сного программировать МК, до этого писал всякую...

1
Troll_Face
603 / 403 / 8
Регистрация: 26.04.2012
Сообщений: 2,070
28.04.2013, 14:33 2
Цитата Сообщение от jen941 Посмотреть сообщение
Если поставить use64, то компилируется, запускается, и сразу вылетает. Без ошибок и уведомлений.
под отладчиком пробовали запускать?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2013, 14:33

Работа с прерываниями
Доброе время суток. Возник вопрос, недавно я начал учиться работать с...

Работа с прерываниями Atmega16
Здравствуйте, недавно с али пришла мне долгожданная железка Atmega16A. Помигал...

MCS-51. Работа с прерываниями
Нужно разработать функции, обеспечивающие формирование периодического...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru