Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > запись адреса в регистр CS


Автор: stm55 28.10.2018, 00:48
Когда программа загружается в память операционной системой (например DOS, но это не важно), то насколько я знаю (может я ошибаюсь?) сама операционная система записывает адрес сегмента кода в регистр CS и соответственно по этим адресам и загружает соответствующую программу. Вопрос, как записать адрес в регистр CS если я загружаю программу в память собственноручно написанным загрузчиком без какой бы то ни было операционной системы?

Я так понял (может я опять ошибаюсь) инструкции вида:
Код
PROG segment
assume cs:PROG

на самом деле ничего в CS не пишут.

И ещё, вот такой код:
Код
PROG segment
assume cs:PROG, ds:PROG, ss:PROG, es:PROG

говорит о том, что регистры cs, ds, ss, es будут иметь одинаковые адреса и стоит записать адрес только в один, а в остальных он появиться автоматически? 

Если ничего не записал в CS (я так пробовал и всё работало), то сам компилятор ассемблера - например MASM, пишет в CS ноль - хотя это бред скорее всего? Я программу загружал в начало памяти, а в CS ничего не писал и программа, повторяю без операционной системы, работала.

Как быть если программа не вмещается в сегмент? Первый момент, как узнать что программа не вмещается в сегмент? Просто компильнуть код и посмотреть поместиться по размеру в 65536 байт (почему не 65535? 65535 + один первый нулевой байт) или нет?

Далее, если мне в процессе работы надо прыгнуть на участок кода который находится в другом сегменте кода и он не в начале этого сегмента, при этом такие прыжки мне надо совершать неоднократно по ходу выполнения программы, причём в разные места другого сегмента кода. Как быть? Писать в какой то регистр разные числа, потом в самом начале кода программы который находится в другом сегменте, проверять эти числа и в зависимости какое число прыгать на соответствующий участок кода уже в этом сегменте, так как в регистр IP ничего записать напрямую я не могу? Если это так, то тогда не понятно как быть если программа была загружена операционной системой и выполняется вместе с ней. Откуда программа будет знать по каким адресам загрузили вторую часть её кода находящегося в другом сегменте, что бы этот адрес записать в CS? Когда я сам, гружу две части программы самописным загрузчиком, я знаю по каким адресам я её гружу, поэтому знаю, что записать в CS.   

Да и ещё, когда я поменял адрес в CS, в IP остаётся ведь прежний адрес, а мне надо выйти как то на начало этого сегмента (имеется ввиду вторая часть моей программы которая не влезла в первый сегмент кода), то есть записать в IP ноль, что бы сделать проверку чисел и в зависимости от этого сделать соответствующий прыжок. Как это сделать? Я так думаю, что делается как то совсем по другому, но как?

У форумчан может возникнуть вопрос, зачем мне это надо? Просто хочу до тонкостей разобраться.

За любую помощь: ссылки на русскоязычный материал, или просто за объяснение вопроса или какой либо его части, буду благодарен!

Сам я перерыв интернет на эти вопросы ответа так и не нашёл, поэтому пришлось обратиться за помощью к форумчанам, (может плохо искал).

Автор: iff 13.11.2020, 11:24
Да, assume это директива ассемблера, не инструкция процессора. Регулирует как по умолчанию транслируется обращение к данным, объявленным в том или ином сегменте, в операнд инструкции процессора.
Да, cs можно поменять, например инстр. mov; но не нужно. См. разновидности jmp и call; short, near, far переходы.
ОС действительно значения не имеет, но имеет значение режим. Это код для реального 16-разрядного режима, в котором (без расширений) работает DOS. Современные многозадачные системы работают в защищенном режиме, 32/64 битном. И там именно такой сегментной модели нет. Запросто в программе нигде может не упоминаться ни один сегментный регистр. Адресуется память одним 32/64 разрядным числом, без сегмента. Кстати, и сами эти сегментные адреса весьма условны, физ. адрес соответствует сегмент × 10H + смещение.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)