Технологии программирования. Чтение оперативной памяти на С

Автор работы: Пользователь скрыл имя, 20 Декабря 2011 в 22:31, лабораторная работа

Краткое описание

Написать программу, позволяющую читать содержимое оперативной памяти. Информация должна быть представлена в виде таблицы, содержащей 16 строк и три столбца:
Адрес в шестнадцатеричном коде, заданный в формате
сегмент : смещение (xxxx : xxxx);
Шестнадцатеричное представление байта;
Символы кода ASCII;

Содержимое работы - 1 файл

б-сх.doc

— 166.00 Кб (Скачать файл)
  1. Техническое задание.
 

    Написать  программу, позволяющую читать содержимое оперативной памяти. Информация должна быть представлена в виде таблицы, содержащей 16 строк и три столбца:

  1. Адрес в шестнадцатеричном коде, заданный в формате 
    сегмент : смещение (xxxx : xxxx);
  2. Шестнадцатеричное представление байта;
  3. Символы кода ASCII;

    Вместо  первых 32 символов таблицы кода ASCII на экран выводить « . ».

    Предусмотреть построчный и постраничный  просмотр, а также перемещение в конец  и начало таблицы.

    Просмотр  содержимого памяти может начинаться с любого заданного адреса. 

 

  1. Анализ  технического задания.

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

          Всё адресное пространство разбивается на сегменты - 65536, в каждом сегменте, для выбора конкретного  байта, нужно указать смещение. В каждом сегменте 65536 смещений. Таким образом, необходимо получить адрес в формате аааа : бббб, где аааа – сегмент, бббб – смещение.

          Для получения сегмента используем операцию сдвига на 16 позиций  вправо.

          Для того, чтобы обратится  к адресному пространству оперативной  памяти используется функция peekb(сегмент;смещение). Данная функция извлекает из памяти байт, записанный по адресу сегмент:смещение. Функция вызывается при подключенной библиотеки dos.h.

          Чтобы реализовать  перемещение по таблице необходимо при нажатии на клавиши производить  необходимое изменение в начальном  адресе (при программной реализации необходимо использовать десятичный код соответствующей клавиши). 

При нажатии на клавиши: 

      Adr+16 (смещение на 16 вниз) 
 

 Adr-16 (смещение на 16 вверх) 
 

      Adr-65536 (смещение на сегмент вверх) 
 

 Adr+65536 (смещение на сегмент вниз) 
 
 

                                       Adr= 0000000000 (возврат в начало)

 

  1. Блок-схема.
 

       
       
       
       
       
       
       
       
       
       
       
       

 

 

 

 

 
 

 
 
 

Рисунок 1 – Блок-схема процедуры Scaner

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Рисунок 2 – Блок-схема программы

  1. Текст программы.

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <dos.h> 

int i, klav;

long int adr;

int scaner()

{

int j, k, smesch, segm;

char s;

long int adr1, adr2;

adr1=adr;

adr2=adr;

smesch=(int)(adr&65535);

segm=(int)(adr2>>16); 

for (j=16;j>0;j--)

{

gotoxy(2,4+(16-j));

printf("%04X:%04X",segm,smesch);

gotoxy(63,4+(16-j));

for(k=16;k>0;k--)

{

s=peekb(segm,smesch);

if(s>32 && s<255) printf("%c",s);

else printf(".");

smesch=smesch+1;

}

smesch=smesch-16;

gotoxy(13,4+(16-j));

for(k=16;k>0;k--)

{

s=peekb(segm,smesch);

if (s>=0 && s<256) printf("%02X|",s); else

printf("%02X|",s-65280);

smesch=smesch+1;

}

}

return 0;

}

main()

{adr=2684354560;

long int adr11,adr22;

clrscr();

gotoxy(1,1);

printf("   CHTENIE    ");

gotoxy(1,3);

printf("---adres---");

gotoxy(12,3);

printf(" ----------------------16------------------------");

gotoxy(62,3);

printf("----ASCII---");

gotoxy(1,20);

printf("----------");

gotoxy(12,20);

printf("-------------------------------------------------");

gotoxy(62,20);

printf("------------"); 

for (i=16; i>0;i--)

{gotoxy(1,3+i);

printf("|   |");

gotoxy(12, 3+i);

printf("|                  |");

gotoxy(62,3+i);

printf("|          |");

} 

do

{

scaner();

klav=getch();

switch(klav)

{

case 72:{

       adr=adr-16;

       break;}

case 73:{

       adr=adr-65536;

       break;}

case 8:{

       adr=0000000000;

       break;}

case 81:{

       adr=adr+65536;

       break;}

case 80:{

       adr=adr+16;

       break;}

case 82:{

       gotoxy(3,22);

       printf("adres:");

       gotoxy(3,28);

       scanf("%X:%X",&adr11,&adr22);

       adr11=adr11<<16;

       adr22=adr22&65535;

       adr=adr11+adr22;

        break;}

}

}

while (klav!=27);

return 0;

} 
 

 

  1. Тестирование.

Рисунок 3 – Тестирование программы. Произвольный адрес 

Рисунок 4 – Тестирование программы. Движение вниз с помощью Pg Dn

 

Рисунок 5 – Тестирование программы. Ввод адреса с помощью клавиши Insert 

 

Рисунок 6 – Тестирование программы. Ввод адреса B800:0000 

  1. Вывод.

    В результате выполнения лабораторной работы разработана программа, позволяющая считывать содержимое виртуального адресного пространства оперативной памяти, начиная с произвольного адреса. Для считывания байта используется стандартная функция peekb(сегмент,смещение). Функция peekb извлекает из памяти байт, записанный по адресу сегмент:смещение. Возможно свободно перемещаться по адресному пространству благодаря перехвату клавиш клавиатуры.

Информация о работе Технологии программирования. Чтение оперативной памяти на С