сегментация памяти в 8086

Если внешняя память (1 МБ) в системе на базе 8086 разделена на код, данные, стек и дополнительные части, которые составляют 64 КБ, что мы делаем с остальной памятью? Это идет впустую?

Используйте разные сегменты и меняйте их по мере необходимости. Добро пожаловать в 1980-е!
Навевает воспоминания (каламбур) ;)
Кстати, это не внешняя память; это будет 5¼ "винчестер и т. д. ОЗУ является внутренней. Возможно, вы перепутали с расширенной памятью.

Ответы (3)

В 8086 каждый сегмент, да, 64 КБ. Однако эти сегменты могут двигаться.

Вы устанавливаете «указатель сегмента», который определяет, где начинается сегмент. Он действует как смещение адреса, которое добавляется к внутреннему 16-битному адресу счетчика команд (или другого индексного регистра).

Изменение указателей сегментов является тривиальной задачей, поэтому, хотя вы можете получить доступ только к 64 КБ за раз, вы можете перемещать это окно размером 64 КБ по желанию, чтобы получить доступ ко всему 1 МБ пространства памяти.

Также обратите внимание, что, поскольку 8086 имел 20-битную схему адресации, эти смещения сегментов перекрывались через каждые 16 байтов.

Например, если у вас есть CS по адресу 0x0010 и SS по адресу 0x0011, [CS]:[0x0010] = [SS]:[0x0000]

см.: http://en.wikipedia.org/wiki/Intel_8086#Сегментация

Номер сегмента определяет место в памяти. Сегмент 0 начинается с физического адреса 0 памяти. Сегмент 1 начинается с 0x10 байт от начала, сегмент 2 с 0x20 и т. д.

Да, сегменты начинаются с 0x10 байт, но имеют длину 64 КБ, что означает, что они сильно перекрываются.

Существуют сегментные регистры: CS (сегмент кода), DS (сегмент данных), SS (сегмент стека) и ES (дополнительный сегмент). Побайтовые адреса получаются с помощью регистров указателей: IP (указатель инструкций), SP (указатель стека) и BP (базовый указатель).

Текущая выполняемая инструкция находится в CS:IP (номер сегмента от смещения байтов CS + IP).

Если вы работаете с данными без явного указания сегмента, по умолчанию используется DS (по крайней мере, в нотации Турбо Ассемблера). Например:

mov cx, [bp]

такой же как:

mov cx, ds:[bp]

Я не уверен в точном синтаксисе (это было около 15 лет назад с тех пор, как я его использовал).

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

mov ax, 100h
mov ds, ax

Итак, чтобы загрузить слово с физического адреса 0x105 в BX, вы можете сделать это следующим образом:

xor ax, ax  ; equal to mov ax, 0 but faster
mov ds, ax
mov ax, 105h
mov bx, [ax]

или, используя другой сегмент:

mov ax, 10h
mov ds, ax
mov ax, 5
mov bx, [ax]
Адреса памяти, которые включают смещение [BP], используют регистр SS, а не DS; действительно, я думаю, что префиксы сегментов игнорируются в инструкциях, использующих эти режимы адресации на 8088, поэтому они всегда будут использовать SS, даже если указан другой префикс сегмента.
Вы правы насчет BP — регистр сегмента по умолчанию для него — SS. Однако DS остается по умолчанию для AX, BX, CX, DX и, конечно же, для SI, о котором я забыл упомянуть. Есть также DI, который назначен ES, если я хорошо помню (по крайней мере, в инструкциях movsb/movsw).
На 8086 имеется 24 режима адресации вида base+disp+ofs, где base ничего не значит, BX или BP; disp — это ничего, SI или DI, а ofs — это 0, 1 или 2 байта. Три трехсторонних выбора дадут 27 возможностей, но для режима [ничего+ничего+из] требуется 2-байтовое смещение, а для [BP+ничего+из] требуется 1- или 2-байтовое смещение. Инструкции STOSB, STOSW, MOVSB ​​и MOBSW сохраняются в ES:DI; это единственные инструкции, которые используют ES по умолчанию (и они не могут использовать какой-либо другой сегмент).
Это не какая-то ассемблерная нотация dsпо умолчанию — это то, как работает набор инструкций. А именно, если вы переопределяете сегмент, ассемблер сгенерирует соответствующий префикс переопределения сегмента, в противном случае он генерирует инструкцию без префикса, и это фактически делает dsзначение по умолчанию (для инструкций, которые подчиняются этому принципу).
Кроме того, ваше использование axошибочно. Нет такого режима адресации, как [ax]. Вы можете либо использовать [eax]начиная с i386, либо ограничиться [bx+si], [bx+di], [bp+si], [bp+di], [si], [di], [bp], [bx].