Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/34: Рейтинг темы: голосов - 34, средняя оценка - 4.85
1 / 1 / 1
Регистрация: 08.10.2016
Сообщений: 28
1

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

12.11.2017, 19:59. Показов 6473. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите, переписать с использованием функций API программу, создающую консольное приложение Windows. Она должна создать свою консоль, вывести приглашение к вводу данных, затем, ввести их, вычислить и вывести результат. После заданного события программа должна завершить свою работу.
Вот сам вариант задания: Цвет фона – черный, символов – красный, позиция 20, 10, событие – нажат левый ALT
Программа должна быть в MASM32. Есть код, от которого можно отталкиватсья, вот только, на сколько я понимаю, он в FASM, всё, может, поможет, а то я в Assembler не сильно разбираюсь. Заранее, большое спасибо!
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
.386p
.model flat, stdcall
STD_INPUT_HANDLE equ10
STD_OUTPUT_HANDLE equ11
includelib c:\tasm\lib\import32.lib
extrn GetStdHandle:proc
extrn WriteConsoleA:proc
extrn ExitProcess:proc
extrn FreeConsole:proc
extrn AllocConsole:proc
extrn SetConsoleTextAttribute:proc
.data
    hnd dd ?
    hnd1 dd ?
    stroka db "консольный вывод",0
    lens dd ?
    res dd ?
    buf db 100 dup (?)
    lens1 dd ?
.code
_main proc
call FreeConsole
call AllocConsole
;
push STD_OUTPUT_HANDLE
call GetStdHandle
mov hnd, eax
;
push STD_INPUT_HANDLE
call GetStdHandle
mov hnd1, eax
;
push 8ch hnd
call SetConsoleTextAttribute
;
push 0 offset lens 17 offset stroka hnd
call WriteConsoleA
;
infcyc:
push offset lens1 1 offset buf hnd1
call ReadConsoleInputA
;
; если событие консоли произошло от мыши и если двойное
; слово по смещению 16 от начала структуры равно 2,
; то был DoubleClick.
; В бесконечном цикле опрашиваем консоль в ожидании
; DoubleClick, реализуя задержку.
;
cmp word ptr buf,2
jne infcyc
cmp dword ptr buf[16],2 
jne infcyc
;
push 0
call ExitProcess
;
_main endp
end _main
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.11.2017, 19:59
Ответы с готовыми решениями:

Вывод текста на консольное окно
Всем привет! подскажите пожалуйста, во время вывода текста как перевести курсор на следующую строку?

Вывод графических элементов: строки текста заданным цветом и шрифтом
Вывести на экран монитора горизонтальная строка текста длиной не более двадцати пяти символов...

Вывод текста на экран во время ожидания нажатия клавиши.
Языс C, компилятор Borland C++ 3.1 for DOS. Прошу помочь и ответить на мой вопрос. Я пишу игру,...

Ожидание нажатия клавиши
У меня ниже представлен код. Как сделать что б на указанном участке прорамма приостановилась и...

10
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
12.11.2017, 20:06 2
А как определять нажатие клавиши Left Alt средствами WinAPI?
0
1 / 1 / 1
Регистрация: 08.10.2016
Сообщений: 28
12.11.2017, 20:19  [ТС] 3
Не уверен, но к заданию прилогается это
Вложения
Тип файла: docx Приложение.docx (21.9 Кб, 15 просмотров)
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
12.11.2017, 20:55 4
Там только коды виртуальных клавиш. А как получить код виртуальной клавиши средствами WinAPI?

Я - не знаю. Буду ждать.
0
Asm/C++/Delphi/Py/PHP/VBA
6528 / 1973 / 228
Регистрация: 14.12.2014
Сообщений: 4,125
Записей в блоге: 12
12.11.2017, 23:07 5
Нажата, если GetAsyncKeyState(VK_LMENU) and 8000h <> 0
1
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
12.11.2017, 23:34 6
Лучший ответ Сообщение было отмечено LoneProphet как решение

Решение

Jin X, а ещё подскажите, если знаете
Набрал такой код
1. ввод 2-х чисел
2. сложение
3. изменение цвета (успешно)
4. перемещение курсора (при пошаговой отладке в ollydbg вижу, что курсор переместился)
5. вывожу строку при помощи WriteConsole - цвет нужный, а курсор переместился лишь по вертикали, а по горизонтали - начало строки.

Не пойму, почему нет перемещения курсора.

Код уже успел затереть, пока отвечал на другие вопросы форума. Минут через 10 воспроизведу ещё раз.

Добавлено через 9 минут
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
.486
.model flat, stdcall
option casemap :none
 
        include \masm32\include\windows.inc
 
        include \masm32\include\user32.inc
        include \masm32\include\kernel32.inc
        include \masm32\include\masm32.inc
 
        includelib \masm32\lib\user32.lib
        includelib \masm32\lib\kernel32.lib
        includelib \masm32\lib\masm32.lib
.data
        X               dq      ?
        Y               dq      ?
        Result          dq      ?
 
        aszPromptX      db      0Dh, 0Ah, 'Enter the X: ', 0
        aszPromptY      db      0Dh, 0Ah, 'Enter the Y: ', 0
        aszMsgResult    db      0Dh, 0Ah, 'Result: ', 0
        aszPressEnter   db      0Dh, 0Ah, 0Dh, 0Ah, "Press ENTER to exit", 0
        hConsoleOutput  HANDLE  ?
        hConsoleInput   HANDLE  ?
        dwColor         dd      FOREGROUND_RED
        dwCursorPosition        COORD   <20, 10>
        Buffer          db      1024 dup(?)
        BufLen          dd      ?
.code
 
start:
 
        ; получение описателей ввода и вывода консоли
        invoke  GetStdHandle,   STD_INPUT_HANDLE
        mov     hConsoleInput,  eax
 
        invoke  GetStdHandle,   STD_OUTPUT_HANDLE
        mov     hConsoleOutput, eax
 
        invoke  ClearScreen
        ;ввод X
        invoke  WriteConsole, hConsoleOutput, ADDR aszPromptX,\
                LENGTHOF aszPromptX - 1, ADDR BufLen, NULL
        invoke  ReadConsole, hConsoleInput, ADDR Buffer,\
                LENGTHOF Buffer, ADDR BufLen, NULL
        lea     esi,    [Buffer]        ;удаление символов
        add     esi,    [BufLen]        ;перевода строки
        sub     esi,    2               ;из буфера ввода
        mov     [esi], word ptr 0
        finit
        invoke  StrToFloat, ADDR Buffer, ADDR X
        ;ввод Y
        invoke  WriteConsole, hConsoleOutput, ADDR aszPromptY,\
                LENGTHOF aszPromptY - 1, ADDR BufLen, NULL
        invoke  ReadConsole, hConsoleInput, ADDR Buffer,\
                LENGTHOF Buffer, ADDR BufLen, NULL
        lea     esi,    [Buffer]        ;удаление символов
        add     esi,    [BufLen]        ;перевода строки
        sub     esi,    2               ;из буфера ввода
        mov     [esi], word ptr 0
        finit
        invoke  StrToFloat, ADDR Buffer, ADDR Y
 
        finit
        fld     [X]
        fld     [Y]
        faddp   st(1),  st(0)
        ;сохранение результата
        fstp    [Result]
        ;очистка FPU
        finit
        ;вывод результата
        ; - смена цвета
        invoke  SetConsoleTextAttribute, hConsoleOutput, [dwColor]
        ; - установка позиции
        invoke  SetConsoleCursorPosition, hConsoleOutput, dword ptr [dwCursorPosition]
        ; - вывод
        invoke  WriteConsole, hConsoleOutput, ADDR aszMsgResult,\
                LENGTHOF aszMsgResult - 1, ADDR BufLen, NULL
        invoke  FloatToStr2, [Result], ADDR Buffer
        invoke  StrLen, ADDR Buffer
        mov     [BufLen],       eax
        invoke  WriteConsole, hConsoleOutput, ADDR Buffer,\
                BufLen, ADDR BufLen, NULL
 
        ;ожидание нажатия ENTER
        invoke  WriteConsole, hConsoleOutput, ADDR aszPressEnter,\
                LENGTHOF aszPressEnter - 1, ADDR BufLen, NULL
        invoke  ReadConsole, hConsoleInput, ADDR Buffer,\
                LENGTHOF Buffer, ADDR BufLen, NULL
 
        invoke  ExitProcess, 0
 
end start
0
1 / 1 / 1
Регистрация: 08.10.2016
Сообщений: 28
13.11.2017, 22:33  [ТС] 7
Спасибо, что снова помогаете мне с заданием. Все же, интересно, если изменить
Assembler
1
aszPressEnter
везде на
Assembler
1
aszPressAlt
программа будет закрываться по нажатию Alt? Я попробовал, всё собралось, только .exe не запускается. Просто не запускается, никаких ошибок.
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
13.11.2017, 22:46 8
Нет - если пуделя подстричь как льва - он останется пуделем.

Закрытие по Alt описал Jin X. Нужно только почитать об этом.

Странно, что у вас собралось, но не запустилось. Я компилировал из qeditor как консольное приложение, потом запускал.
Миниатюры
[MASM32] Вывод в консольное окно текста заданным цветом в указанной позиции и ожидание нажатия клавиши левый Alt  
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
13.11.2017, 22:56 9
Так. Нашёл причину, почему результат не выводился в нужной позиции. В моей программе в строке 21 нужно удалить перевод строки 0Dh, 0Ah, перед текстом строки.

Добавлено через 50 секунд
Вернее причина другая - нужно вовремя ложиться спать.
0
1 / 1 / 1
Регистрация: 08.10.2016
Сообщений: 28
13.11.2017, 22:56  [ТС] 10
Понял, то у меня пудель не запустился, со львом всё в порядке
Спасибо! Здорового Вам сна
0
Модератор
Эксперт по электронике
8476 / 4335 / 1642
Регистрация: 01.02.2015
Сообщений: 13,461
Записей в блоге: 8
13.11.2017, 23:26 11
С учётом двух исправлений, получается
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
.486
.model flat, stdcall
option casemap :none
 
        include \masm32\include\windows.inc
 
        include \masm32\include\user32.inc
        include \masm32\include\kernel32.inc
        include \masm32\include\masm32.inc
 
        includelib \masm32\lib\user32.lib
        includelib \masm32\lib\kernel32.lib
        includelib \masm32\lib\masm32.lib
.data
        X               dq      ?
        Y               dq      ?
        Result          dq      ?
 
        aszPromptX      db      0Dh, 0Ah, 'Enter the X: ', 0
        aszPromptY      db      0Dh, 0Ah, 'Enter the Y: ', 0
        aszMsgResult    db      'Result: ', 0
        aszPressEnter   db      0Dh, 0Ah, 0Dh, 0Ah, "Press ENTER to exit", 0
        hConsoleOutput  HANDLE  ?
        hConsoleInput   HANDLE  ?
        dwColor         dd      FOREGROUND_RED
        dwCursorPosition        COORD   <20, 10>
        Buffer          db      5 dup(?)
        BufLen          dd      ?
.code
 
start:
 
        ; получение описателей ввода и вывода консоли
        invoke  GetStdHandle,   STD_INPUT_HANDLE
        mov     hConsoleInput,  eax
 
        invoke  GetStdHandle,   STD_OUTPUT_HANDLE
        mov     hConsoleOutput, eax
 
        invoke  ClearScreen
        ;ввод X
        invoke  WriteConsole, hConsoleOutput, ADDR aszPromptX,\
                LENGTHOF aszPromptX - 1, ADDR BufLen, NULL
        invoke  ReadConsole, hConsoleInput, ADDR Buffer,\
                LENGTHOF Buffer, ADDR BufLen, NULL
        lea     esi,    [Buffer]        ;удаление символов
        add     esi,    [BufLen]        ;перевода строки
        sub     esi,    2               ;из буфера ввода
        mov     [esi], word ptr 0
        finit
        invoke  StrToFloat, ADDR Buffer, ADDR X
        ;ввод Y
        invoke  WriteConsole, hConsoleOutput, ADDR aszPromptY,\
                LENGTHOF aszPromptY - 1, ADDR BufLen, NULL
        invoke  ReadConsole, hConsoleInput, ADDR Buffer,\
                LENGTHOF Buffer, ADDR BufLen, NULL
        lea     esi,    [Buffer]        ;удаление символов
        add     esi,    [BufLen]        ;перевода строки
        sub     esi,    2               ;из буфера ввода
        mov     [esi], word ptr 0
        finit
        invoke  StrToFloat, ADDR Buffer, ADDR Y
 
        finit
        fld     [X]
        fld     [Y]
        faddp   st(1),  st(0)
        ;сохранение результата
        fstp    [Result]
        ;очистка FPU
        finit
        ;вывод результата
        ; - смена цвета
        invoke  SetConsoleTextAttribute, hConsoleOutput, [dwColor]
        ; - установка позиции
        invoke  SetConsoleCursorPosition, hConsoleOutput, dword ptr [dwCursorPosition]
        ; - вывод
        invoke  WriteConsole, hConsoleOutput, ADDR aszMsgResult,\
                LENGTHOF aszMsgResult - 1, ADDR BufLen, NULL
        invoke  FloatToStr2, [Result], ADDR Buffer
        invoke  StrLen, ADDR Buffer
        mov     [BufLen],       eax
        invoke  WriteConsole, hConsoleOutput, ADDR Buffer,\
                BufLen, ADDR BufLen, NULL
 
        ;ожидание нажатия Left Alt
        @@WaitForLAlt:
                invoke  GetAsyncKeyState, VK_LMENU
                and     eax,    8000h
        jz      @@WaitForLAlt
 
        ;завершение программы
        invoke  ExitProcess, 0
 
end start
1
13.11.2017, 23:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2017, 23:26
Помогаю со студенческими работами здесь

Ожидание нажатия клавиши
А подскажите пожалуйста, как в С++ сделать так, чтобы программа, написанная в консольных...

Ожидание нажатия клавиши (sh скрипт)
Доброго времени суток. У меня появилась необходимость запускать скрипт при старте ОС. Добавил...

Ожидание нажатия клавиши в jTextField
Хочу реализовать такую штуку: в поле jTextArea задается вопрос, например: &quot;Введите имя&quot;, затем...

Пауза (ожидание нажатия любой клавиши)
В windows паузу можно сделать через getch(), которая хранится в conio.h. А убунту почему-то не...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru