Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Ассемблер? Это просто! Учимся программировать


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler (Ассемблер)

Выпуск № 648
от 04.01.2007, 20:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 367, Экспертов: 28
В номере:Вопросов: 2, Ответов: 3


Вопрос № 69096: Здравствуйте уважаемые эксперты. Помогите написать небольшую программу переводящую процессор из реального режима в защищенный. Привожу код, программа загружается со второго сектора флоппи, непосредственно из биоса и загружает ее программа неходящааяс...
Вопрос № 69141: Ув. эксперты! Подскажите, почему при запуске под отладчиком прога работает прекрасно, а при запуске из командной строки выдаёт управляющие символы ASCII и псевдографику? Программа должна выводить на экран вещественное число. Ком...

Вопрос № 69.096
Здравствуйте уважаемые эксперты. Помогите написать небольшую программу переводящую процессор из реального режима в защищенный. Привожу код, программа загружается со второго сектора флоппи, непосредственно из биоса и загружает ее программа неходящааяся на первом секторе, и комп перегружается.
Вопросов несколько - при переходе в защищенный режим после команд
mov EAX,cr0;
or eax,1;
mov cr0,eax;
объясните как процессор переходит на следующую команду, ведь если он уже работает в защищенном режиме значит он обращается к памяти через gdt_null, так как cs = 0, что и вызывает ошибку. По моему тоже самое должно происходить при переходе в реальный режим, только без ошибки. Просто вычитал этот код в одной книге и стало интересно. Подскажите что вообще не правильно сделал и как правильно перевести проц в защищенный режим?

Приложение:

Отправлен: 30.12.2006, 01:56
Вопрос задал: RIV (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: ramok
Здравствуйте, RIV!

Очень резонный вопрос Ж:-)
Все дело в так называемых теневых регистрах(shadow register). Дело в том что при каждом обращении к памяти, процессор не вычисляет все значения через gdt или ldt как можно было бы подумать(представьте себе накладные расходы такого варианта). Вычисления происходят только при изменения значения сегментных регистров(cs, ds, ss....), а вычесленная информация заностится в теневые регистры.
В них хранится база, лимит и права доступа.

Так что когда вы меняете cr0, то вычисление адреса по прежнему происходит из теневых регистров пока вы не изменяете сегментный регистр.

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

2. Если вы решили изменить дескриптор какого то либо сегмента, то для того что бы изменения занеслись в сегментный регистр, вам нужно перезагрузить соответствующий сегментный регитр.

Дополнительную информацию можно найти в поисковых системах интернет по запросу "теневые регистры защищенный режим"
Ответ отправил: ramok (статус: 4-ый класс)
Ответ отправлен: 30.12.2006, 02:45
Оценка за ответ: 5


Вопрос № 69.141
Ув. эксперты!

Подскажите, почему при запуске под отладчиком прога работает прекрасно, а при запуске из командной строки выдаёт управляющие символы ASCII и псевдографику?

Программа должна выводить на экран вещественное число.
Компилятор TASM

Приложение:

Отправлен: 30.12.2006, 15:48
Вопрос задал: Олег Владимирович (статус: 9-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 5)

Отвечает: Брона Вячеслав
Здравствуйте, Олег Владимирович!

Все дело в том, что Вы не инициализировали значения сегментов DS и ES.
Добавьте в начало программы
push DS
push ES
mov AX, SEG RES
mov DS,AX
mov ES,AX

и в конец:
pop ES
pop DS

Все остальное вроде правильно.
Дело в том, что отладчик "помогает", инициализируя DS и ES сегменты.
Ответ отправил: Брона Вячеслав (статус: 2-ой класс)
Ответ отправлен: 02.01.2007, 13:42
Оценка за ответ: 2

Отвечает: QDSota
Здравствуйте, Олег Владимирович!

1. Команда enter 4,0 освобождает 4 байта по чуть другим адресам (bp уже равно sp-2): в данном случае первую двойку вычитать не надо, необходимо использовать адреса для переменных [bp] и [bp-2]... То есть - самое простое - все строки "word ptr[bp-4]" заменить на "word ptr[bp]"
2. Нужно изменить строку "outp2: fild dword ptr [bp-2]" на "outp2: fild word ptr [bp-2]" - число 2-хбайтовое...
---------
Открыть глаза навстречу солнцу
Ответ отправил: QDSota (статус: Профессионал)
Россия, Зеленоград
Тел.: 8-916-53-43-916
ICQ: 84611301
----
Ответ отправлен: 03.01.2007, 12:08
Оценка за ответ: 2


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.38 от 20.12.2006
Яндекс Rambler's Top100

В избранное