Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
GepardD
5 / 5 / 1
Регистрация: 23.10.2009
Сообщений: 63
#1

Обращение к памяти - C++

12.05.2011, 08:47. Просмотров 1223. Ответов 2
Метки нет (Все метки)

есть процедурка замены определения символа с номером num из банка bank на символ, образ которого записан в масиве crr;
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
void *kods(char bank; char num)
{ char far *uk;
   int wo;
char crr[5][14]={
      {0x70,0x48,0x48,0x70,0x40,0x40,0x40,0xE0,0x00,0x00,0x00,0x00,0x00,0x00},
      {0x3A,0x44,0x44,0x44,0x44,0x45,0x47,0x7c,0x00,0x00,0x00,0x00,0x00,0x00},
      {0x66,0x66,0x24,0x24,0x3a,0x3a,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00},
      {0x30,0x48,0x48,0x48,0x70,0x40,0x48,0x30,0x00,0x00,0x00,0x00,0x00,0x00},
      {0x40,0x40,0x40,0x40,0x40,0x40,0x48,0x30,0x00,0x00,0x00,0x00,0x00,0x00},
      };
   outport(0x3ce,6);  //адрес многоцелевого регистра
   outport(0x3cf,1);   // граф. режим
   outport(0x3c4,2);  // адрес регистра маски битовой плоскости
   outport(0x3c5,4);  // бит плоскости 2
   outport(0x3c4,4);  // адрес рег. режима использования памяти
   outport(0x3c5,6);  // отмена режима счет/нечет
 
   for (i=0;i<31;i++) 
{/*вот и сама загвоздка в паскале тут используется вот такая процедура из паскаля mem[$a000:bank*$20000+num*32+i]=crr[i]
 
Для обращения к ячейкам ОЗУ и ПЗУ  используются  дальние
указатели,которые обьявляются в программе следующим образом:
 
    char far * uk;-для работы с байтами
 
 
     При этом первым следует младший байт,потом-старший байт.Напри-
мер,для чтения слова из ОЗУ по адресу 0040:0010H используется выра-
жение:
                wo:=MemW[$0040:$0010]
                ---->
                uk=( int far * ) 0x00400010;
                wo=* uk;
 
 
 вот мои попытки это реализовать:
 
    (int far *)(0xa000:bank+num*32+i)=crr[i];
       wo=* uk;
     
*/}
 
 
   outport(0x3c4,4);
   outport(0x3c5,2);
   outport(0x3c4,2);
   outport(0x3c5,3);
   outport(0x3ce,6);
   outport(0x3cf,0xE);
}


подскажите в чем ошибка
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2011, 08:47     Обращение к памяти
Посмотрите здесь:

C++ Прямое обращение к памяти
Обращение к конкретному адресу в памяти Visual C++
C++ Обращение в неправильный участок памяти, используя структуры и pcap.h
C++ Linux Обращение к памяти.
C++ Обращение к структуре в классе с выделением памяти
Почему обращение к недоступному адресу в памяти C++
C++ Обращение к методу объекта размещенного в динамической памяти
Обращение к double** из метода dll вызывает ошибку памяти C++
Обращение к свойству класса в динамической памяти C++
C++ Возможно ли обращение к статической памяти функции извне?
C++ GDB обращение к памяти
Выделение памяти и обращение к ней C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
resource2008
109 / 109 / 2
Регистрация: 11.03.2011
Сообщений: 421
12.05.2011, 21:13     Обращение к памяти #2
а что такое far в данном случае?


Цитата Сообщение от GepardD Посмотреть сообщение
crr[i]
- массив ведь двумерный


так до конца и не понял задачу. может так?
C++
1
2
3
4
5
6
7
8
9
10
   for (int i=0;i<31;i++) 
{
 
// записали в uk полученный адрес
uk = (char*) ( ( 0xa000 * 0x10000 ) + bank ) + ( num*32 + i );
 
// записали по адресу uk символ из массива 
// что куда менять не знаю, поэтому пишу так
*uk = (char) *(crr + i);
}
GepardD
5 / 5 / 1
Регистрация: 23.10.2009
Сообщений: 63
13.05.2011, 10:08  [ТС]     Обращение к памяти #3
Все спс разобрался:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void repl(char bank, char num, char sym[14])
 {
  char far *p=(char far *)0xa0000000;
  outportb(0x3ce,6);
  outportb(0x3cf,1);
  outportb(0x3c4,2);
  outportb(0x3c5,4);
  outportb(0x3c4,4);
  outportb(0x3c5,6);
  for(int i=0;i<32;i++)
   {
    p+=num*32+bank*0x2000+i;
    *p=sym[i];
   }
  outportb(0x3c4,4);
  outportb(0x3c5,2);
  outportb(0x3c4,2);
  outportb(0x3c5,3);
  outportb(0x3ce,6);
  outportb(0x3cf,0xe);
 }
Yandex
Объявления
13.05.2011, 10:08     Обращение к памяти
Ответ Создать тему
Опции темы

Текущее время: 15:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru