Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
 
vivatverum
0 / 0 / 2
Регистрация: 05.11.2016
Сообщений: 51
1

Чтение двух трехзначных чисел и вывод их суммы на консоль

13.11.2017, 01:24. Просмотров 339. Ответов 6

Доброй ночи! Условие: с использованием API-функций создать консоль, считать из неё два трехзначных числа и вывести их сумму. Совместными усилиями меня и интернета программа есть, но не до конца написанная. Я не понимаю как происходит считывание строк в ней. Задаю 3 символа для чтения и для первой, и для второй строки. Никак не пойму когда именно наступает запись символов в консоли для первой строки. Когда именно начинается чтение во вторую строку? Пыталась написать между ними ожидание нажатия клавиши через функцию 10h прерывания 16h, но тогда не происходило ничего, даже когда клавиша нажималась. Помогите, пожалуйста, разобраться.

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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
;cons2.asm
.586P
;плоская модель памяти
.MODEL FLAT, stdcall
 
;константы
STD_OUTPUT_HANDLE equ -11
STD_INPUT_HANDLE equ -10
 
;атрибуты цветов
FOREGROUND_BLUE equ 1h ; синий цвет букв
FOREGROUND_GREEN equ 2h ; зеленый цвет букв
FOREGROUND_RED equ 4h ; красный цвет букв
FOREGROUND_INTENSITY equ 8h ; повышенная интенсивность
BACKGROUND_BLUE equ 10h ; синий свет фона
BACKGROUND_GREEN equ 20h ; зеленый цвет фона
BACKGROUND_RED equ 40h ; красный цвет фона
BACKGROUND_INTENSITY equ 80h ; повышенная интенсивность
COL1 = 1h+20h ; цвет выводимого текст
COL2 = 1h+2h+8h ; другой цвет выводимого текста
 
;прототипы внешних процедур
EXTERN GetStdHandle@4:NEAR
EXTERN WriteConsoleA@20:NEAR
EXTERN SetConsoleCursorPosition@8:NEAR
EXTERN SetConsoleTitleA@4:NEAR
EXTERN FreeConsole@0:NEAR
EXTERN AllocConsole@0:NEAR
EXTERN CharToOemA@8:NEAR
EXTERN SetConsoleCursorPosition@8:NEAR
EXTERN SetConsoleTextAttribute@8:NEAR
EXTERN ReadConsoleA@20:NEAR
EXTERN SetConsoleScreenBufferSize@8:NEAR
EXTERN ExitProcess@4:NEAR
 
;директивы компоновщику для подключения библиотек
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
;-----------------------------------------------
COOR STRUC
 X WORD ?
 Y WORD ?
COOR ENDS
;сегмент данных
_DATA SEGMENT
 HANDL DWORD ?
 HANDL1 DWORD ?
 PEREM DB ?
 STR1 DB "Введите два трехзначных числа:",10,10,0
 STR2 DB "Автор^^",0
 STR3 DB ?,0
 BUF1 DB 4 dup(?)
 BUF2 DB 4 dup(?)
 LENS DWORD ? ; количество выведенных символов
 CRD COOR <?>
_DATA ENDS
;сегмент кода
_TEXT SEGMENT
 
convert_char proc
sub al,'0'
cmp al,10
jb done 
add al,'0' 
and al,005fh
sub al,'A'-1O
and al,000fh
done:
ret
convert_char endp 
 
STR2NUM proc
push esi
xor eax,eax
xor ebx,ebx
cmp byte ptr [esi],'-'
jnz next
inc esi
next:
lodsb
or al,al
jz done
call convert_char
imul ebx,ecx
add ebx,eax
jmp short next
done:
xchg ebx,eax
pop esi
cmp byte ptr [esi],'-'
jz negate
ret
negate:
neg eax
ret 
STR2NUM endp
 
HexDigit proc
cmp dl, 10
jb less
add dl,'A'-10
ret
less :
or dl,'0'
ret
HexDigit endp
 
NUM2STR proc
pushad
xor esi,esi
convert_loop: 
xor edx,edx
div ebx
call HexDigit
push edx
inc esi
test eax,eax
jnz convert_loop
cld
write_loop:
pop eax
stosb
dec esi
test esi,esi
jnz write_loop
mov byte ptr [edi],0
popad
ret
NUM2STR endp
 
START:
;перекодируем строки
PUSH OFFSET STR1
PUSH OFFSET STR1
CALL CharToOemA@8
PUSH OFFSET STR2
PUSH OFFSET STR2
CALL CharToOemA@8
;образовать консоль
;вначале освободить уже существующую
CALL FreeConsole@0
CALL AllocConsole@0
;получить HANDL1 ввода
PUSH STD_INPUT_HANDLE
CALL GetStdHandle@4
MOV HANDL1,EAX
;получить HANDL вывода
PUSH STD_OUTPUT_HANDLE
CALL GetStdHandle@4
MOV HANDL,EAX
;установить новый размер окна консоли
MOV CRD.X,100
MOV CRD.Y,25
PUSH CRD
PUSH EAX
CALL SetConsoleScreenBufferSize@8
 
;задать заголовок окна консоли
PUSH OFFSET STR2
CALL SetConsoleTitleA@4
 
;установить позицию курсора
MOV CRD.X,20
MOV CRD.Y,5
PUSH CRD
PUSH HANDL
CALL SetConsoleCursorPosition@8
 
;задать цветовые атрибуты выводимого текста
PUSH COL1
PUSH HANDL
CALL SetConsoleTextAttribute@8
 
;вывести строку
PUSH OFFSET STR1
CALL LENSTR
PUSH 0
PUSH OFFSET LENS
PUSH EBX
PUSH OFFSET STR1
PUSH HANDL
CALL WriteConsoleA@20
 
;ждать ввод строки
PUSH 0
PUSH OFFSET LENS
PUSH 4
PUSH OFFSET BUF1
PUSH HANDL1
CALL ReadConsoleA@20
 
;перевод строки в число
mov esi, offset buf1
mov ecx, 10
call STR2NUM
 
mov ebx, eax
 
;ждать ввод строки
PUSH 0
PUSH OFFSET LENS
PUSH 3
PUSH OFFSET BUF2
PUSH HANDL1
CALL ReadConsoleA@20
 
;перевод строки в число
mov esi, offset buf2
mov ecx, 10
call STR2NUM
 
add eax, ebx
 
;перевод числа в строку
mov ebx, 10
mov edi, offset buf1
call NUM2STR
 
;вывести полученную строку
;вначале задать цветовые атрибуты выводимого текста
PUSH COL2
PUSH HANDL
CALL SetConsoleTextAttribute@8
;-------------------------------------
PUSH OFFSET BUF1
CALL LENSTR
PUSH 0
PUSH 3
PUSH EBX ; длина вводимой строки
PUSH OFFSET BUF1
PUSH HANDL
CALL WriteConsoleA@20
 
;небольшая задержка
MOV ECX,01FFFFFFFH
L1:
LOOP L1
;закрыть консоль
CALL FreeConsole@0
CALL ExitProcess@4
 
LENSTR PROC
 ENTER 0,0
 PUSH EAX
 PUSH EDI
;--------------------
 CLD
 MOV EDI,DWORD PTR [EBP+08H]
 MOV EBX,EDI
 MOV ECX,4 ; ограничить длину строки
 XOR AL,AL
 REPNE SCASB ; найти символ 0
 SUB EDI,EBX ; длина строки, включая 0
 MOV EBX,EDI
 DEC EBX
;--------------------
 POP EDI
 POP EAX
 LEAVE
 RET 4
LENSTR ENDP 
_TEXT ENDS
END START
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2017, 01:24
Ответы с готовыми решениями:

Вывод чисел-байтов на консоль
В коде ниже вводится три байтовые переменные целочисленного типа и выводятся на...

сделать вывод чисел полчиных в цикле в строку на консоль
Здравствуйте жители сайта ,решил научиться самостоятельно прогать на (TASM) -...

Сложение двух переменных и вывод их суммы
Напишите минимальный пример сложения двух переменных и вывод их суммы в masm

Чтение списка чисел со стандартного ввода и вывод суммы этих чисел
Добрый день! Помогите пожалуйста НОВИЧКУ написать следующий скрипт: ...

Вывод суммы двух чисел, введенных с клавиатуры
как ето зделать на С# с классами немогу найти (

6
ФедосеевПавел
Модератор
3856 / 2177 / 894
Регистрация: 01.02.2015
Сообщений: 7,248
13.11.2017, 08:44 2
Чтение в строку начинается с момента обращения к ReadConsole.
Поищите отладчик ollydbg или w64dbg и запустите программу по шагам в нём. Будут видны изменения переменных, регистров.

Прерывания int не нужно использовать - это из другой ОС (DOS), которая по недоразумению ещё может работать на многих компьютерах.
0
vivatverum
0 / 0 / 2
Регистрация: 05.11.2016
Сообщений: 51
13.11.2017, 12:11  [ТС] 3
А когда чтение заканчивается? Сразу же после прочтения указанных 3, а вернее даже 4 символов или нет? А если нет, то как понять когда начнется вызов второй ReadConsole?
0
ФедосеевПавел
Модератор
3856 / 2177 / 894
Регистрация: 01.02.2015
Сообщений: 7,248
13.11.2017, 21:20 4
Я думал, что ReadConsole завершается нажатием Enter - поэтому в буфере два последних символа это "перевод строки".

Вы меня прямо озадачили вопросом, что будет при переполнении буфера...
0
R71MT
4632 / 1438 / 306
Регистрация: 29.07.2014
Сообщений: 2,476
Записей в блоге: 5
13.11.2017, 22:03 5
vivatverum, для работы с числами, WIN имеет специальные API -- scanf (ввод числа с клавиатуры) и printf для их вывода на консоль. ReadConsole предназначена не для чисел, а для строк. В результате, 3/4 вашего кода становится рудиментым, и его можно будет удалить.
Почитайте про эти функции например здесь или здесь
0
ФедосеевПавел
Модератор
3856 / 2177 / 894
Регистрация: 01.02.2015
Сообщений: 7,248
13.11.2017, 23:18 6
R71MT, это не WinAPI, а mvcrt. К тому же студенты действуют по методичке, хотя дополнительные знания не повредят.

А вот у меня и эта программа и программа однокурсника vivatverum выполняется не совсем ожидаемо - не позиционируется курсор для вывода на экран. Не можете подсказать причины?

[MASM32] Вывод в консольное окно текста заданным цветом в указанной позиции и ожидание нажатия клавиши левый Alt

Добавлено через 1 час 6 минут
vivatverum, эксперимент с уменьшением буфера ввода до 5 элементов (3 символа это цифры и два - перевод строки) и ввода строки на 15-20 элементов, показал, что в консоли где-то накапливаются символы, а потом они по запросу копируются в буфер пользовательской программы.

Т.е. нужно городить какой-то огород для "защиты" от неправильного ввода.
Если это не критично - то вводите по три символа.
0
R71MT
4632 / 1438 / 306
Регистрация: 29.07.2014
Сообщений: 2,476
Записей в блоге: 5
14.11.2017, 00:31 7
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
это не WinAPI
..да без разницы такие тонкости, главное что это работает.
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
что в консоли где-то накапливаются символы
не в консоли они накапливаются, а в системной очереди сообщений Win.
по Enter - эта очередь сбрасывается в буфер активного окна.

Эти методички сейчас пишут все кому не лень, и их наличие никак не запрещает использовать своё серое вещество. Мало-ли что там сказал препод (и сказал-ли вообще)? Нужно искать лёгкие пути, а не заниматься подобными извращениями. Главное - результат.
1
14.11.2017, 00:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2017, 00:31

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

Вычислить суммы трехзначных чисел
Составьте программу вычисления суммы трехзначных чисел, в десятичной записи...

Простейшая программа, вывод на экран суммы, разности двух чисел. Ошибка
Пишу свою вторую программу на C++, Программа просит пользователя ввести два...


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

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

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