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

Перехватить прерывание ah=09h int 21h - изменить регистр символов

11.12.2016, 16:59. Показов 7248. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача: Перекрыть девятую функцию прерывания 21h таким образом, чтобы в выводимой строке маленькие буквы заменялись большими, а большие на маленькие. Не могу понять в чём у меня ошибка, да и толковой информации по обработке прерываний так и не нашёл. Пожалуйста, посмотрите следующий код, может хоть вы найдёте ошибку( Да и если не трудно, напишите где можно доходчиво почитать про обработку прерываний в ассемблере. Заранее спасибо за внимание!
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
.model small
.stack
.data
    a dw ?
    old_handler dd ?
    string db 255 dup(?), '$'
.code
    assume ds:@data, es:@data
int_handler proc
    cld
    lea di, string
    lea si, string
    mov cx, a
again:
    lods string
    cmp al, 'A'
    jbe big_to_small
    cmp al, 'Z'
    jae big_to_small
    cmp al, 'a'
    jbe small_to_big
    cmp al, 'z'
    jae small_to_big
    jmp just_label
big_to_small:
    add al, 32
    jmp just_label
small_to_big:
    sub al, 32
just_label:
    stos string
    loop again
    iret
int_handler endp
 
main:
    mov ax, @data
    mov ds, ax
 
    mov ax, 3509h
    int 21h
    mov word ptr old_handler, bx
    mov word ptr old_handler + 2, es
    
    mov ax, 2509h
    mov dx, seg int_handler
    mov ds, dx
    mov dx, offset int_handler
    int 21h
    
    cld
    lea di, string
    mov cx, 255
    mov a, 0
cycle:
    mov ah, 01h
    int 21h
    cmp al, 13
    je string_ok
    stos string
    inc a
    loop cycle
string_ok:
    mov ah, 09h
    int 21h
    
    lds dx, old_handler
    mov ax, 2509h
    int 21h  
    
    mov ax, 4c00h
    int 21h
end main
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.12.2016, 16:59
Ответы с готовыми решениями:

Вывод строки на экран. Прерывание 21H функция 09H
Нужно просто вывести строку на экран string1 db 'Введите последовательность символов','$' ...

Резидентный обработчик функции ah=09h int 21h - в выводимой строке изменять регистр символов
Перекрыть девятую функцию прерывания 21h таким образом, чтобы в выводимой строке маленькие буквы заменялись большими, а большие на...

Резидентная программа - перехват прерывания int 21h ah=09h
Задание: перекрыть 9 функцию 21 прерывания в assembler. Помогите, плиз, разобраться как правильно ставить перекрывание. Решил с самого...

30
0 / 0 / 0
Регистрация: 23.06.2016
Сообщений: 29
13.12.2016, 18:07  [ТС]
Студворк — интернет-сервис помощи студентам
В общем я почти всё исправил, и вот с какими проблемами я столкнулся:
1)
Assembler
1
2
3
mov   dx,new21
;[...]
new21:
Не представляю как это возможно реализовать, может это навороченность FASM, но я не уточнял, в общем я в этом фрагменте сослался на процедуру.
2)Тут тоже не совсем понял как нужно восстановить вектор:
Assembler
1
jmp    far dword [old21]
В общем вот код, который получился:
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
.model small
.stack
.data
    a dw ?
    old21 dw 0,0
    string db 255 dup(?), '$'
.code
    assume ds:@data, es:@data
    
New21 proc 
    cmp ah, 09h
    jne @Boom
    cld
    lea di, string
    lea si, string
    mov cx, a
@compare:
    lodsb
    mov ah, al
    sub ah, 41h 
    cmp ah, 39h 
    ja @skip
    xor al, 20h
    stosb
@skip: 
    loop @compare
@Boom:
    iret
New21 endp
    
main:
    mov ax, @data
    mov ds, ax
 
    mov ax, 3521h
    int 21h
    mov word[old21], bx
    mov word[old21+2], es
    
    cld
    lea di, string
    mov cx, 255
    mov a, 0
cycle:
    mov ah, 01h
    int 21h
    cmp al, 13
    je string_ok
    stosb
    inc a
    loop cycle
string_ok:
    mov ax, 2521h
    call New21
    int 21h
    jmp far dword [old21]  
    
    mov ax, 4c00h
    int 21h
end main
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6211 / 2445 / 403
Регистрация: 29.07.2014
Сообщений: 3,175
Записей в блоге: 4
14.12.2016, 21:23
Цитата Сообщение от Lici Посмотреть сообщение
В общем вот код, который получился
Не правильно..
Указатель на обработчик смотрит в космос, нет вызова AH=9 (собственно, для чего и вся программа), etc. TASM'a у меня нет, протестить не могу, но на вскидку должно быть примерно так:
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
.386
.model small
.stack 100h
 
.data
    a        dw  0             ; длина строки
    string   db  255 dup('$')  ; приёмный буфер
 
.code
main:  
       mov   ax,@data
       mov   ds,ax
       mov   es,ax
 
; сохраняем оригинальный вектор(21h) в переменную 'old21'
       push  es
       mov   ax,3521h
       int   21h
       mov   word[old21],bx
       mov   word[old21+2],es
       pop   es
 
; устанавливаем свой обработчик(21h) на 'New21'
       mov   ax,2521h
       lea   dx,New21
       int   21h
 
; вводим строку..
       lea   di,string
@inp:  mov   ah,01h
       int   21h
       cmp   al,13
       je    @ok
       stosb
       inc   a            ;считаем длину строки
       jmp   @inp
 
@ok:   mov   ah,9         ;выводим строку на экран!
       lea   dx,string
       int   21h  
 
       xor   ax,ax        ;wait..
       int   16h
       mov   ax,4C00h     ;exit
       int   21h
end main
;-----------------------------------
New21  proc 
       cmp   ah,09h
       jne   @old         ;если не fn.09h
       lea   di,string
       mov   si,di
       mov   cx,a
@cmp:  lodsb
       mov   ah,al
       sub   ah,41h 
       cmp   ah,39h 
       ja    @skip
       xor   al,20h
@skip: stosb
       loop  @cmp
 
@old:  db    0EAh         ;опкод 'jmp far'
old21  dw    0,0          ;оригинальный вектор(21h)
New21  endp
Добавлено через 9 минут
ЗЫ// ..в обработчике - метку @skip нужно перенести выше, на stosb
1
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4495 / 1669
Регистрация: 01.02.2015
Сообщений: 13,904
Записей в блоге: 12
14.12.2016, 21:40
R71MT, поправить в собщении? на
Assembler
60
61
@skip: stosb
       loop  @cmp
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6211 / 2445 / 403
Регистрация: 29.07.2014
Сообщений: 3,175
Записей в блоге: 4
14.12.2016, 21:48
ФедосеевПавел, я заметил уже после 5-ти минут.. Хорошо-бы подправить, ато DI будет отставать
1
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8659 / 4495 / 1669
Регистрация: 01.02.2015
Сообщений: 13,904
Записей в блоге: 12
14.12.2016, 22:06
Поправил.
Я в таких случаях добавляю сообщение и снова даются 5 минут.
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
14.12.2016, 23:51
Цитата Сообщение от Lici Посмотреть сообщение
И как же мне исправить ошибку?)
Перехватываешь прерывание 21h и
Цитата Сообщение от Ethereal Посмотреть сообщение
В обработчике прерывания проверяешь значение AH и если оно то, что собираешься перекрыть - обрабатываешь сам, а нет так передаешь управление дальше по цепочке обработчиков прерываний.
Добавлено через 3 минуты
Цитата Сообщение от R71MT Посмотреть сообщение
New21 proc
cmp ah,09h
jne @old ;если не fn.09h
lea di,string
mov si,di
mov cx,a
@cmp: lodsb
mov ah,al
sub ah,41h
cmp ah,39h
ja @skip
xor al,20h
@skip: stosb
loop @cmp
@old: db 0EAh ;опкод 'jmp far'
old21 dw 0,0 ;оригинальный вектор(21h)
New21 endp
Как ты вольно пишешь обработчики прерываний. Регистры cx si di испоганил и еще считаешь, что имея выставленный флаг направления функцию 9 прерывания 21h вызвать не могут.

Добавлено через 1 минуту
Да еще и передаешь на старый обработчик int 21h какое попало AH. Исполняй MS-DOS какую попало функцию, исполняй.

Добавлено через 13 минут
Вот мой вариант обработчика прерывания :
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
ISR:    pushf
        cmp     ah, 9
        jne     @@@
        push    bx
        mov     bx, dx
@:      mov     al, [bx]
        cmp     al, '$'
        je      @@
        cmp     al, 'A'
        jb      Next
        cmp     al, 'Z'
        jbe     Change
        cmp     al, 'a'
        jb      Next
        cmp     al, 'z'
        ja      Next
Change: xor     byte ptr [bx], 20h
Next:   inc     bx
        jmp     @
 
@@:     pop     bx
        ;AL можно портить потому, что функция 9 int_21h сама его испортит
@@@:    popf
        db      0EAh
old_off dw      ?
old_seg dw      ?
2
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6211 / 2445 / 403
Регистрация: 29.07.2014
Сообщений: 3,175
Записей в блоге: 4
15.12.2016, 05:44
Цитата Сообщение от Ethereal Посмотреть сообщение
Регистры cx si di испоганил
..кому они нужны эти регистры? И флаги тут не зачем сохранять.
А вот AH - то это да.. Нужно было сохранить на входе только АХ
1
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
16.12.2016, 03:26
Ну, мой обработчик можно сразу резидентом повесить. И он простой и короткий.
Цитата Сообщение от R71MT Посмотреть сообщение
..кому они нужны эти регистры? И флаги тут не зачем сохранять.
Да любая резидентная программа, что обращается к функциям MS-DOS, повесится, если 21h-е прерывание будет похабить регистры, которые не должно трогать. Короче, когда-то существовало искусство программирования под MS-DOS. Но тут приходит поколение пользователей DosBox и начинает писать так, что волосы дыбом становятся.
1
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6211 / 2445 / 403
Регистрация: 29.07.2014
Сообщений: 3,175
Записей в блоге: 4
16.12.2016, 06:56
Цитата Сообщение от Ethereal Посмотреть сообщение
Да любая резидентная программа
Непонял, при чём резидентная программа, когда после AH=9 идёт выход из программы?
Ясно, что это код не для резидента, а чисто для этого случая
Цитата Сообщение от Ethereal Посмотреть сообщение
Но тут приходит поколение пользователей DosBox
..даже не знаю, что это такое.
Цитата Сообщение от Ethereal Посмотреть сообщение
Короче, когда-то существовало искусство программирования под MS-DOS.
Твой код с кучей проверок явно не тянет на искусство..
1
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
17.12.2016, 03:39
R71MT, обработчик прервания, любого, аппаратного-программоного, и т.д. прерывает программу, которая выполняется в данный момент. Скажите какая вероятность, что прерывание произойдет(юзер кофе на клаву пролил, выключил/включил блок питания на ноуте и т.п.) в момент выолнения цикла и строковых команд.

Нормальный обработчик не портит регистры без надобности, тут я согласен с Ethereal.
1
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6211 / 2445 / 403
Регистрация: 29.07.2014
Сообщений: 3,175
Записей в блоге: 4
17.12.2016, 06:33
Constantin Cat, ясно. Хорошо что напомнили, ато уже начал подзабывать такие тонкости..
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.12.2016, 06:33
Помогаю со студенческими работами здесь

Резидентный обработчик функции ah=09h int 21h - вывод строки "My String"
Помогите пожалуйста Надо написать резидентную программу, которая будет активироватьcя при попытки программ вывести строку на экран...

Будет ли прерывание int 21h работать в защищенном режиме
Будет ли прерывание int 21h функции ah=9 вывода строки работать в защищенном режиме?

Не работает функция 09h прерывания 21h
Дело в том, что программа, которую я пишу должна выкладывать информацию о блоках оперативной памяти вывод строки информации блока - с...

Перехват прерывания клавиатуры (int 09h) для замены нескольких символов
Перекрываю прерывание клавиатуры. Необходимо заменить пару букв цифрами. Но как-то пока слабо получается.(проблема написать сам...

Обработка прерывания int 09h: инверсия атрибутов символов всего экрана
Всем привет, мне нужна помощь. Я на ассемблер написал программу обработки прерывания, заменяю прерывание на свое. У меня делает лишнее...


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru