6 / 10 / 2
Регистрация: 29.05.2015
Сообщений: 661
1

Что такое сегментные регистры? Не очень понял

04.11.2016, 01:20. Показов 7881. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Что такое сегментные регистры? Не очень понял. Это регистры,которые хранят адреса или что? И адреса на что? На данные? Вроде указателей в Си,только не в памяти,а в регистре?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.11.2016, 01:20
Ответы с готовыми решениями:

Необходимость указывать сегментные регистры
Почему когда делаем mov, обязательно нужно писать mov al,cs:, если написать mov al,, то не...

Что такое регистры микропроцессора? Перечислите регистры общего назначения
Помогите пожалуйста решить задания по TASM 1) Что такое регистры микропроцессора? Перечислите...

Сегментные регистры
Добрый вечер! Возник вопрос по сегментным регистрам. Вроде бы когда мы программируем под Windows в...

Зачем используют сегментные регистры в Windows
Вот например кусок кода: .data? CurrDir db MAX_PATH dup (?) buff db 4 * 3 dup (?) ...

3
Эксперт Hardware
Эксперт Hardware
5750 / 2221 / 381
Регистрация: 29.07.2014
Сообщений: 3,036
Записей в блоге: 4
04.11.2016, 07:43 2
Цитата Сообщение от NewNoob Посмотреть сообщение
Это регистры,которые хранят адреса или что? И адреса на что? На данные?
Адресация реального режима DOS довольно мутная тема, в отличии от линейной адресации WIN, где адрес - это просто порядковый номер ячейки памяти. Сегментная адресация применяется только в реальном режиме работы процессора, и в WIN лишена смысла. Вот тебе кое-что на эту тему..


Физический адрес
^^^^^^^^^^^^^^^^^^^^^^^

У первых плат 8086 шина-адреса была 20-битная. Такая ширина позволяет адресовать всего FFFFFh байт памяти. Запускаем виндовый калькулятор, переводим его с BIN, и введём 20 единиц. Так выглядит шина(А) на физическом уровне:
Код
; 20-битная шина процессора 8086
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |<--- Шина адреса ---->| -----------------------------
     1111 1111 1111 1111 1111 b = FFFFFh = 1.048.575 = 1 Мb

; 24-битная шина 80286
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |<------ Шина адреса ------>| -----------------------
     1111 1111 1111 1111 1111 1111 = FFFFFFh = 16 Мегабайт

; 32-битная шина 80386
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |<----------- Шина адреса ----------->| ------------------------
     1111 1111 1111 1111 1111 1111 1111 1111 = FFFFFFFFh = 4 Гигабайт
Значит увеличение ширины шины, увеличивает кол-во адресуемых ячеек памяти. Это хорошо.. Но регистры ЦП были в то время 16-битными. Как вместить в них 20-битный адрес? Было решено разбить память на логические сегменты, и адресовать её через регистровую пару так:
Код
     1111 1111 1111 1111  ---------> DS:
     |    1111 1111 1111 1111  ----> SI
     |                      |
     |<------ 20-бит ------>|
     1111 1111 1111 1111 1111  ----> адрес = DS:SI, ES:DI
                                             CS:IP, SS:SP
Здесь видно, что для смещения выделяется всего 0Fh байт, а не как показывает отладчик FFFFh. Эти 16-байт смещения принято называть одним параграфом памяти (1 строка в дампе):
Код
C:\>debug
-d 0:90
0000:0090  17 03 EC 0D 86 10 A7 00 - 90 10 A7 00 9A 10 A7 00   ................
0000:00A0  B8 10 A7 00 54 02 70 00 - F2 04 7E D3 B8 10 A7 00   ....T.p...~.....
При 20-битной шине, макс/физ.адрес будет 5-значным FFFFFh, но никак не 8-значным.
Тогда весь первый мегабайт правильней было-бы адресовать так:
Код
        00 01 02 03 04 05 06 07   08 09 0A 0B 0C 0D 0E 0F
        -------------------------------------------------
0000:0  17 03 EC 0D 86 10 A7 00 - 90 10 A7 00 9A 10 A7 00   ................
0001:0  B8 10 A7 00 54 02 70 00 - F2 04 7E D3 B8 10 A7 00   ....T.p...~.....
;.......
FFFE:0  B8 10 A7 00 B8 10 A7 00 - 40 01 17 04 50 09 C0 0C   ........@...P...
FFFF:0  EA AE 10 A7 00 ED 00 F0 - B8 10 A7 00 C4 23 02 D0   .............#..

; ..ну или так (что больше соответствует действительности)
; Внутри сегмента, левая часть адреса всегда остаётся прежней,
; а смещение (правая часть) указывает на диапазон адресов 0..FFFFh (64 Кбайт).
; Всего сегментов может быть 16, что в сумме даёт: 16 * 64К = 1 Мегабайт
;---------------------------------------------------------------------------
F:FFE0  B8 10 A7 00 B8 10 A7 00 - 40 01 17 04 50 09 C0 0C   ........@...P...
F:FFF0  EA AE 10 A7 00 ED 00 F0 - B8 10 A7 00 C4 23 02 D0   .............#..
Если для адреса выделяется 20-бит, то после FFFFFh счётчик сбросится в нуль. Чтобы выйти за пределы первого мегабайта, нужен 21-ый бит! Биты в шине(А) нумеруются с нуля A0-A19, поэтому этот 21-ый бит назвали (А20). Линия(А20) позволяет преодолеть мегабайтный барьер, и схематически выглядит так:
Код
       A0   А4   А8   А12  А16  А20  А24  A28
        |    |    |    |    |    |____|____|____/ __  <-- Ключ(A20)
        |    |    |    |    |     ____|____|________|
        |    |    |    |    |    |    |    |
        1111 1111 1111 1111 1111 1111 1111 1111 = FFFF'FFFFh = 4 Gb
        |                      |              |
        |<--- Шина 20-бит ---->|              |
        |<---------------- Шина 32-бит ------>|
На аппаратном уровне линией(А20) управляет чипсет через порт(92h) системной логики, но ей можно управлять и программно: через прерывания BIOS, или порт(60h) контроллёра клавиатуры. Нужно сказать, что в современной архитектуре чипсет избавили от этой задачи, и управление взял на себя сам ЦП через ножку (А20-Mask). Проц пользуется ею при входе/выходе из защищённого режима.


Линейная и сегментная адресация
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Любая память имеет линейную структуру. То есть это прямая линия от нуля до N байт. Эту прямую можно логически разделить на некоторое кол-во отрезков. Размер памяти от этого не изменится, но зато изменится её лог/структура. Логический адрес привязан к типу памяти: ROM, RAM, Flash, HDD.

Чтобы осветить сегментный адрес, рассмотрим такой пример..
Допустим, нам нужна ячейка 46. В виде [Seg:Offs] это будет 0040:0006, ..а так-же 0030:0016, 0010:0036 и т.д.. Всё зависит от того, сколько бит выделяется для смещения. Линейный-же адрес не делится на две составляющих. Это просто целое число, а не сумма двух чисел.

Посмотрим на линейный адрес А7FFFh.
В сегментном виде это А700:0FFFh, но не только..:
Код
    А7FFF  =  А000:7FFF
           =  А700:0FFF
           =  А7F0:00FF
           =  А7FF:000F
           =  А6EE:111F
           =  А500:2FFF
           ...и т.д.
Все/эти адреса указывают на одну ячейку памяти.
Докажем эту теорию, запросив в отладчике физ/адрес [12340h] в разном виде:
Код
C:\>debug
-d 1234:0000
1234:0000  4A 4E 50 00 4A 4E 53 00-4A 4E 4F 00 4A 4F 00 4A   JNP.JNS.JNO.JO.J
1234:0010  53 00 4A 50 00 4C 41 48-46 00 4C 44 53 00 4C 45   S.JP.LAHF.LDS.LE
-d 1000:2340
1000:2340  4A 4E 50 00 4A 4E 53 00-4A 4E 4F 00 4A 4F 00 4A   JNP.JNS.JNO.JO.J
1000:2350  53 00 4A 50 00 4C 41 48-46 00 4C 44 53 00 4C 45   S.JP.LAHF.LDS.LE
Как видим, дампы одинаковы и менеджер памяти знает об этом (в отличии от большинства пользователей). Формула ниже переводит сегментный адрес в физический:
Код
   Физический адрес = (Seg * 16) + Offset
   Пример:
   ----------
   1234:0000 = 1234h * 10h = 12340h + 0000h = 12340h
   1000:2340 = 1000h * 10h = 10000h + 2340h = 12340h

Сегментные регистры
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

В реальном режиме работы ЦП имеются всего 4 сегментных регистров: CS(Code), DS(Data), SS(Stack), ES(Enhanced - вспомогательный). Позже было добавлено ещё два - GS/FS, но в реальном режиме они не используются. Соответственно, каждый из сегментных регистров адресует свой сегмент памяти.

Файлы типа(COM) всегда грузятся в один сегмент, поэтому значения этих регистров у них имеют одно и тоже значения. Файлы типа(EXE) могут иметь размер больше 64КБ, поэтому загрузчик ОС разбрасывает его содержимое по-нескольким сегментам. В этом случае, все данные программы (константы, переменные, текстовые строки) находятся в сегменте данных на который указывает регистр(DS), а сам код находится в другом сегменте памяти, на который указывает(CS). Так-же и стек находится в третьем/произвольном сегменте(SS). Их содержимое можно посмотреть в отладчиках:
Код
AX 0000  CX 00FF  DS:SI 2070:0000  CS:IP 2080:0000  BP 0000  ODITSZAPC
BX 0000  DX 2070  ES:DI 2070:0080  SS:SP 4A16:0080  FL 7202  001000000
2
Asm♥/C++/Delphi/Py/PHP/Go
6334 / 1941 / 219
Регистрация: 14.12.2014
Сообщений: 4,047
Записей в блоге: 12
04.11.2016, 23:46 3
Если попроще, то сегментный регистр указывает - к какому участку памяти (грубо говоря, странице памяти) обращаются команды (типа mov [bx],ax или cmp [1234h],ax).
Зачем? Регистр bx, например (и иже с ним) может принимать значения от 0 до 65535, а памяти обычно немного побольше (1 Мб, например) . Это первая причина использования сегментных регистров. Вторая - разделения областей памяти под разные нужды (код, данные, стек).
Как уже сказано выше, физическая адресация (хотя, я бы её назвал виртуальной, но под ДОС будет физическая) идёт следующим образом: сегмент * 16 + смещение.
1
Эксперт Hardware
Эксперт Hardware
5750 / 2221 / 381
Регистрация: 29.07.2014
Сообщений: 3,036
Записей в блоге: 4
08.11.2016, 21:26 4
Jin X, согласен... Раздул я тему! ТС наверное вообще запутался.. Просто у меня было готово (типа когда-то писАл конспект)
0
08.11.2016, 21:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.11.2016, 21:26
Помогаю со студенческими работами здесь

Собирался покупать gtx 580, но по разным статьям в инете понял, что GTX 760 мощнее? Или я неправильно понял?
Привет всем. Сегодня решил собрать новый системный блок. ПРоц уже есть - Core i5-2380P, ОЗУ 8 гб...

сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь усложнять?
сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в...

Регистры разных ядер процессора - такое существует?
Вобщем необходимо понять как работает assembler на разных ядрах, как переместить из регистра одного...

не очень понял про динамическое выделение памяти.
У меня есть массив строк состоящий из 100 элементов string *строки; строки = new string ; ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru