АВМиС - Лабы / 5 память / Отчёт память
.docМинистерство образования Республики Беларусь
Учреждение образования
Белорусский Государственный Университет
Информатики и Радиоэлектроники
Кафедра ЭВМ
Отчет по лабораторной работе
Тема: «Работа с памятью»
Выполнил:
студент гр. 750501
Демидовец А.Г.
Проверил:
Одинец Д.Н.
Минск, 2009
1. Постановка задачи
Написать и отладить программу, которая демонстрирует запись и чтение данных в реальном, защищенном и виртуальном режиме ОЗУ -> HDD , HDD -> ОЗУ
Предусмотреть возможность ввода с клавиатуры последовательности символов,
отражения на экране дисплея текущего режима работы, содержимого заданных адресов ОЗУ и HDD.
Пересылку начинать осуществлять с конечного символа.
Интерфейс переключения между режимами разработать самостоятельно.
Область памяти для хранения массива определить самостоятельно
2. Листинг программы
#pragma inline
#include <stdio.h>
#include <conio.h>
void outputRegisters()
{
printf("\n Register CR0:\n ");
asm{
mov ebx,cr0
push ebx
push edx
mov cx,32 // number of operations
xor dl,dl
}
l1:
asm{
shl ebx,1 // shear left
adc dl,30h // add carry flag
mov ah,2h // output symbol
int 21h
mov bl,cl
dec bl
and bl,00000011b
cmp bl,0
jne after_space1
}
spase_print1:
asm{
mov dl,20h // output space
int 21h
}
after_space1:
asm{
xor dl,dl
loop l1
pop eax
pop ebx
}
printf("\n Register EFLAGS:\n ");
asm{
pushfd
pop ebx
push ebx
push edx
mov cx,32
xor dl,dl
}
l2:
asm{
shl ebx,1
adc dl,30h
mov ah,2h
int 21h
mov bl,cl
dec bl
and bl,00000011b
cmp bl,0
jne after_space2
}
spase_print2:
asm{
mov dl,20h // output space
int 21h
}
after_space2:
asm{
xor dl,dl
loop l2
pop eax
pop ebx
}
}
void protectedMode()
{
asm{
mov ax, 0x1687
int 0x2f
}
_AX=0;
outputRegisters();
}
void realMode()
{
asm{
mov bh, 0x07 // number of transfer function
mov ah, 0x4c // 4-th interruption
int 0x21
}
}
void main()
{
char a, t;
FILE *f;
char buf[128];
buf[0]=0;
clrscr();
puts("\n Hi, man!!!Memory is ready to work!\n");
while(1)
{
clrscr();
printf("\n Big menu:");
printf("\n 1. Real-virtual mode");
printf("\n 2. Protected mode");
printf("\n 0. Exit\n");
a=getch();
if(a!='0')
{
do
{
clrscr();
if (a=='1')
{
outputRegisters();
puts("\n\n Current mode = real-virtual!");
}
if (a=='2')
{
protectedMode();
puts("\n\n Current mode = protected!");
}
printf("\n\n Small menu: \n");
printf(" 1. From Input to RAM\n");
printf(" 2. From RAM to HDD\n");
printf(" 3. From HDD to RAM\n");
printf(" 4. Clear buffer\n");
printf(" 0. Back to big menu\n");
printf(" Buffer = %s", buf);
if( buf[0]=='\0' )
printf("***");
puts("");
t=getch();
switch(t)
{
case '1':
printf("\n Input info:\n ");
gets(buf);
break;
case '2':
f=fopen("av4.txt","w+");
fputs(buf,f);
fseek(f,0,SEEK_SET);
fclose(f);
break;
case '3':
f=fopen("av4.txt","r+");
fgets(buf,128,f);
fseek(f,0,SEEK_SET);
fclose(f);
break;
case '4':
buf[0]=0;
break;
}
}while(t!='0');
}
if(a=='0')
{
realMode();
return;
}
}
}