что оператор: делает в сборке? - PullRequest
1 голос
/ 19 августа 2011

что оператор: делает в сборке?в коде вроде: DS:DX я не нашел никакой документации для этого оператора.(я использую NASM)

Ответы [ 2 ]

5 голосов
/ 19 августа 2011

На самом деле это просто разделитель регистров, а не оператор. Это означает использование регистра DX в качестве смещения от базы регистров сегмента DS.

То, что на самом деле дает вам в качестве адреса, зависит от того, в каком режиме вы работаете (реальный или защищенный).

Например, в реальном режиме регистр сегмента умножается на шестнадцать и добавляется в регистр смещения, чтобы получить 20-битный физический адрес. Если DS равно 0x1234, а DX равно 0x5678:

  12340
+ 05678
  -----
  179B8

В защищенном режиме DS является в действительности сегментом селектор , который используется для поиска базового адреса для памяти в таблице, а затем добавляет его в регистр смещения для получения значения.

Это значение неизменно является виртуальным адресом, который отображается на физический адрес модулем управления памятью (MMU) после того, как соответствующая виртуальная память выгружается из внешнего хранилища.

2 голосов
/ 19 августа 2011

Оператор : отличает регистр / селектор сегмента от регистра общего назначения и указывает, в каком сегменте получить доступ к значению регистра. Так, например,

DS:DX

означает в 16-битном реальном режиме доступ к 16-битному значению в смещении регистра DX от значения сегмента DS, которое увеличивается на 16-байтовые значения (т. Е. Разница между значениями сегмента 0x0000 и 0x0001 представляет 16-байтовое смещение). Так, например, если значение в DS было 0xA000, а значение в DX было 0xFF, то вы будете обращаться к значению 0xA00FF.

В 32-битном защищенном режиме селектор сегмента представляет значение 16-битного дескриптора, где биты 3-15 используются в качестве смещения поиска в таблице глобальных дескрипторов ЦП или в таблице локальных дескрипторов, которая содержит информацию о 32 диапазон адресов -битных сегментов, а также разрешения доступа на уровне кольца для этого сегмента (т. е. на уровне ядра, на уровне пользователя и т. д.). Биты 0-1 представляют уровень привилегий запроса, который не позволяет процессу пользовательского уровня загружать значение сегментирования с более высоким разрешением. Бит 2 является флагом, который при очистке означает поиск сегмента в GDT, или, если установлен, означает смещение в LDT. Например, значение DS 0x0010 будет означать поиск третьего слота в GDT с уровнем привилегий запроса 0 (т. Е. Вам нужно будет находиться в режиме уровня ядра, чтобы установить это значение). Значение в DX будет тогда смещено от начала диапазона адресов, установленного для этого конкретного сегмента в GDT.

...