Как найти адрес последнего байта оперативной памяти

Эволюция ЭВМ

Архитектура ПК |
Принципы
построения



Состав ПК
|


Центральный процессор |
Память



Устройства ввода
|


Устройства вывода

на главнуюМетодические рекомендации по решению задач

Здесь приведены задачи на расчет параметров
внутренней памяти компьютера. Для их решения ученики должны быть знакомы
с понятиями: объем памяти, размер машинного слова, принципы адресации
памяти, связь между единицами памяти бит, байт, килобайт, мегабайт.

Пример 1.
Объем оперативной памяти компьютера составляет
1/8 часть мегабайта. Сколько машинных слов составляют оперативную
память, если одно слово содержит 64 бита?

Во-первых, нужно перевести объем памяти и размер машинного слова в
одинаковые единицы. Удобнее всего — в байты. Обозначим объем памяти
буквой М, а размер слова — W. Тогда:
            
М = 1/8 Мб = 1024 ·1024/8
= 131 072 байта, W = 64/8 = 8 байтов.
Теперь можно вычислить число слов, составляющих память:
           
 N = M/W = 131 072/8 = 16 384
слова.

Пример 2.
 Какой объем имеет оперативная память компьютера,
если 3FF — шестнадцатеричный адрес последнего байта памяти?

Здесь подразумевается, что объем памяти нужно выразить десятичным
числом, равным количеству байтов, составляющих ОЗУ. Адрес последнего
байта задан в шестнадцатеричной системе.
Поскольку нумерациябайтов памяти начинается с нуля, то значит диапазон
адресов от 0 до 3FF. Следовательно, число байтов памяти в
шестнадцатеричной системе счисления равно
3FF + 1 =
40016.

 Для
получения ответа нужно перевести это число в десятичную систему
счисления:

          
40016= 4
·


162
= 4 ·256 =
1024 байт = 1 Кбайт.

Пример 3.
 Компьютер имеет объем оперативной памяти, равный
0,5 Кбайт и содержит 128 машинных слов. Укажите адрес последнего байта и
адрес последнего машинного слова памяти в шестнадцатеричной форме.

Выразим размер памяти в байтах:
          
0,5 Кбайт = 512 байт.

Размер машинного слова
определяется делением объема памяти на число слов в памяти:
          
512/128 = 4 байта.

Переведем величину
объема памяти в шестнадца-теричную систему счисления:
          


51210
= 2·256 = 2·162
=

20016
.

Следовательно, диапазон
шестнадцатеричных адресов байтов памяти: от 0 до 1FF.
Отсюда адрес последнего байта равен 1FF.
Последнее машинное слово включает в себя 4 последних байта памяти:
1FC, 1FD,
1
FE, 1FF. Значит, адрес последнего слова
равен 1FC.

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

ОБЪЕМ = СТОРОНЫ
×
ДОРОЖКИ
×
СЕКТОРЫ
×
БАЙТЫ

 

Пример 4.
 Двусторонняя дискета имеет объем 1200 Кбайт.
Сколько дорожек на одной стороне дискеты, если каждая дорожка содержит
15 секторов по 4096 битов?

Как это уже делалось раньше, здесь нужно перейти к
одной единице измерения информации. Переведем в килобайты размер
сектора:
         
4096/8 = 512 байт
=0,5 Кбайт.

Теперь вычислим информационный размер дорожки:
         
0,5 х 15 = 7,5 Кбайт.
      Поскольку дискета двухсторонняя, то на одной
стороне
        
1200/2 = 600 Кбайт.
     Теперь можно получить окончательный ответ. Чтобы найти
число дорожек на одной стороне дискеты, нужно информационный объем
стороны разделить на информационный размер одной дорожки:
        
600/7,5 = 80 дорожек.

Пример 5.
Односторонняя дискета имеет объем 180 Кбайт.
Сколько дорожек на диске, если каждая из них содержит 9 секторов, а в
каждом секторе размещается по 1024 символа из 16-символьного алфавита.

Главная
«хитрость» этой задачи состоит в том, что надо сообразить сколько памяти
занимает 1 символ.
Этот вопрос относится к теме “Измерение информации”. Один символ из
16-символьного алфавита несет 4 бита информации, поскольку


24

= 16. Это значит, что и в памяти
компьютера символы такого алфавита будут занимать по 4 бита.
Следовательно, в одном байте помещается 2 таких символа.

Теперь можно определить размер сектора. Он равен:
          
 1024/2 =
512 байт =0,5 Кбайт.

Поскольку на одной дорожке размещается 9 секторов, то
информационный объем дорожки равен:
           
9

×
0,5 – 4,5 Кбайт.

Теперь можно определить число дорожек на всем диске:
         
 180/4,5 = 40
дорожек.

      1. Расположение информации в оперативной памяти. Адреса

Этот и следующий
параграфы носят ознакомительный
характер.

Раньше я уподоблял
оперативную память тетрадному листу
в клеточку. Каждая клетка – байт. Теперь
я уподоблю ее многоэтажному небоскребу.
Каждый этаж – байт.

Как и положено
этажам, байты имеют номера. Эти номера
называются адресами. Самый
“нижний” байт имеет адрес 0, следующий
– 1, следующий – – 2 и т.д. Если память вашего
компьютера имеет объем 1 Мегабайт, то
вы сами можете вычислить адрес последнего
байта, учитывая, что 1 Мегабайт = 1024
Килобайта, a 1Килобайт = 1024 байта. Приняты
сокращения: Мегабайт – М, Килобайт – К.
Имейте в виду, что во многих книгах
адреса записываются не в привычном нам
виде, а в так называемой шестнадцатеричной
системе счисления.

Во время выполнения
вашей программы, написанной на Паскале,
в памяти находится самая разная
информация. То, что относится к
паскалевской программе, располагается
“по этажам” в следующем порядке:

байт с адресом
1М-1

куча

стек

сегмент данных
объемом 64К

откомпилированная
программа

байт с адресом
0

Границы между
некоторыми областями памяти не
фиксированы и зависят от решаемой
задачи и желания программиста. В сегменте
данных располагаются переменные,
массивы и другие типы данных вашей
программы, описанные привычным вам
способом в разделах VAR,
CONST
и т.д. (без использования
ссылок). Обратите внимание, что размер
сегмента данных весьма невелик (не
более 64К).Стек– область памяти, в
которой располагаются данные, описанные
внутри процедур (этого мы пока не делали,
об этом – в Глава .2).Куча– область
памяти, в которой располагаются данные,
описанные при помощи ссылок.

      1. Ссылки

Пусть вы хотите
использовать следующий массив:

VAR
a: array[1..200, 1..200] of Integer;

Давайте подсчитаем,
сколько байтов в памяти займет этот
массив. Одно число типа Integer занимает
2 байта. Получаем 200*200*2 = 80000 байтов. В
сегменте данных массив не умещается,
значит привычным образом работать с
ним нельзя. Использование ссылок
позволяет разместить его в куче (по
английски – heap), имеющей гораздо больший
размер.

Я привел лишь один
из доводов в пользу применения ссылок.
А поближе познакомимся мы со ссылками
на простом примере. Задача: Вычислить
и напечататьy=a+b,
гдеaиb– целые числа 2 и 3. Вот традиционная
программа для решения этой задачи:

VARa, b, y :
Integer;BEGINa:=2; b:=3;
y:=a+b;
WriteLn
(y)END.

А теперь потребуем,
чтобы число 2 и результат 5 размещались
в куче (впрочем, строго говоря, не
обязательно в куче). Вот
программа со
ссылками:

VAR b
: Integer;
a,y : ^Integer;
BEGIN

New(a); New(y);
a^ :=
2; b:=3;
y^ :=
a^ +
b;
WriteLn (y^)
END.

Пояснения:
Все, что вышеBEGIN,
выполняется на этапе компиляции: Строкаa,y:^Integerприказывает отвести в памяти в сегменте
данных две ячейки, но не для будущих
чисел 2 и 5, а для адресов ячеек из кучи,
в которых эти самые 2 и 5 предполагается
хранить. Итак, будущие значенияaиy– не числа 2 и 5, аадресаячеек для
этих чисел или, по-другому,ссылкина ячейки для этих чисел. Пока же адреса
эти не определены.

Все, что ниже
BEGIN,
выполняется на этапе выполнения
программы: При помощи обращений к
процедуреNew(New(a)иNew(y)
) мы идем дальше и придаем
переменнымaиyзначения конкретных адресов памяти,
то есть отводим для будущих чисел 2 и 5
конкретное место в памяти. Таким образом,
мы сталкиваемся с новым для нас явлением
– место в памяти отводится не на этапе
компиляции, а на этапе выполнения
программы. В Паскале имеются средства
и освобождать это место на этапе
выполнения программы (процедураDispose,
на которой я не буду останавливаться).
Называется все этодинамическим
распределением памяти
и сулит выгоды
экономным создателям программ,
использующим большие объемы разных
данных в разные моменты выполнения
программы.

Оператор a^:=
2
идет еще дальше и посылает
в ячейку, адрес которой находится в
ячейкеa,
число 2. Обозначается такая ячейка –a^.
Если бы мне вздумалось написатьa:=2,
это бы значило, что я хочу послать в
ячейкуaадрес равный двум, что вполне возможно,
но синтаксически неверно, так как
численные значения адресов задаются
по-другому.

Смысл следующих
двух операторов очевиден.

Подведем итог.
Значок ^,
поставленный перед типом (например,^Integer),
означает новый ссылочный тип, значения
которого обязаны быть адресами переменной
(или ссылками на переменную) исходного
типа (в нашем случаеInteger).

Значок ^,
поставленный после переменной ссылочного
типа (например,a^),
означает переменную, на которую ссылается
исходная переменная (в нашем случае
исходная переменнаяa).

Вот еще некоторые
возможные операции со ссылками (без
особых пояснений):

TYPED =array[1..10]ofReal;
DP = ^D;
Int=
^Integer;VARi, j : Int; {
i, j – адреса целых чисел}
m : DP; { m –
адрес первой ячейки массива из 10 вещ.
чисел}BEGINNew(i); New(j);
New(m);
i^:=4;
j^:=3;
j:=i; {Теперь j и i
содержат адреса одного и того же числа
– 4}
WriteLn(j^); {поэтому будет напечатано
число 4}
m^[9]:=300 {Девятый элемент
массива становится равным числу
300}END.

Вернемся к задаче
о размещении большого массива. Поскольку
Паскаль вслед за MS-DOSзапрещает не только описывать, но также,
естественно, и ссылаться на структуру,
объемом превышающую 64К, то ссылаться
сразу на весь двумерный массив не выйдет
и поэтому программа получится непростой:

TYPEa =array[1..200]ofInteger;
ap = ^a;
a2 =array[1..200]ofap;VARx : a2; {x –
массив из 200 адресов (каждый – ссылка на
строку из 200 элементов

исходного
массива)}

BEGINfori:=1to200doNew(x[i]); {Место для массива
отведено}
…………
x[128]^[35]:=800; {Присвоено
значение элементу массива}
………….END.

В заключение
упомяну, что ссылки полезны еще тем,
что позволяют организовывать в памяти
структуры переменной длины, такие как
списки, деревья и т.п.

Задача по информатике

Юлия



Знаток

(373),
закрыт



12 лет назад

Компьютер имеет объём оперативной памяти равный 1 Кбайт и содержит 256 машинных слов. Укажите шестнадцатеричные адреса последнего байта и последнего машинного слова оперативной памяти компьютера. Числа записать через запятую.

Сергей *****

Мыслитель

(9331)


12 лет назад

1 Кбайт = 1024 байт
Так как нумерация байтов начинается с нуля, значит адрес последнего байта будет равен (1024 – 1) = 1023
шестнадцатеричный адрес последнего байта 3FF
машинное слово 1024/256 = 4 байта
шестнадцатеричный адрес последнего машинного слова 3FF – 4 = 3FB

I’m reading a book about assembly; Jones and Bartlett Publishers Introduction to 80×86 Assembly

The author give exercises but no answers to it. Obviously before going further, I want
to make sure that I fully understand the chapter concepts.

donc,

What is the 8-hex-digit address of the “last” byte for a PC with 32 MBytes of RAM

This is my solution:

1) convert to bits
32 MBytes = 268435456 bits

2) I subtract 8 bits to remove the last byte
268435448

3) conversion to hexadecimal
FFFFFF8

So I got FFFFFF8

Does this look a good answer?

asked Feb 23, 2014 at 18:18

Frederic Nault's user avatar

4

No. For assembly programming it’s very helpful to be able to do simple power-of-2 calculations in your head. 1K is 2^10. So 1M is 2^20. So 32M is 2^25 (because 2^5 = 32). So the address of the last byte is 2^25-1 (because the first byte is at 0). This is 25 bits that are all 1’s (because 2^n-1 is always n 1’s). In hex, this is six F’s (4 bits per F) plus an additional 1, so prepending a zero to get 8 hex digits, you have 01FFFFFF.

answered Feb 23, 2014 at 18:25

Gene's user avatar

GeneGene

46.1k4 gold badges58 silver badges96 bronze badges

4

There are two things you should think about:

For most computers (all PCs) adresses are given in bytes, not in bits.

Therefore you must calculate: 32 MByte = 33554432 Bytes, minus 1 byte = 01FFFFFF (hex) as “Gene” wrote in his answer.

In reality (if you are interested in) you must also think about the fact that there is a “gap” in the address area (from 000A0000 to 000FFFFF) of real PCs so either not all the RAM is useable or the last address of the RAM comes later. This area is used for the graphics card and the BIOS ROM.

answered Feb 23, 2014 at 19:19

Martin Rosenau's user avatar

Martin RosenauMartin Rosenau

17.6k3 gold badges17 silver badges37 bronze badges

2

I thinking is : 00007FFF
because: 32MB = 32*1024 = 32768
byte last have address 32767 (7FFF)

answered Feb 5, 2017 at 15:26

andrew hiep's user avatar

1

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

поделиться знаниями или
запомнить страничку

  • Все категории
  • экономические
    43,653
  • гуманитарные
    33,653
  • юридические
    17,917
  • школьный раздел
    611,926
  • разное
    16,901

Популярное на сайте:

Как быстро выучить стихотворение наизусть? Запоминание стихов является стандартным заданием во многих школах. 

Как научится читать по диагонали? Скорость чтения зависит от скорости восприятия каждого отдельного слова в тексте. 

Как быстро и эффективно исправить почерк?  Люди часто предполагают, что каллиграфия и почерк являются синонимами, но это не так.

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

Добавить комментарий