Форум программистов, компьютерный форум, киберфорум
Наши страницы

Assembler: DOS/Real Mode/16-bits

Войти
Регистрация
Восстановить пароль
 
 
BlackRock
0 / 0 / 0
Регистрация: 13.02.2015
Сообщений: 27
#1

Перехват прерывания int 21h ah=10h: во вводимой строке продублировать все гласные буквы - Assembler

17.11.2017, 17:40. Просмотров 566. Ответов 24
Метки нет (Все метки)

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

Проблема в том, что я не понимаю как перекрывание 10ой функции должно выглядеть, может у кого завалялся хотя бы простенький пример как такое перекрывание выглядит ? Инет и учебники перерыл, ничего годного на эту тему не нашёл.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.11.2017, 17:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перехват прерывания int 21h ah=10h: во вводимой строке продублировать все гласные буквы (Assembler):

Api эквивалент прерывания int 10h? - Assembler
Кто -нибудь знает название Api функции ,которая реализует тоже самое что и прерывание int 10h(Видео BIOS)?

перехват int 21h - Assembler
com 16 bit .286 ASKII_code_key_check equ 'A' ASKII_code_key equ 'B' number_handler_int21_02h equ 02h ...

Вывод таблицы векторов прерывания не используя int 21H - Assembler
Нужно вывести на экран Ms DOs таблицу векторов прерывания НЕ используя int 21H! так что я предполагаю через int 10H.. уже неделю с этим...

Можно ли поменять цвет символа, не используя прерывания int 10h - Assembler
Можно ли поменять цвет символа, не используя прерывания int 10h

Реализовать функции 0Fh,07h,11h(у 11h подфункцию 4h) прерывания int 10h - Assembler
Реализовать функции 0Fh,07h,11h(у 11h подфункцию 4h) прерывания int 10h.Нужен код проги реализующей эти функции Добавлено через 3 часа...

Очистить экран с помощью прерывания 10h - Assembler
Привет всем! Помогите пожалуйста: Очистить экран с помощью прерывания 10h и вывести на экран 2 разных символа разных цветов.

24
ФедосеевПавел
Модератор
2655 / 1558 / 648
Регистрация: 01.02.2015
Сообщений: 5,393
17.11.2017, 21:55 #2
Десятая функция прерывания int 21h это
int 21h fn=0Ah

Добавлено через 2 минуты
Начните с процедуры (именно процедуры), которая в строке по адресу ds:dx дублирует все гласные буквы.
А потом преобразуете её в обработчик прерывания.
0
Kukuxumushu
503 / 329 / 61
Регистрация: 13.06.2015
Сообщений: 1,196
Завершенные тесты: 2
18.11.2017, 02:34 #3
Цитата Сообщение от BlackRock Посмотреть сообщение
я не понимаю как перекрывание 10ой функции должно выглядеть
Тупо перекрыть одну функцию нельзя, надо перекрывать всё int21h, а в нём уже анализировать номер функции - если не 10h, то перенаправлять на исходный вектор, если 10h - обрабатывать самому. Но тут будет великая подстава - мы не знаем заранее сколько букв придётся продублировать, и соответственно не можем заранее ограничить ввод, что приведёт к самым непредсказуемым последствиям.
Простой пример: программа выделила буфер под 10 символов, а после вашей обработки в нём оказалось 15, в итоге память после буфера затёрлась. Можно конечно сразу резать MaxLen в 2 раза, но это тоже нарушит логику работы многих программ, т.к. не даст ничего нормально ввести (напр. имя файла только 4 символа будет вместо 8, и т.д.).
0
R71MT
1931 / 740 / 216
Регистрация: 29.07.2014
Сообщений: 1,744
18.11.2017, 05:48 #4
Цитата Сообщение от BlackRock Посмотреть сообщение
Инет и учебники перерыл, ничего годного на эту тему не нашёл.
Качаешь справочник по-прерывания Tech-Help, где описаны все прерывания.
находишь в нём описание INT-21h (AH=35h) - получить вектор прерывания.
в своём обработчике можешь использовать INT-16h (AH=5):
Код
INT-16h, AH=5 - Поместить символ в буфер клавиатуры
---------------------------------------------------
Вход:  CH = скан-код
       CL = ASCII код
Выход: AL = 0-успех, AL=1 - буфер переполнен
0
Jin X
Евгений, Самара
2006 / 790 / 126
Регистрация: 14.12.2014
Сообщений: 1,804
Записей в блоге: 2
Завершенные тесты: 2
18.11.2017, 19:56 #5
Цитата Сообщение от Kukuxumushu Посмотреть сообщение
Простой пример: программа выделила буфер под 10 символов, а после вашей обработки в нём оказалось 15, в итоге память после буфера затёрлась.
А обрезать по 10 символам нельзя?

А вообще, вопрос ещё вот в чём: нужно ли выводить на экран продублированные символы или только в память?
От этого будет зависеть – надо ли писать эту функцию самому или нет...

Добавлено через 7 минут
Цитата Сообщение от R71MT Посмотреть сообщение
в своём обработчике можешь использовать INT-16h (AH=5)
Куда же его тут "засунуть", Тимур?
Вообще надо ещё не забывать про перенаправление ввода (т.е. юзать ah=1/int 21h, например, при вводе) и про int 28h и флаги InDOS и ErrorMode.
0
R71MT
1931 / 740 / 216
Регистрация: 29.07.2014
Сообщений: 1,744
18.11.2017, 21:47 #6
Цитата Сообщение от Jin X Посмотреть сообщение
Куда же его тут "засунуть",
..поямо в обработчик.
пока биос не получит управление от доса, бац ещё один символ в буфер клавы, и пусть теперь бивис обрабатывает сразу два символа. хотя это только предположение в теории, но думаю можно организовать что-то подобное и на практике
0
Jin X
Евгений, Самара
2006 / 790 / 126
Регистрация: 14.12.2014
Сообщений: 1,804
Записей в блоге: 2
Завершенные тесты: 2
18.11.2017, 22:19 #7
Цитата Сообщение от R71MT Посмотреть сообщение
..поямо в обработчик.
пока биос не получит управление от доса, бац ещё один символ в буфер клавы, и пусть теперь бивис обрабатывает сразу два символа. хотя это только предположение в теории, но думаю можно организовать что-то подобное и на практике
Я понимаю, что в обработчик. Но алгоритм не совсем понятен.
0
BlackRock
0 / 0 / 0
Регистрация: 13.02.2015
Сообщений: 27
18.11.2017, 22:46  [ТС] #8
Да, надо будет еще выводить на экран строку с продублированными символами.
Я делал, так что при нажатии гласных в вводимую строку попадает уже две буквы, но мне сказали, что должна вводиться строка и новый обработчик помимо старого должен её изменять согласно заданию. Поэтому и вопрос возник :/

Добавлено через 16 минут
Еще такой вопрос, можно ли узнать какой код находится в int 21h 10h ? Очень бы пригодилось.
0
ФедосеевПавел
Модератор
2655 / 1558 / 648
Регистрация: 01.02.2015
Сообщений: 5,393
19.11.2017, 01:12 #9
Установите собственный обработчик после "родного". И обрабатывайте полученную строку.

примеры обработки прерывания int 21h
Резидентная программа (обработка функции 9h прерывания 21h)
перехват int 21h

FAQ для раздела Assembler, MASM, TASM
Резидентная программа: запись всех нажатия клавиш в файл (KeyLog)
Добавлено через 1 минуту
Но начните с того, что реализуйте простую процедуру обработки строки. А уже потом вставите её в обработчик прерывания.
0
Kukuxumushu
503 / 329 / 61
Регистрация: 13.06.2015
Сообщений: 1,196
Завершенные тесты: 2
19.11.2017, 05:10 #10
Цитата Сообщение от Jin X Посмотреть сообщение
А обрезать по 10 символам нельзя?
Можно конечно, только соответствие ТЗ в этом случае ставится под большой вопрос. Хотя тут проблема в том, что само ТЗ составляли идиоты, скорее всего как обычно аспиранты, косясщие от армии.
И вообще, я смотрю, все мои замечания и предложения были проигнорированы, и обсуждение ушло куда-то не туда.
Ещё раз напомню:
1. "Подмена" предполагает следующий алгоритм:
а) Любая программа или сама ОС вызывает int21h 0ah, предварительно подготовив под него буфер и заполнив MaxLen.
б) После прерывания в буфере лежит уже обработанная строка, с любыми способами "обрезания" и прочего недопущения переполнения буфера. Понятное дело, что логика всех программ будет этим нарушена.
2. Только этот способ единственный обеспечивает полную прозрачность для всех программ и ОС. Ничего дополнительно выводить на экран руками не надо - это всё будет сделано автоматически.
3. Чтобы его реализовать, надо подменить всё прерывание int21h целиком, перенаправляя все функции сначала на исходный вектор, а потом дополнительно обрабатывая только функцию 0ah. Всё необходимое для этого (DS : DX) у резидента будет иметься.
1
Argogo
464 / 208 / 37
Регистрация: 29.03.2013
Сообщений: 473
19.11.2017, 17:41 #11
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
BlackRock, вот тебе часть обработчика (константы: cr=0Dh, lf=0ah, bs=8, tab=9, spc=20h):
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
IntRout PROC    FAR
        cmp ah, 0Ah
        je  @F
        jmp dword ptr cs:[vOldInt]
@@:
    push    es
    push    di
    push    bx
    push    cx
    mov bx, dx
    push    si
    push    dx
    mov si, 1   ; relative ptr
    xor ch, ch
    mov cl, [bx]; buffer size
    inc bx      ; ptr to Readed Qty    ([Qty],[Byte1],[Byte2],..,[ByteReadedQty],[0Dh])
    jcxz    @@exit
    mov ax, 0d00h
    mov [bx], ax
    dec cx
    jz  @@exit
    cld
    push    cs
    pop es
@@loop:
    call    NoEchoInp
    cmp al, cr
    je  @@2exit
    cmp al, bs
    je  @@bs
    call    Save2Buff   ; очищает CF, если в буфере было место под символ, устанавливает CF, если места небыло
    jb  @@loop
    call    Output
    call    IsVowel     ; возвращает ZF=1 если буква гласная, ZF=0 - если согласная
    jnz @@loop
    call    Save2Buff
    jb  @@loop
    call    Output
    jmp @@loop
@@bs:
    cmp si, 1
    je  @@loop
    mov [bx+si], byte ptr cr
    dec si
    dec byte ptr [bx]
    call    Output
    mov al, spc
    call    Output
    mov al, bs
    call    Output
    jmp @@loop
@@2exit:
    mov [bx+si], al
    call    Output
@@exit:
    pop dx
    pop si
    pop cx
    pop bx
    pop di
    pop es
    iret
IntRout ENDP
;---------------------------
Остаётся лишь дописать недостающие процедуры.

Добавлено через 12 минут
Примечание:
если вводимая на последнее место в буфер буква окажется гласной, она дублироваться не будет (ибо места нет);
"биканье" (вывод символа с кодом 7, для полного копирования действий обработчика) не реализовано, я просто забыл про эту особенность.
1
BlackRock
0 / 0 / 0
Регистрация: 13.02.2015
Сообщений: 27
19.11.2017, 21:53  [ТС] #12
Argogo, Единственное, что непонятно так как написать процедуру сейва в буфер ?
+ ругается на 43ю строку. (tasm)
0
Argogo
464 / 208 / 37
Регистрация: 29.03.2013
Сообщений: 473
19.11.2017, 22:20 #13
Цитата Сообщение от BlackRock Посмотреть сообщение
+ ругается на 43ю строку. (tasm)
byte ptr переставь между mov и [bx+si]. Возможно поможет. Я масмом 6.11 пользуюсь.
Вообще, если ругается, необходимо писать как и именно ругается. Какой версии тасм? Почему это клещами вытаскивать надо?


Цитата Сообщение от BlackRock Посмотреть сообщение
Единственное, что непонятно так как написать процедуру сейва в буфер ?
сравни SI и CX, если они равны - остаётся место только под символ возврата каретки - надо установить CF и выйти.
Если SI меньше CX - есть место в буфере: помещаешь по адресу [BX+SI] полученный байт, по адресу [BX+SI+1] байт 0Dh, увеличиваешь счетчик по адресу [BX] (байт), увеличиваешь указатель SI, сбрасываешь CF, выходишь.
0
BlackRock
0 / 0 / 0
Регистрация: 13.02.2015
Сообщений: 27
19.11.2017, 23:32  [ТС] #14
Цитата Сообщение от Argogo Посмотреть сообщение
byte ptr переставь между mov и [bx+si]. Возможно поможет. Я масмом 6.11 пользуюсь.
Вообще, если ругается, необходимо писать как и именно ругается. Какой версии тасм? Почему это клещами вытаскивать надо?
Need register in expression. Tasm 4.1.
Перестановка не помогла.
0
ФедосеевПавел
Модератор
2655 / 1558 / 648
Регистрация: 01.02.2015
Сообщений: 5,393
19.11.2017, 23:49 #15
Assembler
1
cr equ 0Dh
1
19.11.2017, 23:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2017, 23:49
Привет! Вот еще темы с ответами:

[Вопрос] Перехват прерывания прямым доступом к вектору прерывания - Assembler
Всех приветствую! В данный момент разбираюсь с обработкой аппаратного прерывания (прерывание таймера 08h и 1Ch, -//- клавиатуры 09h). ...

Перехват 21h - Assembler
Подскажите пожалуйста. Как передать управление оригинальному обработчику 21h? CSEG Segment ASSUME CS:CSEG org 100h begin: ...

Обработчик прерывания 21h (по книге Калашникова) - Assembler
Всем добрый день. Изучаю ассемблер по книге Калашникова . Программа перехватывает 21-ое прерывание и подменивает выводимую строку. ...

Резидентная программа (обработка функции 9h прерывания 21h) - Assembler
Разбираю программу из калашникова. Должна менять выводимую строку и быть резиднетной. Некуоторое оказалось непонятным что автор написал....


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

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

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