Форум программистов, компьютерный форум, киберфорум
ОС на Assembler
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
3 / 2 / 4
Регистрация: 10.05.2008
Сообщений: 148
1

Запись адреса в регистр CS

28.10.2018, 00:55. Показов 3252. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Когда программа загружается в память операционной системой (например 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 ноль, что бы сделать проверку чисел и в зависимости от этого сделать соответствующий прыжок. Как это сделать? Я так думаю, что делается как то совсем по другому, но как?

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

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

Сам я перерыв интернет на эти вопросы ответа так и не нашёл, поэтому пришлось обратиться за помощью к форумчанам, (может плохо искал).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.10.2018, 00:55
Ответы с готовыми решениями:

Поместить в регистр значение половины адреса переменной
как правильно поместить значение в регистр? .data VisibilityIndex dw matrixymm * summesh dup...

Запись в регистр сведений. Ошибка: Запись не верна
Добрый день, подскажите плз в чем может быть проблема, форма открывается регистра сведений, выдает...

Сегментный регистр DS, CS, данные копируются из одного и того же адреса
ребята, скажите почему я ставлю 'mov ds адрес', и 'mov cs адрес' копируются данные из одного и того...

Запись. Известны фамилии,адреса и телефоны 25-ти человек. Найти фамилии и адреса людей, чей телефон начинается с цифры 3
1)Известны фамилии,адреса и телефоны 25-ти человек,Найти фамилии и адреса людей,чей телефон...

3
Ушел с форума
Автор FAQ
16281 / 7605 / 1066
Регистрация: 11.11.2010
Сообщений: 13,618
28.10.2018, 03:09 2
v4567,
а есть ли у процессора i8080/8085/KP580 регистры cs, ds, ss, es? Существует ли у i8080/8085/KP580 сегментная организация памяти? Или при написании загрузчика тип микропроцессора не важен? Просто настораживает фраза
Цитата Сообщение от v4567 Посмотреть сообщение
Просто хочу до тонкостей разобраться
и при этом
Цитата Сообщение от v4567 Посмотреть сообщение
Сам я перерыв интернет на эти вопросы ответа так и не нашёл, поэтому пришлось обратиться за помощью к форумчанам, (может плохо искал).
Обычно, так пишут за один день до пересдачи экзамена...

Да и для обсуждение тонкостей работы "загрузки программы в память собственноручно написанным загрузчиком без какой бы то ни было операционной системы?" больше подходит раздел "ОС на Assembler"
1
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
29.10.2018, 03:50 3
Цитата Сообщение от v4567 Посмотреть сообщение
Я так понял (может я опять ошибаюсь) инструкции вида:
Код
PROG segment assume cs:PROG
на самом деле ничего в CS не пишут.
Это вообще не инструкции, а директивы, а директивы являются описаниями, информацией для принятия ассемблером к сведению и они не исполняются и делать ничего не делают.
Цитата Сообщение от v4567 Посмотреть сообщение
И ещё, вот такой код:
Код
PROG segment assume cs:PROG, ds:PROG, ss:PROG, es:PROG
И это тоже никакой не код. Это описания, которые ничего не делают и делать не могут. Это всего-лишь "Ассемблер, сцуко, имей ввиду что ...". Assume это по аглицки и есть "полагай, имей ввиду".

Добавлено через 13 минут
Цитата Сообщение от v4567 Посмотреть сообщение
что регистры cs, ds, ss, es будут иметь одинаковые адреса
А у регистров есть адреса ?
Цитата Сообщение от v4567 Посмотреть сообщение
Когда программа загружается в память операционной системой (например DOS, но это не важно), то насколько я знаю (может я ошибаюсь?) сама операционная система записывает адрес сегмента кода в регистр CS
Цитата Сообщение от v4567 Посмотреть сообщение
Я программу загружал в начало памяти, а в CS ничего не писал и программа, повторяю без операционной системы, работала.
Какие мистическое представление о роли операционной системы. Когда на процессор подается питание, то аппаратно в регистр CS записывается F000, в регистр IP записывается FFF0 и понеслась. Процессор дальше работает так как должен работать процессор. Операционной системы еще нет, она еще не загружена, а значение в CS уже есть и процессор работает.
Цитата Сообщение от v4567 Посмотреть сообщение
Просто хочу до тонкостей разобраться.
Тебе просто лень учебник читать и ты решил пойти по пути наименьшего сопротивления ? Вопросы-то такие, что на них невозможно отвечать. Всюду видно, что ты слышал какой-то звон, да не знаешь где он.
2
4165 / 1817 / 216
Регистрация: 06.10.2010
Сообщений: 4,074
29.10.2018, 16:22 4
Просто хочу до тонкостей разобраться.
Похоже ты уже 10 лет пытаешься разобраться с программированием под MS-DOS.

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


на самом деле ничего в CS не пишут.
assume - это не инструкция а директива, она не переводится в машинный код, но влияет на результат ассемблирования последующих команд.

а мне надо выйти как то на начало этого сегмента (имеется ввиду вторая часть моей программы которая не влезла в первый сегмент кода), то есть записать в IP ноль, что бы сделать проверку чисел и в зависимости от этого сделать соответствующий прыжок. Как это сделать?
Ну вот допустим инструкция
Assembler
1
jmp far 12:30
запишет в CS 12, а в IP 30.

А лучше открой мануал и почитай про jmp в реальном режиме.
1
29.10.2018, 16:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.10.2018, 16:22
Помогаю со студенческими работами здесь

Запись в регистр сведений из C#
Здравствуйте имею такой код public void RecordAttendance(List<Studen> studentList) { ...

Запись в регистр не работает
Пока ЭтотОбъект.Родитель <> Справочники.сбз_РазрешительныеДокументы.ПустаяСсылка() Цикл ...

Запись в регистр накопления
Добрый день! Нужна помощь! Упаковочный лист нужен для отображения товаров в пути. Добавление в...

Запись из обработки в регистр
Всем добрый день. Мне необходим совет. У меня возникла необходимость записи в регистр сведений...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru