Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
15 / 14 / 3
Регистрация: 29.03.2015
Сообщений: 78
1

По какому адресу находится буфер консоли?

29.03.2015, 16:45. Просмотров 1362. Ответов 7
Метки нет (Все метки)


Этот код позволяет под BC++ 3.1
выводить символ в заданную позицию экрана,
но почему-то он не работает под MinGW GCC.
С какого адреса все же начинается буффер консоли в памяти?
Извиняюсь, что у меня нет кода на ассемблере.
Пишу сюда в надежде, что кто-нибудь поймет в чем ошибка, вы более точно знаете адрес начала консоли в памяти ЭВМ. Windows 7, 8, 32-64 bits
C++
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
          # include <stdio.h>
          # include <conio.h>
          # include <iostream>
          # include <windows.h>
 
          void print_xy (
                          int x, // абсцисса
                          int y, // ордината
                          char s, // cимвол
                          int color, // цвет символа
                          int fon // фон символа
                        )
          {
            // Этот код компилируется под Borland C++ 3.1 и
            // и программа работает под Windows 7 32 bit
            
            // Но этот код хотя и компилируется под TDM-GCC Dev-C++
            // но, увы, не работает под Windows 7 32 bit -
            // зависает с ошибкой :-(
            
            // Код нужен, для того, чтобы постоянно выводить
            // текущее время в опредленные позиции консоли во
            // во время работы текстового редактора
 
            /*
              // MSP, 15.01.99, 10:54
              молниеносный вывод символа на экран, через видеопамять.
              модель памяти Large
 
              Иногда бывает удобно или необходимо изменить модель памяти
              для отдельных функций или данных. Это изменение можно
              произвести с помощью модификаторов near, far и huge.
 
              char far *
                data;
 
              Указатель data теперь является дальним указателем независимо
              от того, какая модель памяти указана компилятору при обработке
              программы.
              Я указал Compact. А для data будет работать Large.
            */
 
            /*
              MSP, 23.03.15, 21:46
              По каким адресам располагается окно консоли?
              Это правильный код?
            */
 
            char far * v_mem = (char far *) 0xb8000000L;
 
            v_mem += (x - 1) * 2 + (y - 1) * 160;
            * v_mem ++ = s;
            * v_mem = color + (fon * 16);
 
          } // end void print_xy (int, int, char, int, int)
          
          using namespace std;
 
                    int main ()
          {
            system ("cls");
            
            // молниеносный вывод белого символа на синем фоне символа (!)
            // в позицию (10, 8) экрана консоли,
            // при молниеносном выводе
            // курсор отключен, его не видно, он не мигает
            print_xy (10, 8, '!', 15, 1);
            
            getch ();
            
            return 0;
          }
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2015, 16:45
Ответы с готовыми решениями:

По какому адресу находится находится SMBus?
Всем привет. Как подобраться к шине SMBus? Есть какой-нибудь стадартный адрес? Поясните, кто в...

По какому адресу находится база данных?
Вот, например, есть некоторый сайт http://something.com/, также имеется доступ к php коду (...

По какому адресу находится служба поддержки Angular?
Извините за банальный вопрос, но всё-таки: по какому адресу находится служба поддержки Angular? У...

По какому адресу писать в Гугл?
По двум связанным запросам вылетел из выдачи Гугла напрочь, раньше был ТОП 3. Ничего особенного с...

7
3170 / 1929 / 313
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
29.03.2015, 16:52 2
Цитата Сообщение от MSP_cyber Посмотреть сообщение
Windows 7, 8, 32-64 bits
Там немного не так, как в DOS :-)

Console Functions

FillConsoleOutputCharacter
1
15 / 14 / 3
Регистрация: 29.03.2015
Сообщений: 78
29.03.2015, 17:19  [ТС] 3
gazlan, Cпасибо!

Скорее всего буффер будет "плавать".
0
3170 / 1929 / 313
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
31.03.2015, 12:05 4
Лучший ответ Сообщение было отмечено Mikl___ как решение

Решение

Старое DEMO от MS
0
Вложения
Тип файла: 7z ms_console.7z (36.1 Кб, 25 просмотров)
4076 / 1791 / 210
Регистрация: 06.10.2010
Сообщений: 4,001
31.03.2015, 13:23 5
Я вот подумал: вывод в консоль ведь можно осуществлять через WriteFile, так ведь? А что если смапить консоль через CreateFileMapping/MapViewOfFile?
0
3170 / 1929 / 313
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
31.03.2015, 14:20 6
Все уже укра придумано до вас :-)

Буфер консоли можно адресовать напрямую: CreateConsoleScreenBuffer
A console can have multiple screen buffers but only one active screen buffer. Inactive screen buffers can be accessed for reading and writing, but only the active screen buffer is displayed. To make the new screen buffer the active screen buffer, use the SetConsoleActiveScreenBuffer function.
0
4076 / 1791 / 210
Регистрация: 06.10.2010
Сообщений: 4,001
31.03.2015, 16:44 7
Я посмотрел прототип функции CreateConsoleScreenBuffer, но последний параметр согласно документации не работает.
lpScreenBufferData
Reserved; should be NULL.
0
3170 / 1929 / 313
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
31.03.2015, 21:24 8
Для установки параметров используется CONSOLE_SCREEN_BUFFER_INFO / CONSOLE_SCREEN_BUFFER_INFOEX, что дает возможность управлять буфером. Непосредственного доступа к памяти нет, адреса будут транслироваться в зависимости от установленного размера. То есть, нельзя скопировать блок через memcpy, например, но это легко эмулируется циклом.

Рамка
C++
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
void Console::Box
(
   WORD                 wTop,
   WORD                 wBottom,
   WORD                 wLeft,
   WORD                 wRight,
   WORD                 wColor,
   const char*  const   pszPattern
)
{
   CHAR_INFO   SmallBuf;
   CHAR_INFO   pBuf[MAX_HORIZ_LINE_LENGTH];
   COORD       BufSize;
   COORD       TopLeft;
   SMALL_RECT  Region;
 
   // Input Buffer Window
   TopLeft.Y = 0;
   TopLeft.X = 0;
 
   short    iIdx;
 
   // Horizontal Lines
   WORD  wHSize = (WORD)min((wRight - wLeft - 1),MAX_HORIZ_LINE_LENGTH);
 
   // Input Buffer Dimensions
   BufSize.Y = 1;
   BufSize.X = wHSize;
 
   // Prepare
   for (iIdx = 0; iIdx < wHSize; ++iIdx)
   {
      pBuf[iIdx].Attributes     = wColor;
      pBuf[iIdx].Char.AsciiChar = pszPattern[0];
   }
 
   // Output Buffer Locations
 
   Region.Top    = wTop;
   Region.Bottom = wTop;
   Region.Left   = (WORD)(wLeft + 1);
   Region.Right  = wRight;
 
   if (!WriteConsoleOutput
      (
         _hConsoleOut,     // Handle to a Console Screen Buffer
         pBuf,             // Ptr to Buffer with Data to Write
         BufSize,          // Column-Row Size of Source Buffer
         TopLeft,          // Upper-Left Cell to Write from
         &Region           // Pointer to Rectangle to Write to
      ))
   {
      // Error !
//      Error();
   }
 
   // Prepare
   for (iIdx = 0; iIdx < wHSize; ++iIdx)
   {
      pBuf[iIdx].Attributes     = wColor;
      pBuf[iIdx].Char.AsciiChar = pszPattern[1];
   }
 
   // Output Buffer Locations
   Region.Top    = wBottom;
   Region.Bottom = wBottom;
   Region.Left   = (WORD)(wLeft + 1);
   Region.Right  = wRight;
 
   if (!WriteConsoleOutput
      (
         _hConsoleOut,     // Handle to a Console Screen Buffer
         pBuf,             // Ptr to Buffer with Data to Write
         BufSize,          // Column-Row Size of Source Buffer
         TopLeft,          // Upper-Left Cell to Write from
         &Region           // Pointer to Rectangle to Write to
      ))
   {
      // Error !
//      Error();
   }
 
   // Vertical Lines
   WORD     wVSize =  (WORD)min((wBottom - wTop),MAX_VERT_LINE_LENGTH);
 
   // Input Buffer Dimensions
   BufSize.X = 1;
   BufSize.Y = wVSize;
 
   // Prepare
   for (iIdx = 0; iIdx < wVSize; ++iIdx)
   {
      pBuf[iIdx].Attributes     = wColor;
      pBuf[iIdx].Char.AsciiChar = pszPattern[2];
   }
 
   // Output Buffer Locations
   Region.Top    = wTop;
   Region.Bottom = wBottom;
   Region.Left   = wLeft;
   Region.Right  = wLeft;
 
   if (!WriteConsoleOutput
      (
         _hConsoleOut,  // Handle to a Console Screen Buffer
         pBuf,          // Ptr to Buffer with Data to Write
         BufSize,       // Column-Row Size of Source Buffer
         TopLeft,       // Upper-Left Cell to Write from
         &Region        // Pointer to Rectangle to Write to
      ))
   {
      // Error !
//      Error();
   }
 
   // Prepare
   for (iIdx = 0; iIdx < wVSize; ++iIdx)
   {
      pBuf[iIdx].Attributes     = wColor;
      pBuf[iIdx].Char.AsciiChar = pszPattern[3];
   }
 
   // Output Buffer Locations
   Region.Top    = wTop;
   Region.Bottom = wBottom;
   Region.Left   = wRight;
   Region.Right  = wRight;
 
   if (!WriteConsoleOutput
      (
         _hConsoleOut,   // Handle to a Console Screen Buffer
         pBuf,       // Ptr to Buffer with Data to Write
         BufSize,    // Column-Row Size of Source Buffer
         TopLeft,    // Upper-Left Cell to Write from
         &Region     // Pointer to Rectangle to Write to
      ))
   {
      // Error !
//      Error();
   }
 
   // Input Buffer Dimensions
   BufSize.Y = 1;
   BufSize.X = 1;
 
   // Input Buffer Window
   TopLeft.Y = 0;
   TopLeft.X = 0;
 
   // TopLeft Corner
 
   // Prepare
   SmallBuf.Attributes     = wColor;
   SmallBuf.Char.AsciiChar = pszPattern[4];
 
   // Output Buffer Locations
   Region.Top    = wTop;
   Region.Bottom = wTop;
   Region.Left   = wLeft;
   Region.Right  = wLeft;
 
   if (!WriteConsoleOutput
      (
         _hConsoleOut,  // Handle to a Console Screen Buffer
         &SmallBuf,     // Ptr to Buffer with Data to Write
         BufSize,       // Column-Row Size of Source Buffer
         TopLeft,       // Upper-Left Cell to Write from
         &Region        // Pointer to Rectangle to Write to
      ))
   {
      // Error !
//      Error();
   }
 
   // BottomLeft Corner
 
   // Prepare
   SmallBuf.Attributes     = wColor;
   SmallBuf.Char.AsciiChar = pszPattern[5];
 
   // Output Buffer Locations
   Region.Top    = wBottom;
   Region.Bottom = wBottom;
   Region.Left   = wLeft;
   Region.Right  = wLeft;
 
   if (!WriteConsoleOutput
      (
         _hConsoleOut,  // Handle to a Console Screen Buffer
         &SmallBuf,     // Ptr to Buffer with Data to Write
         BufSize,       // Column-Row Size of Source Buffer
         TopLeft,       // Upper-Left Cell to Write from
         &Region        // Pointer to Rectangle to Write to
      ))
   {
      // Error !
//      Error();
   }
 
   // TopRight Corner
 
   // Prepare
 
   SmallBuf.Attributes     = wColor;
   SmallBuf.Char.AsciiChar = pszPattern[6];
 
   // Output Buffer Locations
 
   Region.Top    = wTop;
   Region.Bottom = wTop;
   Region.Left   = wRight;
   Region.Right  = wRight;
 
   if (!WriteConsoleOutput
      (
         _hConsoleOut,  // Handle to a Console Screen Buffer
         &SmallBuf,     // Ptr to Buffer with Data to Write
         BufSize,       // Column-Row Size of Source Buffer
         TopLeft,       // Upper-Left Cell to Write from
         &Region        // Pointer to Rectangle to Write to
      ))
   {
      // Error !
//      Error();
   }
 
   // BottomRight Corner
 
   // Prepare
 
   SmallBuf.Attributes     = wColor;
   SmallBuf.Char.AsciiChar = pszPattern[7];
 
   // Output Buffer Locations
 
   Region.Top    = wBottom;
   Region.Bottom = wBottom;
   Region.Left   = wRight;
   Region.Right  = wRight;
 
   if (!WriteConsoleOutput
      (
         _hConsoleOut,  // Handle to a Console Screen Buffer
         &SmallBuf,     // Ptr to Buffer with Data to Write
         BufSize,       // Column-Row Size of Source Buffer
         TopLeft,       // Upper-Left Cell to Write from
         &Region        // Pointer to Rectangle to Write to
      ))
   {
      // Error !
//      Error();
   }
}
0
Миниатюры
По какому адресу находится буфер консоли?  
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.03.2015, 21:24

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Как узнать, по какому адресу/дому кликнул пользователь?
Добрый вечер. Хотел бы узнать: я разбил карту на N частей. В зависимости от выбора зоны - будет к...

По какому адресу располагается экранная область в памяти и какой размер имеет
Хочу копать на низком уровне экранную область в памяти. Вопрос: как узнать по какому адресу она...

Имеется 5 бензоколонок по разным адресам. По какому адресу расположена бензоколонка, на которую можно отправлять данную колонну
Имеется 5 бензоколонок по разным адресам: ул.Володарского, ул.Партизанская, ул.Комсомольская,...

Есть 2 таблицы, в первой адреса и поле для вывода номера участка, а во второй указано какому адресу соответствует
Есть 2 таблицы, в первой адреса и поле для вывода номера участка, а во второй указано какому адресу...


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

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

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