|
|
|
stm55 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 1.10.2014 Репутация: нет Всего: нет |
Когда программа загружается в память операционной системой (например DOS, но это не важно), то насколько я знаю (может я ошибаюсь?) сама операционная система записывает адрес сегмента кода в регистр CS и соответственно по этим адресам и загружает соответствующую программу. Вопрос, как записать адрес в регистр CS если я загружаю программу в память собственноручно написанным загрузчиком без какой бы то ни было операционной системы?
Я так понял (может я опять ошибаюсь) инструкции вида:
на самом деле ничего в CS не пишут. И ещё, вот такой код:
говорит о том, что регистры cs, ds, ss, es будут иметь одинаковые адреса и стоит записать адрес только в один, а в остальных он появиться автоматически? Если ничего не записал в CS (я так пробовал и всё работало), то сам компилятор ассемблера - например MASM, пишет в CS ноль - хотя это бред скорее всего? Я программу загружал в начало памяти, а в CS ничего не писал и программа, повторяю без операционной системы, работала. Как быть если программа не вмещается в сегмент? Первый момент, как узнать что программа не вмещается в сегмент? Просто компильнуть код и посмотреть поместиться по размеру в 65536 байт (почему не 65535? 65535 + один первый нулевой байт) или нет? Далее, если мне в процессе работы надо прыгнуть на участок кода который находится в другом сегменте кода и он не в начале этого сегмента, при этом такие прыжки мне надо совершать неоднократно по ходу выполнения программы, причём в разные места другого сегмента кода. Как быть? Писать в какой то регистр разные числа, потом в самом начале кода программы который находится в другом сегменте, проверять эти числа и в зависимости какое число прыгать на соответствующий участок кода уже в этом сегменте, так как в регистр IP ничего записать напрямую я не могу? Если это так, то тогда не понятно как быть если программа была загружена операционной системой и выполняется вместе с ней. Откуда программа будет знать по каким адресам загрузили вторую часть её кода находящегося в другом сегменте, что бы этот адрес записать в CS? Когда я сам, гружу две части программы самописным загрузчиком, я знаю по каким адресам я её гружу, поэтому знаю, что записать в CS. Да и ещё, когда я поменял адрес в CS, в IP остаётся ведь прежний адрес, а мне надо выйти как то на начало этого сегмента (имеется ввиду вторая часть моей программы которая не влезла в первый сегмент кода), то есть записать в IP ноль, что бы сделать проверку чисел и в зависимости от этого сделать соответствующий прыжок. Как это сделать? Я так думаю, что делается как то совсем по другому, но как? У форумчан может возникнуть вопрос, зачем мне это надо? Просто хочу до тонкостей разобраться. За любую помощь: ссылки на русскоязычный материал, или просто за объяснение вопроса или какой либо его части, буду благодарен! Сам я перерыв интернет на эти вопросы ответа так и не нашёл, поэтому пришлось обратиться за помощью к форумчанам, (может плохо искал). |
||||
|
|||||
iff |
|
|||
Администратор Профиль Группа: Участник Сообщений: 949 Регистрация: 23.3.2007 Репутация: 5 Всего: 16 |
Да, assume это директива ассемблера, не инструкция процессора. Регулирует как по умолчанию транслируется обращение к данным, объявленным в том или ином сегменте, в операнд инструкции процессора.
Да, cs можно поменять, например инстр. mov; но не нужно. См. разновидности jmp и call; short, near, far переходы. ОС действительно значения не имеет, но имеет значение режим. Это код для реального 16-разрядного режима, в котором (без расширений) работает DOS. Современные многозадачные системы работают в защищенном режиме, 32/64 битном. И там именно такой сегментной модели нет. Запросто в программе нигде может не упоминаться ни один сегментный регистр. Адресуется память одним 32/64 разрядным числом, без сегмента. Кстати, и сами эти сегментные адреса весьма условны, физ. адрес соответствует сегмент × 10H + смещение. -------------------- DOS... Синей пеленой экран заполнил чистый DOS Мышь... Стала вдруг квадратной, потеряла форму мышь... Я разбил окно, девяностопятое мастдайное окно, И поставил DOS, и тогда увидел: Это счастье, — вот оно. |
|||
|
||||
Правила форума "Asm: Общие вопросы" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |