Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
 
 
BlackRock
0 / 0 / 1
Регистрация: 13.02.2015
Сообщений: 27
#1

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

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

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

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

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

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

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

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

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

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

Добавлено через 2 минуты
Начните с процедуры (именно процедуры), которая в строке по адресу ds:dx дублирует все гласные буквы.
А потом преобразуете её в обработчик прерывания.
0
Kukuxumushu
752 / 475 / 89
Регистрация: 13.06.2015
Сообщений: 1,629
Завершенные тесты: 2
18.11.2017, 02:34 #3
Цитата Сообщение от BlackRock Посмотреть сообщение
я не понимаю как перекрывание 10ой функции должно выглядеть
Тупо перекрыть одну функцию нельзя, надо перекрывать всё int21h, а в нём уже анализировать номер функции - если не 10h, то перенаправлять на исходный вектор, если 10h - обрабатывать самому. Но тут будет великая подстава - мы не знаем заранее сколько букв придётся продублировать, и соответственно не можем заранее ограничить ввод, что приведёт к самым непредсказуемым последствиям.
Простой пример: программа выделила буфер под 10 символов, а после вашей обработки в нём оказалось 15, в итоге память после буфера затёрлась. Можно конечно сразу резать MaxLen в 2 раза, но это тоже нарушит логику работы многих программ, т.к. не даст ничего нормально ввести (напр. имя файла только 4 символа будет вместо 8, и т.д.).
0
R71MT
2979 / 1109 / 264
Регистрация: 29.07.2014
Сообщений: 2,119
Записей в блоге: 4
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
❗❗ RTFM 👈
4000 / 1144 / 151
Регистрация: 14.12.2014
Сообщений: 2,284
Записей в блоге: 4
Завершенные тесты: 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
2979 / 1109 / 264
Регистрация: 29.07.2014
Сообщений: 2,119
Записей в блоге: 4
18.11.2017, 21:47 #6
Цитата Сообщение от Jin X Посмотреть сообщение
Куда же его тут "засунуть",
..поямо в обработчик.
пока биос не получит управление от доса, бац ещё один символ в буфер клавы, и пусть теперь бивис обрабатывает сразу два символа. хотя это только предположение в теории, но думаю можно организовать что-то подобное и на практике
0
Jin X
❗❗ RTFM 👈
4000 / 1144 / 151
Регистрация: 14.12.2014
Сообщений: 2,284
Записей в блоге: 4
Завершенные тесты: 2
18.11.2017, 22:19 #7
Цитата Сообщение от R71MT Посмотреть сообщение
..поямо в обработчик.
пока биос не получит управление от доса, бац ещё один символ в буфер клавы, и пусть теперь бивис обрабатывает сразу два символа. хотя это только предположение в теории, но думаю можно организовать что-то подобное и на практике
Я понимаю, что в обработчик. Но алгоритм не совсем понятен.
0
BlackRock
0 / 0 / 1
Регистрация: 13.02.2015
Сообщений: 27
18.11.2017, 22:46  [ТС] #8
Да, надо будет еще выводить на экран строку с продублированными символами.
Я делал, так что при нажатии гласных в вводимую строку попадает уже две буквы, но мне сказали, что должна вводиться строка и новый обработчик помимо старого должен её изменять согласно заданию. Поэтому и вопрос возник :/

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

примеры обработки прерывания int 21h
http://www.cyberforum.ru/assembler/thread247285.html
http://www.cyberforum.ru/assembler/thread758592.html

http://www.cyberforum.ru/post5664788.html
http://www.cyberforum.ru/assembler-dos/thread164945.html
Добавлено через 1 минуту
Но начните с того, что реализуйте простую процедуру обработки строки. А уже потом вставите её в обработчик прерывания.
0
Kukuxumushu
752 / 475 / 89
Регистрация: 13.06.2015
Сообщений: 1,629
Завершенные тесты: 2
19.11.2017, 05:10 #10
Цитата Сообщение от Jin X Посмотреть сообщение
А обрезать по 10 символам нельзя?
Можно конечно, только соответствие ТЗ в этом случае ставится под большой вопрос. Хотя тут проблема в том, что само ТЗ составляли идиоты, скорее всего как обычно аспиранты, косясщие от армии.
И вообще, я смотрю, все мои замечания и предложения были проигнорированы, и обсуждение ушло куда-то не туда.
Ещё раз напомню:
1. "Подмена" предполагает следующий алгоритм:
а) Любая программа или сама ОС вызывает int21h 0ah, предварительно подготовив под него буфер и заполнив MaxLen.
б) После прерывания в буфере лежит уже обработанная строка, с любыми способами "обрезания" и прочего недопущения переполнения буфера. Понятное дело, что логика всех программ будет этим нарушена.
2. Только этот способ единственный обеспечивает полную прозрачность для всех программ и ОС. Ничего дополнительно выводить на экран руками не надо - это всё будет сделано автоматически.
3. Чтобы его реализовать, надо подменить всё прерывание int21h целиком, перенаправляя все функции сначала на исходный вектор, а потом дополнительно обрабатывая только функцию 0ah. Всё необходимое для этого (DS : DX) у резидента будет иметься.
1
Argogo
488 / 232 / 39
Регистрация: 29.03.2013
Сообщений: 495
19.11.2017, 17:41 #11
Лучший ответ Сообщение было отмечено BlackRock как решение

Решение

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 / 1
Регистрация: 13.02.2015
Сообщений: 27
19.11.2017, 21:53  [ТС] #12
Argogo, Единственное, что непонятно так как написать процедуру сейва в буфер ?
+ ругается на 43ю строку. (tasm)
0
Argogo
488 / 232 / 39
Регистрация: 29.03.2013
Сообщений: 495
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 / 1
Регистрация: 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
ФедосеевПавел
Модератор
3412 / 1909 / 815
Регистрация: 01.02.2015
Сообщений: 6,450
19.11.2017, 23:49 #15
Assembler
1
cr equ 0Dh
1
BlackRock
0 / 0 / 1
Регистрация: 13.02.2015
Сообщений: 27
20.11.2017, 01:20  [ТС] #16
Кликните здесь для просмотра всего текста
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
CSEG segment
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
org 100h
 
Start:  jmp init
 
        Int_21h_proc:
                cmp ah,10
                je @@
                jmp dword ptr cs:[Int_21h_vect]
                @@:  
                push    es
    push    di
    push    bx
    push    cx
    mov bx, dx
    push    si
    push    dx
    mov si,1
    xor ch,ch
    mov cl,[bx]
    inc bx
    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  
    jb  @@loop
    call    Output
    call    IsVowel 
    jnz @@loop
    call    Save2Buff
;    jb  @@loop
 ;   call    Output
    jmp @@loop
          
    @@bs:
    cmp si, 1
    je  @@loop
    mov byte ptr [bx+si], 0Dh
    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 
    
NoEchoInp PROC
    mov ah, 00h
    int 16h
    ret
NoEchoInp ENDP
           
IsVowel PROC   
    cmp al,'a'  
    jz final3
    cmp al,'e' 
    jz final3
    cmp al,'y'
    jz final3
    cmp al,'o'
    jz final3
    cmp al,'u'
    jz final3
    cmp al,'i'  
    jz final3
 final3:
    ret
IsVowel ENDP          
           
Save2Buff PROC
    cmp si,cx 
    je final1
    mov [bx+si],al  
    mov byte ptr [bx+si+2],'$' 
    mov byte ptr [bx+si+1],0Dh 
    inc byte ptr [bx]
    inc si
    clc
    jmp final2
    final1:
    stc
    final2:
    ret
Save2Buff ENDP 
 
   newline PROC
    
    mov dx,13
    mov ah,02h
    int 21h  
    mov dx,10
    mov ah,2
    int 21h
          
    ret 
    
    newline ENDP
      
Output PROC  
    push dx
    mov dl,al
    mov ah,02h
    int 21h
    pop dx
    ret
Output ENDP    
 
        cr db 0Dh
        lf db 0ah
        bs db 8
        tab db 9
        spc db 20h
        Int_21h_vect dd 0
        
        Init:
          mov ah,35h
          mov al,21h
          int 21h
          mov word ptr[Int_21h_vect],bx
          mov word ptr[Int_21h_vect+2],es
 
          mov ax,2521h
          mov dx,offset Int_21h_proc
          int 21h             
                                     
          mov dx,offset Init
          int 27h        
              
CSEG ends
end Start


Вот, что пока получилось, работает так как мне надо, одна проблема осталась, когда пытаюсь запустить еще один комовский файл и поюзать перекрытое прерывание, функция начинает себя вести очень странно (грубо говоря она вообще перестаёт работать, работает только ввод и то он почему-то бесконечный). Не особо понимаю, что я делаю неправильно в инициализации, вроде всё по учебнику.
На всякий случай код 2-го файла
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CSEG segment
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
org 100h
 
Start:  jmp Init
     
        Init: 
        
            mov ah, 10
    mov dx,offset MAX
    int 21h
   
          
          mov ah, 4ch
          int 21h   
                    
        MAX db 50
        ACTUAL db ?
        BUFFER db 50 dup(?)
            
                    
CSEG ends
end Start
0
Argogo
488 / 232 / 39
Регистрация: 29.03.2013
Сообщений: 495
20.11.2017, 06:37 #17
Лучший ответ Сообщение было отмечено BlackRock как решение

Решение

Цитата Сообщение от BlackRock Посмотреть сообщение
Need register in expression. Tasm 4.1.
Я вот это кому писал?
Цитата Сообщение от Argogo Посмотреть сообщение
(константы: cr=0Dh, lf=0ah, bs=8, tab=9, spc=20h)
Добавлено через 13 минут
BlackRock, строка 99 - на неё место в буфере не предусмотрено (на символ '$'). Остальные косяки, если они есть, предлагаю найти самостоятельно. Мой рабочий вариант (для MASM):
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
page    255
.MODEL  TINY
.CODE
bs=8
tab=9
cr=0Dh
lf=0ah
spc=20h
        ORG     100h
;---------------------------
vOldInt LABEL   WORD
Begin   PROC    NEAR
        jmp     Init
Begin   ENDP
        ORG     104h
;---------------------------
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],..,[ByteQty],[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
    jb  @@loop
    call    Output
    call    IsVowel
    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
;---------------------------
Save2Buff       PROC    NEAR
        cmp     si, cx
        jb      @F
        stc
        ret
@@:
        inc     byte ptr [bx]
        mov     [bx+si], al
        mov     byte ptr [bx+si+1], cr
        inc     si
        clc
        ret
Save2Buff       ENDP
;---------------------------
Output  PROC    NEAR
        push    ax
        push    dx
        mov     dl, al
        mov     ah, 2
        int     21h
        pop     dx
        pop     ax
        ret
Output  ENDP
;---------------------------
NoEchoInp       PROC    NEAR
        mov     ah, 8
        int     21h
        ret
NoEchoInp       ENDP
;---------------------------
IsVowel PROC    NEAR
        push    cx
        mov     di, offset Vowels
        mov     cx, SIZEOF Vowels
        repne   scasb
        pop     cx
        ret
IsVowel ENDP
Vowels  db      'AEIOUaeiouАЕЁИОУЫЭЮЯаеёиоуыэюя'
;---------------------------
Init    PROC    NEAR
        mov     ax, 3521h
        int     21h
        mov     [vOldInt], bx
        mov     [vOldInt+2], es
 
        mov     dx, offset IntRout
        mov     ax, 2521h
        int     21h
 
        mov     dx, offset Init
        int     27h
Init    ENDP
;---------------------------
        END     Begin
Добавлено через 10 минут
BlackRock, ты строки 44 и 45 зря закоментил: если дубль символа был удачно помещен в буфер, то его надо вывести на STDOUT, если нет - не надо ничего выводить. Такая ситуация возникает только тогда, когда когда на последнее свободное место (в буфере)вводится гласная - дублировать её в этом случае нельзя, т.к. в буфере больше нет места.

Добавлено через 11 минут
Если тасм выругается на строку 115 (mov cx, SIZEOF Vowels), тогда замени её на
Assembler
1
mov cx, SIZEOF_Vowels
и добавь сразу после строки 120 (Vowels db 'AEIOUaeiouАЕЁИОУЫЭЮЯаеёиоуыэюя') следующее:
Assembler
1
SIZEOF_Vowels=$-Vowels
Добавлено через 4 минуты
Правильное определение кириллических гласных зависит от кодировки. Если программа запускается в DOS и кодовая страница 866, то и русские буквы должны набираться (в .asm-файле) в той же кодировке.
1
BlackRock
0 / 0 / 1
Регистрация: 13.02.2015
Сообщений: 27
20.11.2017, 10:32  [ТС] #18
Argogo, Всё, спасибо огромное большое ) Задача решена.
0
Jin X
❗❗ RTFM 👈
4000 / 1144 / 151
Регистрация: 14.12.2014
Сообщений: 2,284
Записей в блоге: 4
Завершенные тесты: 2
20.11.2017, 10:50 #19
Цитата Сообщение от BlackRock Посмотреть сообщение
Да, надо будет еще выводить на экран строку с продублированными символами.
Выводить сразу во время ввода или после (уже в программе... ну или в обработчике, но ПОСЛЕ)? Это существенно.
0
Lici
0 / 0 / 0
Регистрация: 23.06.2016
Сообщений: 29
29.11.2017, 20:57 #20
Цитата Сообщение от Argogo Посмотреть сообщение
Мой рабочий вариант (для MASM):
А не подскажете почему у меня не работает проверка работы функции данного прерывания?
Я добавляю:
Assembler
1
2
.DATA
    string db 100,100 dup ('$')
А в процедуре Init, после установки вектора функцией 25h я добавляю:
Assembler
1
2
3
4
5
6
7
       mov     dx, offset IntRout  ;этот код был
        mov     ax, 2521h              ;этот код был
        int     21h                         ;этот код был
        
        lea dx, string                    ;этот код я добавил
        mov ah, 0ah                     ;этот код я добавил
        int 21h                             ;этот код я добавил
В итоге ввести вообще ничего не получается.
P.S. Пока только учусь, извиняюсь если вопрос слишком глупый. Юзаю tasm, компилятор ругался на анонимные метки @f, и я заменил их на обычные, так же была проблема со строкой 115, я исправил её как вы и написали.
0
29.11.2017, 20:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2017, 20:57
Привет! Вот еще темы с решениями:

Реализовать функции 0Fh,07h,11h(у 11h подфункцию 4h) прерывания int 10h
Реализовать функции 0Fh,07h,11h(у 11h подфункцию 4h) прерывания int 10h.Нужен...

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

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

Перехват 21h
Подскажите пожалуйста. Как передать управление оригинальному обработчику 21h? ...


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

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

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