Здравствуйте. Прочитав статьи http://www.wasm.ru/series.php?sid=20 с 1 по 5 и узнав ответы на конкурс(знаю давно было) учитель нам задал те же вопросы до дескриптору. Сколько я не читал, я не смог понять по какому принципу находится адрес базы и размер.Возьмем для примера 1 дескриптор ; Линейный адрес базы = 0, линейный адрес лимита = 0 + 1235h = 1235h 1. Descr_code db 34h,12h,00h,00h,00h,XXh,0X000000b,00h Размер находится по такому пути(имхо): берется последние 34h,12h и переделываются в 1234+1=1235h это и будет размер. База: как я понял берется 00h,00h,00h и по аналогии с размером только не прибавляем 1, т.е. 000000 и получается 0. Дальше пойдем 2. Descr_data db 0C8h,0Dh,36h,12h,00h,XXh,0X100000b,00h т.к. здесь 23 бита(считая от конца к началу) G=0(первый бит сначала). Размер:0DC8h+1=0DC9h(первый не берем). База:1236h(по аналогии с 1 дескриптором) Возьмем например 4 дескриптор 4. Descr_code2 db 0DEh,0BCh,01h,20h,10h,XXh,0X001010b,00h Размер:OBCDEh+1=0BCDFh, это если считать по аналогии. Откуда взялся 0ABCDFh?? Вот этого я не понимаю База:102001h. Почему мы берем 13-19 байты(если считать с конца)?? Дальше идем 6. Descr_stack2 db 01h,00h,10h,00h,00h,XXh,0X000001b,10h 7. Descr_LDT db 04h,00h,00h,00h,00h,XXh,1X000000b,20h Обьясните как в этих считать базу и лимит? И самое главное Ошибка во втором дескрипторе: бит 21 во втором двойном слове дескриптора ДОЛЖЕН ВСЕГДА равняться нулю. С какой стороны считать?? Если считать с конца тогда в первых тоже на 21 байте не стоят 0. Обьясните пожайлуста. З.Ы. если создал не в том топике перенесите тему пожайлуста.
Godod Адрес базы - это 32-битное значение. Это значит что можно адресовать 4294967296 байт данных (4 ГБ). Не обращай внимание что все поля базы разбросаны, они собираются и образуют 32-битный адрес. Лимит сегмента - это 20-битное значение. В 20 бит можно уместить 1048576 байт (1 МБ). Но тут есть нюанс: существует в дескрипторе бит гранулярности (G). Если он сброшен (равняется 0), то лимит считается в байтах. Укажешь в лимите 11111111111111111111b, то получишь 1048576 байт (1 МБ). А если бит гранулярности (G) установлен (равняется 1), то лимит измеряется в страничках. Одна страничка равняется 4096 байт (4 КБ). И получается что если ты укажешь в лимите 11111111111111111111b, то получишь 1048576 байт (1 МБ) умноженное на 4096 байт (4 КБ). 1048576 * 4096 = 4294967296 (4 ГБ).
Вот, к примеру, моё описание дескрипторов для глобальной таблицы дескрипторов (GDT): Код (Text): ; ******************************************************************************* ; Д А Н Н Ы Е ; ******************************************************************************* translation_pmode__Data16: translation_pmode__GDTR: dw 8*5-1 dq translation_pmode__gdt translation_pmode__gdt: translation_pmode__descriptor0: dw 0000000000000000b ; Segment Limit(16) dw 0000000000000000b ; Base Address(16) db 00000000b ; Base Address(8) db 00000000b ; P(1), DPL(2), S(1), Type(4) db 00000000b ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4) db 00000000b ; Base Address(8) translation_pmode__descriptor1: dw 1111111111111111b ; Segment Limit(16) dw 0000000000000000b ; Base Address(16) db 00000000b ; Base Address(8) db 10011000b ; P(1), DPL(2), S(1), Type(4) db 11001111b ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4) db 00000000b ; Base Address(8) translation_pmode__descriptor2: dw 1111111111111111b ; Segment Limit(16) dw 0000000000000000b ; Base Address(16) db 00000000b ; Base Address(8) db 10010010b ; P(1), DPL(2), S(1), Type(4) db 11001111b ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4) db 00000000b ; Base Address(8) translation_pmode__descriptor3: dw 1111111111111111b ; Segment Limit(16) dw 0000000000000000b ; Base Address(16) db 00000000b ; Base Address(8) db 11111000b ; P(1), DPL(2), S(1), Type(4) db 11001111b ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4) db 00000000b ; Base Address(8) translation_pmode__descriptor4: dw 1111111111111111b ; Segment Limit(16) dw 0000000000000000b ; Base Address(16) db 00000000b ; Base Address(8) db 11110010b ; P(1), DPL(2), S(1), Type(4) db 11001111b ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4) db 00000000b ; Base Address(8)
Спасибо за обьяснение, но к сожалению Вы не до конца поняли о чем я. Про что сколько может адресовать памяти и какой адрес я понял. Я вам привел пример и почему появляются такие буквы и цифры, а не такие как ожидалось, вот это мне обьясните
Godod Я особо не понял что именно Вас интересует? А то у Вас там такое ужасное форматирование, что глаза ломать не хочется. Конкретно спросите что интересует. Прочитал: И ответил.
Ладно пойдем так Обьясните мне по Вашему, как строится база и размер этого сегмента: 6. Descr_stack2 db 01h,00h,10h,00h,00h,XXh,0X000001b,10h Все по-порядку если можно
Код (Text): dw 0000000100000000b ; Segment Limit(16) dw 0000000000010000b ; Base Address(16) db 00000000b ; Base Address(8) db ????????b ; P(1), DPL(2), S(1), Type(4) db 0?000001b ; G(1), D(1), NULL(1), AVL(1), Segment Limit(4) db 00010000b ; Base Address(8) Получается что базовый адрес 00000000000100000000000000010000b (0x00100010). Лимит 00000001000000000001b (0x00001001), то есть 4097 байт. Бит гранулярности (G) равен 0, так что измеряется лимит в байтах.
Спасибо большое, а теперь не могли бы Вы обьяснить как что находится. Вот так будеь яснее еще 01h=---------b(Base Addres (8)),00h=---------b(Base address(16)) например. Думаю после этого я полностью все пойму
Вы вообще маны интела курили? Там таблички все нарисованы с картинками как формируется линейный адрес. А перевод из шестнадцатеричной в двоичную надо знать еще до изучения программирования как такового.
Вот есть: Не знаю почему, но мне больше по душе, когда там стоят знаки вопроса: И прям подряд всё это можно перевести в двоичный вид (хотя бы через калькулятор операционной системы): Можно взять это всё в один большой 64-битный массив: А теперь можно открыть таблицы из справочника AMD или Intel, и сравнить:
Маны интела не курил, бумагу не курю впринципе. Если есть ссылка дайте пожалуйста почитаю. Все понял как переводить. Спасибо, а мануалы я бы почитал