6 / 10 / 2
Регистрация: 29.05.2015
Сообщений: 661
|
|
1 | |
Что такое сегментные регистры? Не очень понял04.11.2016, 01:20. Показов 7881. Ответов 3
Метки нет Все метки)
(
Что такое сегментные регистры? Не очень понял. Это регистры,которые хранят адреса или что? И адреса на что? На данные? Вроде указателей в Си,только не в памяти,а в регистре?
0
|
|
04.11.2016, 01:20 | |
Ответы с готовыми решениями:
3
Необходимость указывать сегментные регистры
Сегментные регистры Зачем используют сегментные регистры в Windows |
Эксперт Hardware
![]() |
|
04.11.2016, 07:43 | 2 |
Адресация реального режима 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 Гигабайт Код
1111 1111 1111 1111 ---------> DS: | 1111 1111 1111 1111 ----> SI | | |<------ 20-бит ------>| 1111 1111 1111 1111 1111 ----> адрес = DS:SI, ES:DI CS:IP, SS:SP Код
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...~..... Тогда весь первый мегабайт правильней было-бы адресовать так: Код
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 .............#.. Код
A0 А4 А8 А12 А16 А20 А24 A28 | | | | | |____|____|____/ __ <-- Ключ(A20) | | | | | ____|____|________| | | | | | | | | 1111 1111 1111 1111 1111 1111 1111 1111 = FFFF'FFFFh = 4 Gb | | | |<--- Шина 20-бит ---->| | |<---------------- Шина 32-бит ------>| Линейная и сегментная адресация ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Любая память имеет линейную структуру. То есть это прямая линия от нуля до 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
|
|
04.11.2016, 23:46 | 3 |
Если попроще, то сегментный регистр указывает - к какому участку памяти (грубо говоря, странице памяти) обращаются команды (типа mov [bx],ax или cmp [1234h],ax).
Зачем? Регистр bx, например (и иже с ним) может принимать значения от 0 до 65535, а памяти обычно немного побольше (1 Мб, например) ![]() Как уже сказано выше, физическая адресация (хотя, я бы её назвал виртуальной, но под ДОС будет физическая) идёт следующим образом: сегмент * 16 + смещение.
1
|
Эксперт Hardware
![]() |
|
08.11.2016, 21:26 | 4 |
Jin X, согласен... Раздул я тему! ТС наверное вообще запутался.. Просто у меня было готово (типа когда-то писАл конспект)
0
|
08.11.2016, 21:26 | |
08.11.2016, 21:26 | |
Помогаю со студенческими работами здесь
4
Собирался покупать gtx 580, но по разным статьям в инете понял, что GTX 760 мощнее? Или я неправильно понял? сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь усложнять? Регистры разных ядер процессора - такое существует? не очень понял про динамическое выделение памяти. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |