Автор работы: Пользователь скрыл имя, 20 Декабря 2011 в 22:31, лабораторная работа
Написать программу, позволяющую читать содержимое оперативной памяти. Информация должна быть представлена в виде таблицы, содержащей 16 строк и три столбца:
Адрес в шестнадцатеричном коде, заданный в формате
сегмент : смещение (xxxx : xxxx);
Шестнадцатеричное представление байта;
Символы кода ASCII;
Написать программу, позволяющую читать содержимое оперативной памяти. Информация должна быть представлена в виде таблицы, содержащей 16 строк и три столбца:
Вместо первых 32 символов таблицы кода ASCII на экран выводить « . ».
Предусмотреть построчный и постраничный просмотр, а также перемещение в конец и начало таблицы.
Просмотр
содержимого памяти может начинаться
с любого заданного адреса.
Для работы программы необходимо написать процедуру, позволяющую считывать в цикле побайтно данные из оперативной памяти, начиная с некоторого адреса и выводить их на экран в шестнадцатеричной форме и ASCII коде.
Всё адресное пространство разбивается на сегменты - 65536, в каждом сегменте, для выбора конкретного байта, нужно указать смещение. В каждом сегменте 65536 смещений. Таким образом, необходимо получить адрес в формате аааа : бббб, где аааа – сегмент, бббб – смещение.
Для получения сегмента используем операцию сдвига на 16 позиций вправо.
Для того, чтобы обратится
к адресному пространству оперативной
памяти используется функция peekb(сегмент;
Чтобы реализовать
перемещение по таблице необходимо
при нажатии на клавиши производить
необходимое изменение в
При
нажатии на клавиши:
Adr+16
(смещение на 16 вниз)
Adr-16 (смещение на 16 вверх)
Adr-65536
(смещение на сегмент вверх)
Adr+65536 (смещение на сегмент вниз)
Рисунок 1 – Блок-схема процедуры Scaner
Рисунок 2 – Блок-схема программы
#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,
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;
}
Рисунок
3 – Тестирование программы. Произвольный
адрес
Рисунок 4 – Тестирование программы. Движение вниз с помощью Pg Dn
Рисунок
5 – Тестирование программы. Ввод адреса
с помощью клавиши Insert
Рисунок
6 – Тестирование программы. Ввод адреса
B800:0000
В результате выполнения лабораторной работы разработана программа, позволяющая считывать содержимое виртуального адресного пространства оперативной памяти, начиная с произвольного адреса. Для считывания байта используется стандартная функция peekb(сегмент,смещение). Функция peekb извлекает из памяти байт, записанный по адресу сегмент:смещение. Возможно свободно перемещаться по адресному пространству благодаря перехвату клавиш клавиатуры.
Информация о работе Технологии программирования. Чтение оперативной памяти на С