UAC
833 постов
Карма: 27
#21 29 мая 2009 в 19:34
Цитирую из Wikipedia, формирование физического адреса в 8086: <br />
Поэтому для адресации 1 Мбайт памяти применили следующую схему. На шину адреса подавался физический адрес размером 20 бит, который формировался путём сложения содержимого одного из сегментных регистров (16 бит), умноженного на 16, с содержимым указательного регистра: таким образом, адресация ячейки памяти производилась по номеру сегмента и эффективному адресу ячейки в сегменте (называемому также смещением).
<br /><br />Во всей ассемблерной литературе пишут что физический адрес 20 битный. <br />У меня только не укладывается в голове: <br />16 битный сегментный регистр сдвинутый влево на четыре бита всё равно останется 16 битным! Успешно теряем 4 левых бита... и? <br /><br />П.С.: Новый дизайн форума - свежо!
Берсеркер
2318 постов
Карма: 216
#22 30 мая 2009 в 20:07
BFG10K<br />Всё гениально просто&nbsp; 8)<br />адрес 20-битный, т.е. в HEX это будет 5 цифр, например FFFFF<br />Считай что мегабайт (1048576 байт) поделён на 65536 параграфов<br />(термин параграф означает кусок памяти в 16 байт).<br />65536 * 16 = 1048576<br />Один и тот же адрес можно представлять разными комбинациями segment:offset<br />Например:<br />FFFFF = FFFF:000F = FFF0:00FF<br />ABCDE = A000:BCDE = AB00:0CDE<br /> ;)<br />Таким гениальным трюком, в далёкие времена, (когда существовал только реальный режим работы процессора и адресация была традиционно 16-битной) смогли расширить адресацию до мегабайта.<br />PS: я даже не забыл адрес в BIOS на перезагрузку компа. Это FFFF0.<br />Обычно писали так: JMP far F000:FFF0<br />Реже писали JMP far FFFF:0000<br />Но это был один и тот же адрес&nbsp; ;)
Машина несла меня через неведомые районы Галактики сквозь пространство математической реальности быстрее скорости света. (C) Фред Саберхаген.
UAC
833 постов
Карма: 27
#23 31 мая 2009 в 07:47
[quote author=Берсеркер link=topic=544.msg11906#msg11906 date=1243714074]<br />BFG10K<br />Всё гениально просто&nbsp; 8)<br />адрес 20-битный, т.е. в HEX это будет 5 цифр, например FFFFF<br />Считай что мегабайт (1048576 байт) поделён на 65536 параграфов<br />(термин параграф означает кусок памяти в 16 байт).<br />65536 * 16 = 1048576<br />Один и тот же адрес можно представлять разными комбинациями segment:offset<br />Например:<br />FFFFF = FFFF:000F = FFF0:00FF<br />ABCDE = A000:BCDE = AB00:0CDE<br /> ;)<br />Таким гениальным трюком, в далёкие времена, (когда существовал только реальный режим работы процессора и адресация была традиционно 16-битной) смогли расширить адресацию до мегабайта.<br />PS: я даже не забыл адрес в BIOS на перезагрузку компа. Это FFFF0.<br />Обычно писали так: JMP far F000:FFF0<br />Реже писали JMP far FFFF:0000<br />Но это был один и тот же адрес&nbsp; ;)<br />[/quote]<br />Я что-то путаюсь: segment_16bit:offset_16bit = segment + offset, то-есть, сумма тоже 16 bit, нет? <br />FFFF:000F = FFFF + 000F = (1)000E ?
willow
570 постов
Карма: 56
#24 31 мая 2009 в 10:00
[quote author=BFG10K link=topic=544.msg11907#msg11907 date=1243756024]<br />Я что-то путаюсь: segment_16bit:offset_16bit = segment + offset, то-есть, сумма тоже 16 bit, нет? <br />FFFF:000F = FFFF + 000F = (1)000E ?<br />[/quote]<br />сумма 20 bit. т.к:<br /><br />segment_16bit:offset_16bit = segment * 10h + offset, т.е.<br />65536 * 16 + 65536 - 16&nbsp; -&gt;&nbsp; это максимально возможное количество адресуемых ячеек памяти в реальном режиме<br /><br />В твоём примере:<br />FFFF:000F = FFFF * 10 + 000F = FFFF0 + 000F = FFFFF<br /><br />Сегментный регистр действительно 16 битный, но сдвиг на четыре бита происходит в формирователе адресов, а не в самом регистре. Сегментный регистр в формирователь физического адреса уже загружается сдвинутым, т.е. с дописанными четырьмя нулями, а далее в невидимом нам формирователе адреса плюсуется смещение. Отсюда берёт свои истоки определение &quot;параграфа&quot;, т.е. данные, выровненные на 16 байт, адрес которых можно задать только сегментным регистром и смещением 0.<br /><br />Однако, всё это имеет лишь познавательную и историческую ценность.
UAC
833 постов
Карма: 27
#25 02 июля 2009 в 14:17
[quote author=willow link=topic=544.msg11908#msg11908 date=1243764037]<br />Сегментный регистр действительно 16 битный, но сдвиг на четыре бита происходит в формирователе адресов, а не в самом регистре. <br />;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />Однако, всё это имеет лишь познавательную и историческую ценность.<br />[/quote]<br />Во, появились неучтённые составляющие... формирователь адресов. <br />Спасибо ;)