Вот мне не понятно, к примеру видеопамять в режиме 03 лежит по физическому адресу B8000, но для обращение к ней мы используем адрес в формате сегмент:смещение, а именно 0b800:0000, я знаю, что физический_адрес=сегмент+смещение=0b800+0000=b800. Несоответсятвие получается. И вообще, если считать, что физический_адрес=сегмент+смещение, то выходит, что данные по адресу 0100:0000 и 0000:0100 совпадают, но это не так: Код (Text): -d 0100:0000 0100:0000 00 00 00 00 00 00 00 00-00 00 00 00 48 00 70 00 ............H.p. 0100:0010 58 01 A7 00 8E 00 80 03-00 00 00 00 FF FF 05 00 X............... 0100:0020 1D 00 17 04 D2 03 00 00-FF FF 00 00 00 00 00 00 ................ 0100:0030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0100:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0100:0050 00 00 00 00 00 00 00 00-00 00 00 00 D9 64 1C 07 .............d.. 0100:0060 83 4D 17 04 FA 05 00 00-00 00 00 00 00 00 00 00 .M.............. 0100:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ -d 0000:0100 0000:0100 8A 04 0E 02 FF 03 0E 02-76 09 0E 02 22 DF 00 C0 ........v..."... 0000:0110 16 E8 00 F0 16 E8 00 F0-16 E8 00 F0 16 E8 00 F0 ................ 0000:0120 16 E8 00 F0 16 E8 00 F0-16 E8 00 F0 16 E8 00 F0 ................ 0000:0130 16 E8 00 F0 16 E8 00 F0-16 E8 00 F0 16 E8 00 F0 ................ 0000:0140 6F EF 00 F0 16 E8 00 F0-16 E8 00 F0 16 E8 00 F0 o............... 0000:0150 16 E8 00 F0 16 E8 00 F0-16 E8 00 F0 16 E8 00 F0 ................ 0000:0160 16 E8 00 F0 16 E8 00 F0-16 E8 00 F0 16 E8 00 F0 ................ 0000:0170 04 07 22 D5 16 E8 00 F0-16 E8 00 F0 16 E8 00 F0 .."............. -q Не понямаю, как происходит адресация памяти в таких случаях
Изначально (i8086) адресация (шина адреса) была 20-битная. Сегментный регистр добавляет по сути 4 бита к 16-битному смещению. физический_адрес=(сегмент<<4)+смещение=сегмент*16+смещение. B800:0000=(B800<<4)+0000=B8000+0000=B8000 Данные по адресу 0100:0000 совпадают с 0000:1000 (линейный адрес одинаковый).
Сегмент надо на 1 гекс сдвинуть перед сложением. То есть сегмент*16+смещение. Так что B800:0000 - это адрес B8000. На один шестнадцатиричный 0 длиннее на всякий случай по второму примеру - тут совсем не то, 0:100 - это адрес 100, а 0100:0000 - это адрес 1000. Но вообще всегда есть несколько вариантов представления одного и того же адреса: ... 1200:0300 1210:0200 1220:0100 1230:0000 все приведенное соответствует адресу 12300. Вообще, это в любой книге начиная со старого доброго Абеля можно прочитать.
Может так проще : адрес в сегментом регистре умножаем на 0х10 и все становится на свои места: B800 -> B8000
Взрослые люди! Гуру! (извиняюсь, если кого это слово коробит, не издевки ради..) А взяли и загнобили Одмина!) Да еще в бегиннерсах!) Не стыдно lee?!(