Привет, делаю код для создания тождественной таблицы преобразования, но он почему то виснет. Картина такая - есть битовый массив, установленый бит в массиве говорит о том что страницу можно юзать, полная физическая база массива в регистре edi; есть последний установленый бит в битовом массиве, он находится в edx; в eax стартовое значение страницы памяти из массива битов, которое будет проверяться - можно ли в нём создать PTE таблицу; в ebx смещение для битового массива для создания PTE и есть база PDE каталога в еsi. Ко всем этим данным обращаюсь через дескриптор с базой 0 и лимитом максимальным. Вот этот код (ещё на всякий случай дополнительно креплю весь исходник): cr_PDE_PTE: ; создание тождественной таблицы преобразования xor ebx, ebx ; начальное смещение в битовом массиве mov eax, 110h ; первая страница для поиска элемента PTE (стартовая) cr_t: cmp eax, edx ; страница больше максимальной страницы? ja yes_maks_page ; переход если больше (если больше максимальной страницы) bt es:[edi], eax ; проверим, можно ли использовать страницу для таблицы PTE? jc page_ok ; переход, если страницу можно использовать под таблицу PTE inc eax ; поиск следующей страницы для таблицы PTE jmp cr_t page_ok: ; страница подходит для таблицы PTE bts es:[edi], eax ; установим бит в массиве битов, так как страницу больше нельзя использовать, потому что страница будет таблицей PTE mov ebp, eax ; сохраним shl eax, 12 ; создадим физ адр страницы ; AVL 00 D A 00 U R P or ax, 0000000000000011b ; установим биты для PDE элемента mov es:[esi], eax ; передадим в таблицу PDE её элемент (физ адрес и биты AVL 00 D A 00 U R P таблицы PTE) and ax, 1111111111111100b ; обнулим биты и это будет физ адр таблицы PTE mov ecx, 1024 ; организуем цикл в 1024 раза для создания таблицы PTE cr_t_PTE: cmp ebx, edx ; максимальная страница? ja yes_maks_page ; переход если больше (если страница больше максимальной) bt es:[edi], ebx ; проверить байт в битовом массиве jc page_os ; переход, для настройки страницы доступной ос (которую можно юзать) shl ebx, 12 ; создать физ адр страницы ; AVL 00 D A 00 U R P or bx, 0000001000000011b ; установить биты элемента PTE не доступного для ос (страницу которую нельзя юзать, бит 9=1) wr_PTE: mov es:[eax], ebx ; передать элемент PTE в таблицу PTE (база сегментного регистра должна быть 0) shr ebx, 12 ; преобразовать для дальнейшего использования в качестве смещения в битовом массиве inc ebx ; следующая страница add eax, 4 ; следующий элемент таблицы PTE ; цикл, пока не встретиться страница больше максимальной или пока не заполнится таблица PTE (1024 элемента) loop cr_t_PTE add esi, 4 ; следующий элемент в таблице PDE mov eax, ebp ; поиск в битовом массиве следующей страницы для таблицы PTE inc eax jmp cr_t page_os: shl ebx, 12 ; создать физ адр страницы ; AVL 00 D A 00 U R P or bx, 0000000000000011b ; установить биты элемента PTE доступного для ос (страницу которую можно юзать, бит 9=0) jmp wr_PTE yes_maks_page: Без этого кода всё работает, подскажите пожалуйста ошибку.
Привет всем ещё раз! Мне нашли две ошибки (add eax, 32 ; следующий элемент таблицы PTE - нужно +4, и тоже самое с add esi, 32 ; следующий элемент в таблице PDE - нужно +4) но обнаружились другие, такие как виснет при выходе в дос, а также ребутится если задать стартовую страницу 110h (это было сделано с целью не разрушать нимемсис). В посте выше исправил ошибки те что обнаружены, может кто то ещё подскажет? А также файлы заменил, теперь код ребутиться, в коде стартовая страница 110h
Привет всем, сразу благодарю за помощь Садко! Выше приведённый код по созданию тождественной таблицы преобразования работоспособен, но в бою ещё не проверен. Комп ребутиться потому что разрушаются структуры дос, поэтому нужно запускать в чистом досе, что бы никто не юзал верхнюю память, попробывал на чистом дос 6.22 - всё работает. Ну и всем кто обратил внимание - большое спасибо.
Ещё раз всем привет! Обнаружил ещё один прикол, код работает, вернее выходит в дос нормально если загружен химем сис, а без него виснет где то на моv ax, 4c00h int 21h !!! А с химем сис всё ок! Кто знает в чём дело?