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

Вводим с клавиатуры число в секундах, программа просто ждет это время и после делает выход

30.11.2011, 08:56. Показов 7097. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вводим с клавиатуры число в секундах, программа просто ждет это время и после делает выход!

Вот пример, но у меня почему-то он не работает(((
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
.model small
.stack 100h
.data   
 
cr equ 0Dh ; \r
lf equ 0Ah ; \n
 
String  db 'Kursovaya rabota', lf, cr, '$'
String2 db '"Systemnoe programmnoe obespechenie"', lf, cr, '$'
String3 db 'Studenta gruppy "ASOI-438"', lf, cr, '$'
String4 db 'Safina Rustama Faritovicha', lf, cr, '$'
String5 db 'Variant 18.2.2.2.2', lf, cr, '$'
String6 db lf, cr, 'Nazhmite klavishu dlya prodolzheniya...', lf, cr, '$'
 
String_init db 'Schityvanie vremeni', lf, cr, '$'
 
String_alarm db 'Zvonok!', lf, cr, '$'
 
.code
main:
 
    mov dx, 03DAh  ; Установка видеорежима
    mov al, 10h
    out dx, al
    int 10h
    
    mov dx, 03C0h  ; Установка значения регистра видеоадаптера
    mov al, 00h
    out dx, al
    int 10h
    
    mov ax, @data  ; Настройка сегментного регистра
    mov ds, ax
    
    mov ah, 09h    ; Вывод текста
    
    lea dx, String
    int 21h
    lea dx, String2
    int 21h
    lea dx, String3
    int 21h
    lea dx, String4
    int 21h
    lea dx, String5
    int 21h
    lea dx, String6
    int 21h
    
    mov ah, 00h    ; Задержка до нажатия клавиши
    int 16h
    
    ;начало очистки экрана
    mov AX, 0600h  ; AH=06 (прокрутка), AL=00 (весь экран)        
    mov BH, 07     ; нормальный атрибут (черно/белый)
    mov CX, 0000   ; верхняя левая позиция
    mov DX, 184fh  ; нижняя правая позиция
    int 10h        ; вызов BIOS
 
    
    mov ah, 09h    ; Вывод текста "Считывание времени"
    lea dx, String_init
    int 21h
    
    mov ah, 02     ; Чтение текущего времени -> секунды в DH
    ; INT 4aH
    int 1Ah
    
    mov ah, 06     ; Установка таймера
    add dh, 5      ; Через 5 секунд
    int 1Ah
    
    push ds
    
    lea dx, new_4a
    MOV AX,SEG new_4a   ;сегмент процедуры
    MOV DS,AX   ;помещаем в DS
    mov ah,25h
    mov al,4Ah
    int 21h
    pop ds
    
    mov ah, 07     ; Сброс таймера
    int 1Ah
    
    mov ah, 00h    ; Задержка до нажатия клавиши
    int 16h
    
    new_4a proc FAR
    push AX
    mov ah, 09h
    lea dx, String_alarm
    int 21h
    pop AX
    
    ;MOV AL,20H ;эти две строки надо использовать
    ;OUT 20H,AL ;только для аппаратных прерываний
    IRET
    new_4a endp
 
    exit:
    
    mov ah, 49h    ; Освобождение памяти
    int 21h
    mov ah, 4Ch    ; Выход
    int 21h
 
end main
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.11.2011, 08:56
Ответы с готовыми решениями:

Дано время N в секундах. Выразить это время в сутках, часах, минутах и секундах.
Дано время N в секундах. Выразить это время в сутках, часах, минутах и секундах. Можете помочь написать программу!? p.s. Буду...

Мы вводим число, а нам выводит это число в словах
Здравствуйте. Мне надо написать программу, где мы вводим число, а нам выводит это число в словах, и так до 1 000 000. Например мы вводим 4,...

Структуры. Программа должна выводить время в днях:часах:минутах:секундах и увеличивать,уменьшать время на 1 секунду
Помогите написать программу с помощью структур.Она должна выводить время в днях:часах:минутах:секундах и увеличивать,уменьшать время на 1...

35
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 28
01.12.2011, 11:55  [ТС]
Студворк — интернет-сервис помощи студентам
А вот опять же, даже если мы будем использовать команду
Assembler
1
2
mov ah, 0
int 21h
После ведь нужно обработать что мы ввели в цифры! Потом получится, что из памяти придется доставать по коду выше!? Так сказал препод!
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16379 / 7691 / 1080
Регистрация: 11.11.2010
Сообщений: 13,774
01.12.2011, 12:21
demon2321, а если пользователь ввел только одну цифру? А если он нажал не на цифру а на Esc? А по поводу
Assembler
1
2
mov ah, 0
int 21h
так это выход из программы в ДОС
смотри в учебники! ну или хотябы здесь http://www.codenet.ru/progr/dos/dos_0008.php
DOS Fn 00H: завершить программу
Вход
AH = 00H
CS = сегмент PSP завершающегося процесса
Выход
нет = (неприменим)
Описание: передает управление на вектор завершения в PSP (выходит в родительский процесс). Идентична функции INT 20H Terminate. регистр CS должен указывать на PSP. восстанавливает векторы прерываний DOS 22H-24H (завершение, Ctrl-Break и Критическая ошибка), устанавливая значения, сохраненные в родительском PSP. выполняет сброс файловых буферов. файлы должны быть предварительно закрыты, если их длина изменилась.
Замечание: Проще и более аккуратно - использовать функцию DOS Fn 4cH Exit.
1
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 28
01.12.2011, 13:07  [ТС]
Честно... Не понял... Просто я что-то не пойму... Мне ведь нужно будет после преобразовывать введенную с клавиатуры строку, именно цифры, в циферную!? Или я что-то не понимаю?(
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16379 / 7691 / 1080
Регистрация: 11.11.2010
Сообщений: 13,774
01.12.2011, 13:54
demon2321
1)вверху цитата о функции 0 прерывания 21h -- это выход в DOS, а твой преподаватель пытается посоветовать в качестве ввода с клавиатуры

2) вводят строку из 1 цифры и ты знаешь, что цифра одна, вводят строку из 5 цифр и ты знаешь, что цифр 5, кроме того пользователь может и по буквам настучать, ты и это должен учесть. В Ввод и вывод чисел в различных системах счисления сообщение #2 раздел Ввод целого положительного или отрицательного числа числа всё очень хорошо написано, остается только вставить в программу, только почему-то никто это читать не хочет?
1
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 28
01.12.2011, 14:23  [ТС]
Теперь понял, мне тупо за место того моего кода, нужно воткнуть вот этот:
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
InputInt proc 
 
        mov ah,0ah
        xor di,di
        mov dx,offset buff ; аддрес буфера
        int 21h ; принимаем строку
        mov dl,0ah
        mov ah,02
        int 21h ; выводим перевода строки
        
; обрабатываем содержимое буфера
        mov si,offset buff+2 ; берем аддрес начала строки
        cmp byte ptr [si],"-" ; если первый символ минус
        jnz ii1
        mov di,1  ; устанавливаем флаг
        inc si    ; и пропускаем его
ii1:
        xor ax,ax
        mov bx,10  ; основание сc
ii2:
        mov cl,[si] ; берем символ из буфера
        cmp cl,0dh  ; проверяем не последний ли он
        jz endin
        
; если символ не последний, то проверяем его на правильность
        cmp cl,'0'  ; если введен неверный символ <0
    jl er
    cmp cl,'9'  ; если введен неверный символ >9
    ja er
 
        sub cl,'0' ; делаем из символа число 
        mul bx     ; умножаем на 10
        add ax,cx  ; прибавляем к остальным
        inc si     ; указатель на следующий символ
        jmp ii2     ; повторяем
 
er:   ; если была ошибка, то выводим сообщение об этом и выходим
        mov dx, offset error
        mov ah,09
        int 21h
        int 20h
 
; все символы из буфера обработаны число находится в ax
endin:
        cmp di,1 ; если установлен флаг, то
        jnz ii3
        neg ax   ; делаем число отрицательным
ii3:
        ret
 
error db "incorrect number$"
buff    db 6,7 Dup(?)
InputInt endp
Насколько я понял код, там присутствует обработка на знак минус еще, что мне тоже нужно, присутствует еще и нужный мне перевод числа! Все правильно понял?
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16379 / 7691 / 1080
Регистрация: 11.11.2010
Сообщений: 13,774
01.12.2011, 14:37
Цитата Сообщение от demon2321 Посмотреть сообщение
Насколько я понял код, там присутствует обработка на знак минус еще, что мне тоже нужно, присутствует еще и нужный мне перевод числа! Все правильно понял?
совершенно в дырочку! Отрицательных секунд не бывает...
1
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 28
01.12.2011, 19:13  [ТС]
Вот все поставил... Только там ошибка не пойму что за ошибка.... Посмотрите пожалуйста!4
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
.model small
.stack 100h
.data
 
Cr equ 0Dh ; \r
lf equ 0Ah ; \n
 
String  db 'Taimer', lf, cr, '$'
String2 db 'Vipolnil:', lf, cr, '$'
String3 db 'Korneev', lf, cr, '$'
String4 db 'Sergey', lf, cr, '$'
String5 db 'Igorevich', lf, cr, '$'
String6 db lf, cr, 'Nazhmite_klavishu_dlya_prodolzheniya...', lf, cr, '$'
 
String_initdb 'Schityvanie_vremeni', lf, cr, '$'
 
String_alarmdb 'Zvonok!', lf, cr, '$'
 
.code
main:
 
mov dx, 03DAh  ; Установка видеорежима
mov al, 10h
out dx, al
int 10h
 
mov dx, 03C0h  ; Установка значения регистра видеоадаптера
mov al, 00h
out dx, al
int 10h
 
    mov ax, @data  ; Настройка сегментного регистра
    mov ds, ax
 
    mov ah, 09h    ; Вывод текста
 
lea dx, String
int 21h
lea dx, String2
int 21h
lea dx, String3
int 21h
lea dx, String4
int 21h
lea dx, String5
int 21h
lea dx, String6
int 21h
 
mov ah, 00h    ; Задержка до нажатия клавиши
int 16h
 
    ;начало очистки экрана
    mov AX, 0600h  ; AH=06 (прокрутка), AL=00 (весь экран)        
    mov BH, 07     ; нормальный атрибут (черно/белый)
    mov CX, 0000   ; верхняя левая позиция
    mov DX, 184fh  ; нижняя правая позиция
int 10h        ; вызов BIOS
 
 
    mov ah, 09h    ; Вывод текста "Считывание времени"
lea dx, String_init
int 21h
 
mov ah, 02     ; Чтение текущего времени -> секунды в DH
int 1Ah
 
; mov ah,1
; int 21h
; sub al, 30h
; mul 10
; mov bl, al
; mov ah, 1
; int 21h
; sub al, 30h
; add bl, al
; mov al, bl
 
 
InputInt proc 
 
        mov ah,0ah
        xor di,di
        mov dx,offset buff ; аддрес буфера
        int 21h ; принимаем строку
        mov dl,0ah
        mov ah,02
        int 21h ; выводим перевода строки
        
; обрабатываем содержимое буфера
        mov si,offset buff+2 ; берем аддрес начала строки
        cmp byte ptr [si],"-" ; если первый символ минус
        jnz ii1
        mov di,1  ; устанавливаем флаг
        inc si    ; и пропускаем его
ii1:
        xor ax,ax
        mov bx,10  ; основание сc
ii2:
        mov cl,[si] ; берем символ из буфера
        cmp cl,0dh  ; проверяем не последний ли он
        jz endin
        
; если символ не последний, то проверяем его на правильность
        cmp cl,'0'  ; если введен неверный символ <0
    jl er
    cmp cl,'9'  ; если введен неверный символ >9
    ja er
 
        sub cl,'0' ; делаем из символа число 
        mul bx     ; умножаем на 10
        add ax,cx  ; прибавляем к остальным
        inc si     ; указатель на следующий символ
        jmp ii2     ; повторяем
 
er:   ; если была ошибка, то выводим сообщение об этом и выходим
        mov dx, offset error
        mov ah,09
        int 21h
        int 20h
 
; все символы из буфера обработаны число находится в ax
endin:
        cmp di,1 ; если установлен флаг, то
        jnz ii3
        neg ax   ; делаем число отрицательным
ii3:
        ret
 
error db "incorrect number$"
buff    db 6,7 Dup(?)
InputInt endp
 
 
mov ah, 06     ; Установка таймера
add dh, 5      ; Через 5 секунд
int 1Ah
 
push ds
 
lea dx, new_4a
MOV AX,SEG new_4a   ;сегментпроцедуры
MOV DS,AX   ;помещаем в DS
mov ah,25h
mov al,4Ah
int 21h
pop ds
 
mov ah, 07     ; Сбростаймера
int 1Ah
    
    mov ah, 00h    ; Задержка до нажатия клавиши
int 16h
 
exit:
 
mov ah, 49h    ; Освобождение памяти
int 21h
mov ah, 4Ch    ; Выход
int 21h
 
new_4aproc FAR
push AX
mov ah, 09h
lea dx, String_alarm
int 21h
pop AX
IRET
new_4aendp
 
end main
Добавлено через 2 минуты
Тут убрал ошибки:
Assembler
1
2
3
4
5
6
7
8
new_4a proc FAR
push AX
mov ah, 09h
lea dx, String_alarm
int 21h
pop AX
IRET
new_4a endp
Добавлено через 1 минуту
Что-то не так с
Assembler
1
end main
Добавлено через 2 минуты
С main разобрался, а почему-то не хочет в водить...
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16379 / 7691 / 1080
Регистрация: 11.11.2010
Сообщений: 13,774
02.12.2011, 09:08
Корнеев Сергей Игоревич,
а самостоятельно никак нельзя?
1) String_initdb 'Schityvanie_vremeni', lf, cr, '$'
String_alarmdb 'Zvonok!', lf, cr, '$'
new_4aproc FAR
new_4aendp пишутся раздельно
2) вывод String, String2, String3, String4, String5, String6
делается за один раз -- не нужно вызывать функцию 9 прерывания 21h 6 раз!
3) любая процедура должна располагаться в программе так, чтобы на нее не было передано управление случайно, и если процедуру new_4a ты поместил за выходом в ДОС, то почему не сделал то же самое с InputInt
4) почему строки buff db 6,7 Dup(?) и error db "incorrect number$" не помещены в сегмент данных?
5) почему после
Assembler
1
2
mov ah, 02     ; Чтение текущего времени -> секунды в DH
int 1Ah
идет тело процедуры InputInt с завершающей командой RET, которая выкинет пользователя ХЗ куда вместо команды call InputInt?
6) где вызов переопределенного прерывания int 4Ah? Ведь всё затеяно ради него?
7) если ошибки исправлены, то почему в программе они остались? Зачем я должен делать это дважды?
0
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 28
02.12.2011, 09:25  [ТС]
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
.model small
.stack 100h
.data
 
String error db "incorrect number$"
String  buff    db 6,7 Dup(?)
 
Cr equ 0Dh ; \r
lf equ 0Ah ; \n
 
String  db 'Taimer', lf, cr, '$'
String2 db 'Vipolnil:', lf, cr, '$'
String3 db 'Korneev', lf, cr, '$'
String4 db 'Sergey', lf, cr, '$'
String5 db 'Igorevich', lf, cr, '$'
String6 db lf, cr, 'Nazhmite_klavishu_dlya_prodolzheniya...', lf, cr, '$'
 
String_init db 'Schityvanie_vremeni', lf, cr, '$'
 
String_alarm db 'Zvonok!', lf, cr, '$'
 
.code
main:
 
mov dx, 03DAh  ; Установка видеорежима
mov al, 10h
out dx, al
int 10h
 
mov dx, 03C0h  ; Установка значения регистра видеоадаптера
mov al, 00h
out dx, al
int 10h
 
    mov ax, @data  ; Настройка сегментного регистра
    mov ds, ax
 
    mov ah, 09h    ; Вывод текста
 
lea dx, String
int 21h
lea dx, String2
int 21h
lea dx, String3
int 21h
lea dx, String4
int 21h
lea dx, String5
int 21h
lea dx, String6
int 21h
 
mov ah, 00h    ; Задержка до нажатия клавиши
int 16h
 
    ;начало очистки экрана
    mov AX, 0600h  ; AH=06 (прокрутка), AL=00 (весь экран)        
    mov BH, 07     ; нормальный атрибут (черно/белый)
    mov CX, 0000   ; верхняя левая позиция
    mov DX, 184fh  ; нижняя правая позиция
int 10h        ; вызов BIOS
 
 
    mov ah, 09h    ; Вывод текста "Считывание времени"
lea dx, String_init
int 21h
 
mov ah, 02     ; Чтение текущего времени -> секунды в DH
int 1Ah
 
call InputInt
 
mov ah, 06     ; Установка таймера
add dh, 5      ; Через 5 секунд
int 1Ah
 
push ds
 
lea dx, new_4a
MOV AX,SEG new_4a   ;сегментпроцедуры
MOV DS,AX   ;помещаем в DS
mov ah,25h
mov al,4Ah
int 21h
pop ds
 
mov ah, 07     ; Сбростаймера
int 1Ah
    
    mov ah, 00h    ; Задержка до нажатия клавиши
int 16h
 
exit:
 
mov ah, 49h    ; Освобождение памяти
int 21h
mov ah, 4Ch    ; Выход
int 21h
 
InputInt proc 
 
        mov ah,0ah
        xor di,di
        mov dx,offset buff ; аддрес буфера
        int 21h ; принимаем строку
        mov dl,0ah
        mov ah,02
        int 21h ; выводим перевода строки
        
; обрабатываем содержимое буфера
        mov si,offset buff+2 ; берем аддрес начала строки
        cmp byte ptr [si],"-" ; если первый символ минус
        jnz ii1
        mov di,1  ; устанавливаем флаг
        inc si    ; и пропускаем его
ii1:
        xor ax,ax
        mov bx,10  ; основание сc
ii2:
        mov cl,[si] ; берем символ из буфера
        cmp cl,0dh  ; проверяем не последний ли он
        jz endin
        
; если символ не последний, то проверяем его на правильность
        cmp cl,'0'  ; если введен неверный символ <0
    jl er
    cmp cl,'9'  ; если введен неверный символ >9
    ja er
 
        sub cl,'0' ; делаем из символа число 
        mul bx     ; умножаем на 10
        add ax,cx  ; прибавляем к остальным
        inc si     ; указатель на следующий символ
        jmp ii2     ; повторяем
 
er:   ; если была ошибка, то выводим сообщение об этом и выходим
        mov dx, offset error
        mov ah,09
        int 21h
        int 20h
 
; все символы из буфера обработаны число находится в ax
endin:
        cmp di,1 ; если установлен флаг, то
        jnz ii3
        neg ax   ; делаем число отрицательным
ii3:
        ret
 
error db "incorrect number$"
buff    db 6,7 Dup(?)
InputInt endp
 
 
new_4a proc FAR
push AX
mov ah, 09h
lea dx, String_alarm
int 21h
pop AX
IRET
new_4a endp
 
end main
Исправленный, вроде... Про вызов предопределенного прерывания int 4Ah я не пойму...
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16379 / 7691 / 1080
Регистрация: 11.11.2010
Сообщений: 13,774
02.12.2011, 09:47
demon2321, пункты 2 и 4 где?
0
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 28
02.12.2011, 09:54  [ТС]
Пункт 2 пусть такой и будет, иначе там куча проблем появляется! А пунк 4 я что-то не понял.... я Ведь занес все в .data! Или что то я не понимаю?(
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16379 / 7691 / 1080
Регистрация: 11.11.2010
Сообщений: 13,774
02.12.2011, 10:00
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.model small
.stack 100h
.data
 
Cr equ 0Dh ; \r
lf equ 0Ah ; \n
 
String  db 'Taimer', lf, cr, '$'
String2 db 'Vipolnil:', lf, cr, '$'
String3 db 'Korneev', lf, cr, '$'
String4 db 'Sergey', lf, cr, '$'
String5 db 'Igorevich', lf, cr, '$'
String6 db lf, cr, 'Nazhmite_klavishu_dlya_prodolzheniya...', lf, cr, '$' 
String_init db 'Schityvanie_vremeni', lf, cr, '$' 
String_alarm db 'Zvonok!', lf, cr, '$' 
.code
. . .
ii3:        ret 
error db "incorrect number$"
buff    db 6,7 Dup(?)
InputInt endp
где исправил? и убрать доллары из String-String5 охрененно сложно?
1
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 28
02.12.2011, 14:38  [ТС]
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
.model small
.stack 100h
.data
 
String error db "incorrect number$"
String  buff    db 6,7 Dup(?)
 
Cr equ 0Dh ; \r
lf equ 0Ah ; \n
 
String  db 'Taimer', lf, cr
String2 db 'Vipolnil:', lf, cr
String3 db 'Korneev', lf, cr
String4 db 'Sergey', lf, cr
String5 db 'Igorevich', lf, cr
String6 db lf, cr, 'Nazhmite_klavishu_dlya_prodolzheniya...', lf, cr, '$'
String_init db 'Schityvanie_vremeni', lf, cr, '$'
 
String_alarm db 'Zvonok!', lf, cr, '$'
 
.code
main:
 
mov dx, 03DAh  ; Установка видеорежима
mov al, 10h
out dx, al
int 10h
 
mov dx, 03C0h  ; Установка значения регистра видеоадаптера
mov al, 00h
out dx, al
int 10h
 
    mov ax, @data  ; Настройка сегментного регистра
    mov ds, ax
 
    mov ah, 09h    ; Вывод текста
 
lea dx, String
int 21h
lea dx, String2
int 21h
lea dx, String3
int 21h
lea dx, String4
int 21h
lea dx, String5
int 21h
lea dx, String6
int 21h
 
mov ah, 00h    ; Задержка до нажатия клавиши
int 16h
 
    ;начало очистки экрана
    mov AX, 0600h  ; AH=06 (прокрутка), AL=00 (весь экран)        
    mov BH, 07     ; нормальный атрибут (черно/белый)
    mov CX, 0000   ; верхняя левая позиция
    mov DX, 184fh  ; нижняя правая позиция
int 10h        ; вызов BIOS
 
 
    mov ah, 09h    ; Вывод текста "Считывание времени"
lea dx, String_init
int 21h
 
mov ah, 02     ; Чтение текущего времени -> секунды в DH
int 1Ah
 
call InputInt
 
mov ah, 06     ; Установка таймера
add dh, 5      ; Через 5 секунд
int 1Ah
 
push ds
 
lea dx, new_4a
MOV AX,SEG new_4a   ;сегментпроцедуры
MOV DS,AX   ;помещаем в DS
mov ah,25h
mov al,4Ah
int 21h
pop ds
 
mov ah, 07     ; Сбростаймера
int 1Ah
    
    mov ah, 00h    ; Задержка до нажатия клавиши
int 16h
 
exit:
 
mov ah, 49h    ; Освобождение памяти
int 21h
mov ah, 4Ch    ; Выход
int 21h
 
InputInt proc 
 
        mov ah,0ah
        xor di,di
        mov dx,offset buff ; аддрес буфера
        int 21h ; принимаем строку
        mov dl,0ah
        mov ah,02
        int 21h ; выводим перевода строки
        
; обрабатываем содержимое буфера
        mov si,offset buff+2 ; берем аддрес начала строки
        cmp byte ptr [si],"-" ; если первый символ минус
        jnz ii1
        mov di,1  ; устанавливаем флаг
        inc si    ; и пропускаем его
ii1:
        xor ax,ax
        mov bx,10  ; основание сc
ii2:
        mov cl,[si] ; берем символ из буфера
        cmp cl,0dh  ; проверяем не последний ли он
        jz endin
        
; если символ не последний, то проверяем его на правильность
        cmp cl,'0'  ; если введен неверный символ <0
    jl er
    cmp cl,'9'  ; если введен неверный символ >9
    ja er
 
        sub cl,'0' ; делаем из символа число 
        mul bx     ; умножаем на 10
        add ax,cx  ; прибавляем к остальным
        inc si     ; указатель на следующий символ
        jmp ii2     ; повторяем
 
er:   ; если была ошибка, то выводим сообщение об этом и выходим
        mov dx, offset error
        mov ah,09
        int 21h
        int 20h
 
; все символы из буфера обработаны число находится в ax
endin:
        cmp di,1 ; если установлен флаг, то
        jnz ii3
        neg ax   ; делаем число отрицательным
ii3:
        ret
 
error db "incorrect number$"
buff    db 6,7 Dup(?)
InputInt endp
 
 
new_4a proc FAR
push AX
mov ah, 09h
lea dx, String_alarm
int 21h
pop AX
IRET
new_4a endp
 
end main
Странно... Вроде в прошлый раз все исправленное кидал... А тогда строку
Assembler
1
String error db "incorrect number$"
Пади вот так надо записать
Assembler
1
String error db "incorrect number", if, cr
0
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 28
07.12.2011, 18: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
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
.model small
.stack 100h
.data
 
String_error db "incorrect number",lf,cr,'$'
String_buff db 6,7 Dup(?)
X db ?
 
Cr equ 0Dh ; \r
lf equ 0Ah ; \n
 
String  db 'Taimer', lf, cr, '$'
String2 db 'Vipolnil:', lf, cr, '$'
String3 db 'Korneev', lf, cr, '$'
String4 db 'Sergey', lf, cr, '$'
String5 db 'Igorevich', lf, cr, '$'
String6 db lf, cr, 'Nazhmite_klavishu_dlya_prodolzheniya...', lf, cr, '$'
String_init db 'Schityvanie_vremeni', lf, cr, '$'
 
String_alarm db 'Zvonok!', lf, cr, '$'
 
.code
main:
 
    mov ax, @data  ; Настройка сегментного регистра
    mov ds, ax
 
    mov ah, 09h    ; Вывод текста
 
lea dx, String
int 21h
lea dx, String2
int 21h
lea dx, String3
int 21h
lea dx, String4
int 21h
lea dx, String5
int 21h
lea dx, String6
int 21h
 
mov ah, 00h    ; Задержка до нажатия клавиши
int 16h
 
call InputInt
     
mov al, 0
Out 70h,al
In al, 71h
Mov x, al
mov al, 00h     
     
add x, al
cmp x, 59
jle m1
sub x, 60
 
m1:  
mov al, 0
Out 70h,al
In al, 71h 
                ;вот сюда я не знаю что вставить, чтобы преобразовать BCD  в десятичное число! Или можно наоборот, вводимое число в BCD!
cmp x, al
jne m1
 
exit:
 
mov ah, 4Ch    ; Выход
int 21h
 
InputInt proc 
 
        mov ah,0ah
        xor di,di
        mov dx,offset string_buff ; аддрес буфера
        int 21h ; принимаем строку
        ;mov dl,0ah
        ;mov ah,02
        ;int 21h ; выводим перевода строки
        
; обрабатываем содержимое буфера
        mov si,offset string_buff ; берем аддрес начала строки
        inc si
        inc si
ii1:
        xor ax,ax
        xor ch,ch
 
        mov bx,10  ; основание сc
ii2:
        mov cl,[si] ; берем символ из буфера
        cmp cl,0dh  ; проверяем не последний ли он
        jz endin
        
; если символ не последний, то проверяем его на правильность
    cmp cl,'0'  ; если введен неверный символ <0
    jl er
    cmp cl,'9'  ; если введен неверный символ >9
    ja er
 
        sub cl,'0' ; делаем из символа число 
        mul bx     ; умножаем на 10
        add ax,cx  ; прибавляем к остальным
        inc si     ; указатель на следующий символ
        jmp ii2     ; повторяем
 
er:   ; если была ошибка, то выводим сообщение об этом и выходим
        mov dx, offset string_error
        mov ah,09
        int 21h
        int 20h
 
; все символы из буфера обработаны число находится в ax
endin:
        ;cmp di,1 ; если установлен флаг, то
        ;jnz ii3
        ;neg ax   ; делаем число отрицательным
ii3:
        ret
 InputInt endp
 
 
end main
Miki, у меня такой вопросик.... Получается я складываю введенные мною десятичное число с числом в системе BCD! Как мне от этого избавиться??? Перевод из 10-ной системы в BCD я не знаю как описать!( Потому что я использую буфер... Помогите пожалуйста, как преобразовать десятичное число в число с системой счисления BCD!???
0
0 / 0 / 0
Регистрация: 12.09.2011
Сообщений: 28
14.12.2011, 20:24  [ТС]
Mikl___, помоги пожалуйста с программой, таймер работает все правильно, но там при сложении чисел получаются форматы BDC и десятичное число! Вот код:
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
.model small
.stack 100h
.data
 
String_error db "incorrect number",lf,cr,'$'
String_buff db 6,7 Dup(?)
X db ?
 
Cr equ 0Dh ; \r
lf equ 0Ah ; \n
 
String  db 'Taimer', lf, cr, '$'
String2 db 'Vipolnil:', lf, cr, '$'
String3 db 'Korneev', lf, cr, '$'
String4 db 'Sergey', lf, cr, '$'
String5 db 'Igorevich', lf, cr, '$'
String6 db lf, cr, 'Nazhmite_klavishu_dlya_prodolzheniya...', lf, cr, '$'
String_init db 'Schityvanie_vremeni', lf, cr, '$'
 
String_alarm db 'Zvonok!', lf, cr, '$'
 
.code
main:
 
    mov ax, @data  ; Настройка сегментного регистра
    mov ds, ax
 
    mov ah, 09h    ; Вывод текста
 
lea dx, String
int 21h
lea dx, String2
int 21h
lea dx, String3
int 21h
lea dx, String4
int 21h
lea dx, String5
int 21h
lea dx, String6
int 21h
 
mov ah, 00h    ; Задержка до нажатия клавиши
int 16h
 
call InputInt
     
mov al, 0
Out 70h,al
In al, 71h
Mov x, al
mov al, 00h     
     
add x, al
cmp x, 59
jle m1
sub x, 60
 
m1:  
mov al, 0
Out 70h,al
In al, 71h 
; 
cmp x, al
jne m1
 
exit:
 
mov ah, 4Ch    ; Выход
int 21h
 
InputInt proc 
 
        mov ah,0ah
        xor di,di
        mov dx,offset string_buff ; аддрес буфера
        int 21h ; принимаем строку
        ;mov dl,0ah
        ;mov ah,02
        ;int 21h ; выводим перевода строки
        
; обрабатываем содержимое буфера
        mov si,offset string_buff ; берем аддрес начала строки
        inc si
        inc si
ii1:
        xor ax,ax
        xor ch,ch
 
        mov bx,10  ; основание сc
ii2:
        mov cl,[si] ; берем символ из буфера
        cmp cl,0dh  ; проверяем не последний ли он
        jz endin
        
; если символ не последний, то проверяем его на правильность
    cmp cl,'0'  ; если введен неверный символ <0
    jl er
    cmp cl,'9'  ; если введен неверный символ >9
    ja er
 
        sub cl,'0' ; делаем из символа число 
        mul bx     ; умножаем на 10
        add ax,cx  ; прибавляем к остальным
        inc si     ; указатель на следующий символ
        jmp ii2     ; повторяем
 
er:   ; если была ошибка, то выводим сообщение об этом и выходим
        mov dx, offset string_error
        mov ah,09
        int 21h
        int 20h
 
;все символы из буфера обработаны число находится в ax
endin:
        ;cmp di,1 ; если установлен флаг, то
        ;jnz ii3
        ;neg ax   ; делаем число отрицательным
ii3:
        ret
 InputInt endp
 
end main
Слушай... Правда очень надо, зачетная неделя и мне надо это задание сдать в понедельник следующий... Помоги пожалуйста! Поправь как надо! А то я пытался преобразовывать сложение командами AAA или DAA и что-то не помогает( Потом понял, что команды AAA и DAA работают только с аски кодами! Верно? Помоги пожалуйста! Очень прошу!!!
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
14.12.2011, 20:31
demon2321, серьезно говорю. Давить на жалость бесполезно. Можешь прикинуться девкой - так больше шансов на помощь, но с миклом и это не пройдет )) просто показывай ему, что тч что-то делаешь а не просто балду пинаешь в перерывах между его постами и все)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.12.2011, 20:31

Программа(консольная) работает и одновременно ждет данные от клавиатуры. Как?
Консольная программа. Например, рассмотрит игру &quot;змейка&quot;. В этой игре одновременно змейка ползет и ждет данные от клавиатуры. Но если...

Вводим с клавиатуры число - день от начала года и надо получить дату этого дня
помогите пожалуйста с задачей, в С++ не очень понимаю, а зачет без этой задачки не получу:) или хотя бы идейку подкиньте какую-нибудь. ...

После ввода времени в минутах программа выводит, какое расстояние в метрах пройдёт свет за это время
Выполнил данную задачу, но преподаватель сказал что не верно, вставляю код, подскажите в чём ошибка :D t = float(input(&quot;Введите...

Пользователь вводит время в Днях,часах,минутах и секундах,программа переводит все в секунды
Пользователь вводит время в Днях,часах,минутах и секундах,программа переводит все в секунды

Вводим число и программа должна показать сколько от 0 до этого числа четных чисел
Это из школьной программы, возможно у когонить есть программы выполняющие действия 1)Программа подсчитывающая по граммам цену конфет ...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru