На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> Что я понимаю не так ?
    Вот опять я что-то не понимаю :(
    Допустим, дескриптор, описывающий область экрана:
    - Старшее слово адреса реального сегмента, на который указывает дескриптор
      0B800h

    -  Младшее слово
      0

    -  Байт доступа
      10010010b  (как для сегмента данных)

    -  Предел сегмента
      0FFFFh

    -  Резерв
      0


    Допустим, этот дескриптор шестой по счёту, т.е. обращаюсь к нему как
    0028h (101000)

    Теперь, допустим, нужно в PMode произвести прямую запись в видеопамять,
    как теперь обращаться к нему ? Подозреваю, что после того, как выполнен
    JMP FAR на сегмент кода (тоже описывающийся в GDT) и после того, как
    в DS и SS загружены селекторы, дескрипторы которых тоже описаны в GDT,
    можно сделать хотя бы такой примитивный шаг:

    mov ax, 0028h ; селектор, соот. экрану
    mov es, ax
    xor di, di
    mov ax, <что-нибудь>
    STOSW

    Но это не работает :(
    ЧТО Я ПОНИМАЮ ЗДЕСЬ НЕ ТАК ????
      Эээ.... Может я что-то не то сказал  ???
        Во-первых проверь, чтобы сегмент данных имел право на запись (не помню как это выглядит в битах). Во-вторых линейный адрес видеопамяти 0xB8000 !!! то есть младшее слово = 0x8000 и старшее 0xB !!! По-моему так, хотя я давно с этим не возился
          > Во-первых проверь, чтобы сегмент данных имел право на запись

          А я написал, что байт доступа 10010010b  - соответствует сегменту данных и значит имеет право на запись.

          > Во-вторых линейный адрес видеопамяти 0xB8000 !!!

          Новость !
            Из того что сегмент - данные не следует, что он имеет право на запись !!! Т.е. сегмент данных может быть только для чтения, а может быть чтение/запись. Для кода аналогичный флажок вроде бы значит подчиненный сегмент или нет
              Да, я неправильно вырпазился. В этом не прав. Сегмент данных тоже можно защитить от
              записи.
              Сообщение отредактировано: Ilyia -
                Цитата


                ;*******************************************************************************
                ;Дескриптор сегмента
                ;*******************************************************************************
                SEG_DESCRIPTOR      STRUC
                 segd_wLimit_0_15    DW     ?
                 segd_wBase_0_15    DW     ?
                 segd_bBase_16_23   DB      ?
                 segd_bAR               DB      ?     ;бит 0    = Accessed
                                                             ;биты 1-3 = Type
                                                             ;бит 4    = System
                                                             ;биты 5-6 = DPL
                                                             ;бит 7    = Present
                 segd_bLimit_16_19   DB      ?     ;биты 0-3 = Limit (биты 16-19)
                                                             ;бит 4    = Available
                                                             ;бит 5    = Reserved
                                                             ;бит 6    = DefaultSize
                                                             ;бит 7    = Granularity
                 segd_bBase_24_31   DB      ?
                SEG_DESCRIPTOR      ENDS



                В твоем случае
                segd_wLimit_0_15 = 0FFFFh
                segd_wBase_0_15 = 8000h
                segd_bBase_16_23 = 0Bh
                segd_bAR = 10010010b
                segd_bLimit_16_19 = 0 (16-ный код) или 01000000b (32-ный код)
                segd_bBase_24_31 = 0

                Кроме того, ты должен сбросить старший бит в регистре CR0, чтобы механизм трансляции страниц был отключен и, соответственно, физический адрес был равен линейному.
                Сообщение отредактировано: rivitna -
                  Как я мог упустить из виду страничную организацию памяти !
                  Но для чего нужно segd_bLimit_16_19 = 0 (16-ный код) или 01000000b (32-ный код)  :-/
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0381 ]   [ 15 queries used ]   [ Generated: 1.05.24, 23:32 GMT ]