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

Резидент. При нажатии клавиши F2, слово на котором находится курсор, выделить прописными буквами

22.12.2012, 02:07. Показов 2967. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер! Очень прошу помочь реализовать программу на ассемблере. При нажатии клавиши F2, слово на котором находится курсор, выделить прописными буквами без изменения фона. заранее спасибо

 Комментарий модератора 
Темы не дублируем
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.12.2012, 02:07
Ответы с готовыми решениями:

Включать курсор при нажатии левой клавиши, а выключать по нажатию правой клавиши мыши
Нужно: Включать курсор при нажатии левой клавиши, а выключать по нажатию правой клавиши мыши. Почему не работает? И что сделать, чтобы...

Напишите программу, которая при нажатии на клавиши с буквами K, L, M, N печатает их коды
Напишите программу, которая при нажатии на клавиши с буквами K, L, M, N печатает их коды. Завершение работы программы по клавише «→».

Дан набор слов на английском языке, разделённых пробелами, в конце – точка. Выделить в последовательности нечётные слова прописными буквами
Обьясните прогу подробно что где и как (текст задачи:Дан набор слов на английском языке, разделённых пробелами, в конце – точка. Выделить в...

12
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
27.12.2012, 13:06
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
;DOS, TASM, COM-файл
;tasm.exe /m filename.asm
;tlink.exe /t /x filename.obj
;
.model tiny
.code
.386
ORG 100h
START:
    jmp Initial ;3|сюда при инициализации резидента будут
    dw  0       ;2|записаны новые команды размером 6 байт
    db  0       ;1|
 
push es ds
pusha
 
;Выйти на буфер клавиатуры
    push 40h
    pop es
 
    mov si,es:[1Ch]     ;хвост буфера
    cmp byte ptr es:[si-1],3Ch  ;F2
    jnz short not_F2
    cmp byte ptr es:[si-1],1Eh  ;мусор
    jz short not_F2
 
;получить позицию курсора DH,DL=строка,столбец
    mov ah,3
    mov bh,0
    int 10h
 
;видеопамять
    push 0B800h
    pop ds
 
;найти адрес курсора в видеопамяти
    xor ax,ax
    mov al,dh
    mov bl,80*2 ;количество символов в строке и атрибуты символов
    mul bl
    mov si,ax   ;строка с курсором в видеопамяти
 
    xor ax,ax
    mov al,dl   ;позиция курсора в строке
    shl al,1    ;al*2=позиция курсора в строке с атрибутами
    add si,ax   ;SI=позиция курсора в видеопамяти
 
    dec si      ;курсор еще на пробеле, сдвинуть на один символ влево
    dec si
 
    mov cx,25*80    ;количество символов на экране
    std     ;сканировать с уменьшением адреса 
m1:
    lodsw       ;прочитать символ с атрибутом
    cmp al,' '  ;искать пробел
    jz yes
    cmp al,'a'
    jb m2       ;nestrochnaya_bukva 
    cmp al,'z'
    ja m2       ;nestrochnaya_bukva
    and al,11011111b;делаем из строчной латинской прописную латинскую
    mov [si+2],ax   ;прописную букву записать вместо строчной
m2:
    loop m1
yes:
not_F2:
 
popa
pop ds es
    iret
;---------------------------------
INT_9   dd  ?
;Если размер резидента маленький, надо обязательно, иначе - зависнет
;Подбирается опытным путем
tmpData db 50 dup (?)
;********************************************
Initial:
push es
    mov ax,3509h
    int 21h
    mov word ptr [Int_9],bx
    mov word ptr [Int_9+2],es
pop es
 
    mov ax,2509h
    lea dx,Start
    int 21h
 
;Копировать команды в начало резидента 
    mov cx,6
    lea si,_int
    lea di,start
    rep movsb
 
    lea dx,Initial   ;конец резидента
    int 27h      ;Оставим часть программы в памяти.
_int:
pushf
call dword ptr cs:[Int_9]
end start
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
27.12.2012, 13:36
Цитата Сообщение от AFP Посмотреть сообщение
;Если размер резидента маленький, надо обязательно, иначе - зависнет
;Подбирается опытным путем
Бис.
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
27.12.2012, 13:50
Charles Kludge, когда-то без этого работало, а сейчас я не могу разобраться в чем причина.

Mikl___, вот что советовал:
Assembler
1
2
3
4
mov ah,31h;<-- вот этого у polesh нет а здесь указывается
mov dx,(Initial - START+15)/16;в DX объем резервируемой памяти в параграфах
int 21h ;передать управление DOS и оставить в памяти резидентом
;где метка START - стоит в начале программы, а метка Initial - в конце
У меня не заработало.
0
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
27.12.2012, 14:13
Ищите в разделе TERMINATE & STAY RESIDENT
И что за привычка цепляться за int 9? Специально же для этого создана ф-ция int 15h/ah=4Fh.
Вызывается БИОСом уже после того, как IRQ1 обработано, т.е. по портам шарить не надо.
Почему-то никого не стремает вешать свой таймер на int 1Ch, а не на IRQ0/int 8, а с клавой почему-то никто не догоняет... Переделки минимальны, но зато корректно под мультитаскерами
1
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
27.12.2012, 16:26
Charles Kludge, сделал как у вас. Памяти занимает значительно меньше, но если уменьшить размер переменной tmpData db 37 dup (?), хоть на байт – зависает.
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
;DOS, TASM, COM-файл
;tasm.exe /m filename.asm
;tlink.exe /t /x filename.obj
;
.model tiny
.code
.386
ORG 100h
START:
    jmp Initial ;3|сюда при инициализации резидента будут
    dw  0       ;2|записаны новые команды размером 6 байт
    db  0       ;1|
 
push es ds
pusha
 
;Выйти на буфер клавиатуры
    push 40h
    pop es
 
    mov si,es:[1Ch]     ;хвост буфера
    cmp byte ptr es:[si-1],3Ch  ;F2
    jnz short not_F2
    cmp byte ptr es:[si-1],1Eh  ;мусор
    jz short not_F2
 
;получить позицию курсора DH,DL=строка,столбец
    mov ah,3
    mov bh,0
    int 10h
 
;видеопамять
    push 0B800h
    pop ds
 
;найти адрес курсора в видеопамяти
    xor ax,ax
    mov al,dh
    mov bl,80*2 ;количество символов в строке и атрибуты символов
    mul bl
    mov si,ax   ;строка с курсором в видеопамяти
 
    xor ax,ax
    mov al,dl   ;позиция курсора в строке
    shl al,1    ;al*2=позиция курсора в строке с атрибутами
    add si,ax   ;SI=позиция курсора в видеопамяти
 
    dec si      ;курсор еще на пробеле, сдвинуть на один символ влево
    dec si
 
    mov cx,25*80    ;количество символов на экране
    std     ;сканировать с уменьшением адреса 
m1:
    lodsw       ;прочитать символ с атрибутом
    cmp al,' '  ;искать пробел
    jz yes
    cmp al,'a'
    jb m2       ;nestrochnaya_bukva 
    cmp al,'z'
    ja m2       ;nestrochnaya_bukva
    and al,11011111b;делаем из строчной латинской прописную латинскую
    mov [si+2],ax   ;прописную букву записать вместо строчной
m2:
    loop m1
yes:
not_F2:
 
popa
pop ds es
    iret
;---------------------------------
INT_15   dd  ?
;Если размер резидента маленький, надо обязательно, иначе - зависнет
;Подбирается опытным путем
tmpData db 37 dup (?)
;********************************************
Initial:
push es
    mov ax,3515h
    int 21h
    mov word ptr [Int_15],bx
    mov word ptr [Int_15+2],es
pop es
 
    mov ax,2515h
    lea dx,Start
    int 21h
 
;Копировать команды в начало резидента 
    mov cx,6
    lea si,_int
    lea di,start
    rep movsb
 
 
;mov ah,31h;<-- вот этого у polesh нет а здесь указывается
;mov dx,(Initial - START+15)/16;в DX объем резервируемой памяти в параграфах
;int 21h ;передать управление DOS и оставить в памяти резидентом
;где метка START - стоит в начале программы, а метка Initial - в конце
 
;    lea dx,Initial   ;конец резидента
;    int 27h      ;Оставим часть программы в памяти.
 
    push word ptr cs:[2Ch]      ; освобождаем Env segment
    pop es                      ;
    mov ah, 49h                 ;
    int 21h                     ;
    lea dx, Initial             ; смещение до последнего байта резидента
    shr dx, 4                   ; div 16. - в параграфах
    inc dx                      ; на всякий случай
    push cs                     ; уменьшаем размер
    pop es                      ; сегмента кода, т.к.
    mov ah, 4ah                 ; int 21/ah=31
    mov bx,dx                   ; делает 
    int 21h                     ; это криво
    mov ax, 3100h               ; TERMINATE &
    int 21h                     ; STAY RESIDENT
 
_int:
pushf
call dword ptr cs:[Int_15]
end start
0
 Аватар для Vadimych
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
27.12.2012, 16:57
Цитата Сообщение от AFP Посмотреть сообщение
mov ax,2515h lea dx,Start int 21h
Цитата Сообщение от AFP Посмотреть сообщение
START: jmp Initial ;3|сюда при инициализации резидента будут
Сильная фигня.

Добавлено через 17 минут
AFP, поправил на скорую руку.
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
.model tiny
.code
ORG 100h
START:
    jmp Initial ;3|сюда при инициализации резидента будут
 
int_9 proc
pushf
call cs:INT_15
push es
push ds
pusha
 
;Выйти на буфер клавиатуры
    push 40h
    pop es
 in al,60h
    cmp al,3Ch  ;F2
    jnz short not_F2
 
;получить позицию курсора DH,DL=строка,столбец
    mov ah,3
    mov bh,0
    int 10h
 
;видеопамять
    push 0B800h
    pop ds
 
;найти адрес курсора в видеопамяти
    xor ax,ax
    mov al,dh
    mov bl,80*2 ;количество символов в строке и атрибуты символов
    mul bl
    mov si,ax   ;строка с курсором в видеопамяти
 
    xor ax,ax
    mov al,dl   ;позиция курсора в строке
    shl al,1    ;al*2=позиция курсора в строке с атрибутами
    add si,ax   ;SI=позиция курсора в видеопамяти
 
    dec si      ;курсор еще на пробеле, сдвинуть на один символ влево
    dec si
 
    mov cx,25*80    ;количество символов на экране
    std     ;сканировать с уменьшением адреса 
m1:
    lodsw       ;прочитать символ с атрибутом
    cmp al,' '  ;искать пробел
    jz yes
    cmp al,'a'
    jb m2       ;nestrochnaya_bukva 
    cmp al,'z'
    ja m2       ;nestrochnaya_bukva
    and al,11011111b;делаем из строчной латинской прописную латинскую
    mov [si+2],ax   ;прописную букву записать вместо строчной
m2:
    loop m1
yes:
not_F2:
 cmp al,3bh
 jnz @f
 push cs
 pop ds
 lds dx,INT_15
 mov ax,2509h
 int 21h
push cs
pop es
mov ah,49h
int 21h
@@:
popa
pop ds
pop es
    iret
INT_15   dd  ?
    
    int_9 endp
;---------------------------------
;********************************************
Initial:
push es
    mov ax,3509h
    int 21h
    mov word ptr [Int_15],bx
    mov word ptr [Int_15+2],es
pop es
 
    mov ax,2509h
    lea dx,int_9
    int 21h
 
    mov es,es:[2ch]                      ;
    mov ah, 49h                 ;
    int 21h                     ;
 
 
;mov ah,31h;<-- вот этого у polesh нет а здесь указывается
;mov dx,(Initial - START+15)/16;в DX объем резервируемой памяти в параграфах
;int 21h ;передать управление DOS и оставить в памяти резидентом
;где метка START - стоит в начале программы, а метка Initial - в конце
 
    lea dx,Initial   ;конец резидента
    int 27h      ;Оставим часть программы в памяти.
 
end start
F1 - выгрузка из памяти.
1
Клюг
 Аватар для Charles Kludge
7677 / 3192 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
27.12.2012, 17:30
AFP, заготовка обработчика int 15h выглядит так(по нажатию на пробел выводит ^G на экран)[FASM]:
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
               org  100h
start:         jmp  main
 
_int15:     
        pushf
        cmp ah,4Fh
        jz  _keyb
gtfo:       call    far [cs:old_int15]      ; go back
        iret
_keyb:      
        cmp al, 39h
        jnz gtfo
        push    cx
        mov cx, 7
        mov ah,5
        int 16h
        xor ax,ax
        pop cx
        popf
        clc
        retf    2
old_int15:  dd  ?
 
main:
        push    cs
        push    cs
        pop ds
        pop es
                mov     ax, 3515h                                     ; получить в ES:BX адрес прерывания 8h
            int     21h
            mov     [cs:old_int15], bx     ; запомним старый адрес 
            mov     [cs:old_int15+2], es    ; прерывания
                mov     ax, 2515h                                             ; установим вектор на 23
            mov     dx, _int15        ; прерывание
            int     21h
            mov ah, 0Ah
        mov dx, inpbuf
        int 21h
 
remove: 
            mov dx, [cs:old_int15]     ; возвращаем вектор прерывания
            mov ds, [cs:old_int15+2]    ; на место
            mov ax, 2515h
                int 21h
exit:                                   ; выход
            int 20h
inpbuf: db  50          ; наибольшая длина строки
len:    db  ?                       ; сюда вернется настоящая длина
buf:    db  50 dup(?)              ; тут будет то, что ввели
1
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
27.12.2012, 20:41
Vadimych, с выгрузкой были проблемы и я убрал ее. Пробовал INT 9h, 15h, 1Ch, 28h. Стабильнее с 28, но тогда F2 плохо работает, с остальными – зависания, где-то больше, где-то меньше.
F2 определял и как у вас и через буфер, остановился на int 16h.

Charles Kludge, с вашей заготовкой буду уже завтра разбираться.

Вот окончательный вариант:
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
.model tiny
.code
.386
ORG 100h
START:
    jmp Initial
 
TSR proc
pushf
call dword ptr cs:INT_15
 
push es
push ds
pusha
 
    mov ah,1
    int 16h
    cmp ah,3Ch  ;F2
    jnz exit
 
;получить позицию курсора DH,DL=строка,столбец
    mov ah,3
    mov bh,0
    int 10h
 
;видеопамять
    push 0B800h
    pop ds
 
;найти адрес курсора в видеопамяти
    xor ax,ax
    mov al,dh
    mov bl,80*2 ;количество символов в строке и атрибуты символов
    mul bl
    mov si,ax   ;строка с курсором в видеопамяти
 
    xor ax,ax
    mov al,dl   ;позиция курсора в строке
    shl al,1    ;al*2=позиция курсора в строке с атрибутами
    add si,ax   ;SI=позиция курсора в видеопамяти
 
    dec si      ;курсор еще на пробеле, сдвинуть на один символ влево
    dec si
 
    mov cx,25*80    ;количество символов на экране
    std     ;сканировать с уменьшением адреса 
m1:
    lodsw       ;прочитать символ с атрибутом
    cmp al,' '  ;искать пробел
    jz exit
    cmp al,'a'
    jb m2       ;nestrochnaya_bukva 
    cmp al,'z'
    ja m2       ;nestrochnaya_bukva
    and al,11011111b;делаем из строчной латинской прописную латинскую
    mov [si+2],ax   ;прописную букву записать вместо строчной
m2:
    loop m1
exit:
 
popa
pop ds
pop es
    iret
 
INT_15   dd  ?
TSR endp
;********************************************
Initial:
 
    mov ax,3515h
    int 21h
    mov word ptr [Int_15],bx
    mov word ptr [Int_15+2],es
 
    mov ax,2515h
    lea dx,TSR
    int 21h
 
    mov es,cs:[2ch]                      ;
    mov ah, 49h                 ;
    int 21h                     ;
 
    lea dx,Initial   ;конец резидента
    int 27h      ;Оставим часть программы в памяти.
 
end start
0
 Аватар для Vadimych
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
27.12.2012, 21:03
Цитата Сообщение от AFP Посмотреть сообщение
с выгрузкой были проблемы и я убрал ее.
Не поленился перезагрузить машину в дос. Резидент работает и выгружается без всяких проблем.
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
27.12.2012, 21:13
Попробуйте несколько раз, резидент - выгрузка. Первый раз, второй, иногда третий и зависает. Я в VC через Alt-F5 выгружаю.
0
 Аватар для Vadimych
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
28.12.2012, 05:05
Цитата Сообщение от AFP Посмотреть сообщение
Попробуйте несколько раз
Попробовал раз 50. Не зависает. Видимо, Dos у меня неправильный установлен.
1
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
28.12.2012, 10:30
Или у меня. Думаю это не принципиально. Сама реализация выгрузки и освобождения памяти мне понравилась. Буду использовать в качестве шаблона для TSR.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.12.2012, 10:30
Помогаю со студенческими работами здесь

Написать проверку: находится ли курсор при нажатии на объекте (C++ MFC и метод Drag & Drop)
Добрый день, не могу придумать как написать проверку: находится ли курсор при нажатии на объекте. Прошу советов. Есть класс с методом...

При нажатии левой клавиши "мыши" отразить курсор в левой половине экрана, а при нажатии правой - в правой
При нажатии левой клавиши &quot;мыши&quot; отразить курсор в левой половине экрана, а при нажатии правой - в правой, использовав в случае...

Псевдографика , дом в котором при нажатии клавиши один 1 или 2 будет меняться цвет в окошке
сделать дом в котором при нажатии клавиши будет меняться цвет в окошке


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки 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. На борту пять. . .
Камера 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