Anonymous
я же в дескрипторе указал что все счисляется в страницах
s54820
я же в дескрипторе указал что все счисляется в страницах
Это ты про G? Он только на размер сегмента влияет. А размер сегмента нужен, чтобы процессор мог тебя стукнуть, если ты за пределы сегмента вылезешь. Ты не вылезаешь. Но память от этого не появится. Или если там девайс какой-нибудь висит. Ты можешь расчитывать только на первый мегабайт более-менее, всё остальное нужно тестить.
Anonymous
можно посмотреть в 40:13
Anonymous
это ячейка bios которая позволяет посмотреть сколько всего есть физической памяти
Anonymous
или 0:413
s54820
или 0:413
Это как раз про тот самый мегабайт. Если ты под древние машины не пишешь, у тебя он по определению есть, можно не смотреть.
Anonymous
да у меня есть
Anonymous
у меня 4 гб есть)
Anonymous
я так специально поставил по середине
Anonymous
а с выводом что не так
s54820
я так специально поставил по середине
Это совсем не посередине. То, что у тебя есть, не гарантирует, что там внезапно не будет дырки или устройства. Ещё раз: наличие памяти за пределами мегабайта надо тестить.
Anonymous
но если у тебя современное оборудования то нормально
s54820
а с выводом что не так
Ну запусти и увидишь.
Anonymous
запустил работает только сообщение кривое
s54820
запустил работает только сообщение кривое
Оно рисует строку байтов 0xf с атрибутами, прочитанными из string. Скорее всего, ты хочешь наоборот.
Anonymous
я просто в книге вот это увидел
Anonymous
Первый байт - это сам символ, а второй байт - цвет символа и цвет фона. Цвет 4-битный, т. е. максимальное количество цветов - 16. Старшие 4 бита обозначают цвет фона, а младшие 4 бита - это цвет символа
Anonymous
а ну да intel это little endian
Anonymous
и младший бит в ram будет наоборот
s54820
и младший бит в ram будет наоборот
И останется только узнать, что видеокарта не TTY, и ни про какие 0x0a, 0x0d не слышала, это делается программно.
Anonymous
да точно
Anonymous
это просто память
Anonymous
и я туда положил чушь написал
Anonymous
спасибо огромное )
Eugene
in al,0x92 bts ax,1 jc .continue_boot out 0x92,al Зачем так делать? Так никто не делает. Просто: in al,0x92 or al,1 out 0x92,al Если уже выставлен и ты ещё раз выставишь, ничего страшного не будет.
usernameak
кроме лишней операции IO
Eugene
Ну будет лишняя и что с того?
Eugene
mov dx,cs shl edx,4 советую заменить на mov edx,cs shl edx,4 Ибо если вдруг старшая часть edx не обнулена, будет сюрприз.
Anonymous
mov edx,cs такой инструкции
Anonymous
edx 32 бита cs 80 бит
Anonymous
Разница есть?
Anonymous
процессор устроен так что можно загружать только равные по разрчдности за исключением инструкции movzx movsx
Anonymous
Где стоит мультиплексор
Anonymous
Который и позволяет записать на размер больше
Anonymous
Использовать бит расширения инструкции
Eugene
Разница есть?
А когда мы пишем mov dx,cs — это тебя не смущает (типа 80 бит писать в 16)? Ты для начала напиши так и попробуй скомпилить, а потом учи, что можно, а что нет.
Anonymous
Конда мы пишем так то это подрузомивает что мы копируем в 16 битовую чась сегментого регистра
Eugene
Вот именно, а старшая часть при этом обнуляется.
Eugene
Когда пишем edx.
Anonymous
Cs здесь является 16 бит потому что пользователю не доступны 64 бита
Anonymous
как ты можешь 16 бит загружать в 32
Anonymous
Скажи?
s54820
mov dx,cs shl edx,4 советую заменить на mov edx,cs shl edx,4 Ибо если вдруг старшая часть edx не обнулена, будет сюрприз.
По-хорошему это всё вообще можно выкинуть, у нас CS = 0 в данном случае.
Anonymous
64 бита это теневая часть которая хранит в себе дескриптор сегмента это работает для protected и long mode
електр🟢нік ✙🟠рчбеч ඞ
Anonymous
Чтобы процессору не оюращатся по N раз и не делать долгую операцию обрашение к памяти извлечение оон напрямую обращается к теневой части сегмента
s54820
64 бита это теневая часть которая хранит в себе дескриптор сегмента это работает для protected и long mode
Что толку это обсуждать, если последнюю возможность это прочитать убрали вроде бы в 286 ещё?
Eugene
как ты можешь 16 бит загружать в 32
Учите матчасть, товрищ. Intel SDM, том 2B, страница 4-35 инструкция mov. Там написано как в r32 записывается Sreg (подскажка: zero extended).
електр🟢нік ✙🟠рчбеч ඞ
REX.W + 8C /r MOV r16/r32/m16, Sreg Move zero extended 16-bit segment register to r16/r32/r64/m16.
Anonymous
Да проверил был не прав
Anonymous
Извини ты победил
Anonymous
Интересно как ? Это только для сегментых ?
Anonymous
Что это делает инструкция только не надо отсылать в крации
s54820
Учите матчасть, товрищ. Intel SDM, том 2B, страница 4-35 инструкция mov. Там написано как в r32 записывается Sreg (подскажка: zero extended).
А у меня в мануале постарше там ниже в описании «If the register is a destination operand, the resulting value in the two high-order bytes of the register is implementation dependent». И я только что об этом узнал, кстати.
Anonymous
Я тоже узнал
Eugene
Кстати, про CS = 0 есть отдельный прикол. Нет гарантии, что CS = 0 на старте. Как? А вот так, BIOS вполне может загрузить код с CS:IP = 7C0h:0. Вероятно, такие приколы встречаются в старых или ещё каких-то биосах, то это вполне возможная ситуация. Именно поэтому в начале пишут что-то типа jmp 0:7C10h или push 0 / push 10h / retf, что я бы тоже посоветовал сделать, если значение CS должно быть нулевым.
Eugene
Нет, в спеке написано явно 0:7c00. То есть, да, может быть кривой биос, но это его проблемы.
Не знаю, что там в спеке написано, но когда твой код не будет работать где-то, и к тебе придут и скажут: "Кривая твоя прога", — это уже будет твоя проблема, потому как ты будешь сидеть и чесать голову, почему не работает. Все вот эти нюансы нужно знать и по возможности учитывать.
Eugene
Но это уже, конечно, личное дело каждого. Делать всё только в соответствии с документацией или учитывать и суровые реальности...
Eugene
?
Я не понял вопроса.
Anonymous
как работает это инструкция mov r16/32/64,segment register
Anonymous
точнее наоборот
Anonymous
что же загружается в остальные биты
електр🟢нік ✙🟠рчбеч ඞ
🤦‍♂️
Eugene
как работает это инструкция mov r16/32/64,segment register
MOV Sreg,r/m64** Move lower 16 bits of r/m64 to segment register.
Anonymous
а какой смысл если можно просто использовать так mov reg seg,r16/m16
Eugene
а какой смысл если можно просто использовать так mov reg seg,r16/m16
Не знаю. Видимо, суть в том, что просто есть опкод для такого случая. И если ты его закодил, он выполнится так.
Anonymous
Понятно транзисторы и место на кристале тратят попусту
Eugene
Причём, про mov seg,r32 ничего не сказано, хотя nasm компилит такое.
Eugene
Ладно, я ушёл.
Anonymous
Ага
Anonymous
давай)
Eugene
Сейчас, как уже писалось выше, zero extended. Ну вот мы выяснили новые подробности, что до Pentium 4 всё было более грустно.
Eugene
Хотя, возможно, есть смысл почитать поподробнее актуальный ман, возможно, там есть какое-то упоминание. У тебя какой даты издание?